HTTP 代理和 SOCKS5 解决的是同一个问题——在服务器面前替换你的地址——但它们工作在网络栈的不同层级,由此衍生出其他所有差异:它们能转发什么流量、能看到并修改什么、如何处理 DNS 和 UDP,以及究竟兼容哪些程序。与普遍看法相反,速度在这里几乎无关紧要。下面是对两种协议的拆解、一张差异对照表,以及一条能解决十之八九场景的选择法则。

简要概述

  • HTTP 代理懂 HTTP。它读取请求,知道你要去哪里,可以添加请求头、缓存响应或封禁某个地址。对于 HTTPS,它通过 CONNECT 命令进行盲转发。非 HTTP 流量不归它管。
  • SOCKS5什么都不懂,也不想懂。经过一次简短的握手后,它只是双向转发字节:任意协议的 TCP,必要时还有 UDP。里面可以是任何东西——网站、邮件、Telegram、游戏、种子下载。
  • 两者本身都不加密流量。数据保护是内部协议(HTTPS、TLS)的事,而不是代理的事。

各自工作的层级

HTTP 代理位于应用层。客户端向它发送普通的 HTTP 请求,只是第一行带有完整地址(GET http://example.com/page HTTP/1.1),代理自行与服务器建立连接,获取响应并返回给客户端。所有内容都以明文经过它,它有权修改。

对于 HTTPS,机制不同:客户端用 CONNECT example.com:443 命令请求代理建立隧道,代理连接两个套接字,之后只搬运加密字节。它能看到主机名和端口,但看不到路径、请求头和请求体。

SOCKS5(RFC 1928)位置更低——介于传输层和应用层之间。客户端与代理协商认证方式,告知目标地址(IPv4、IPv6 或域名)和端口,代理建立连接,从此刻起成为一根透明的管道。它不知道里面是什么协议,因此能处理任何协议。如果需要温习基础,请先阅读什么是代理服务器这篇文章。

HTTP 代理的运作方式

因为懂协议,它能做什么

  • 缓存。对同一资源的重复请求可能不会到达服务器——企业代理和运营商代理就是这样工作的。
  • 按 URL 过滤。代理能看到地址,可以封禁它、剔除跟踪器或进行重定向。
  • 修改请求头。它可以添加 Via、X-Forwarded-For 或 Forwarded(RFC 7239)——从而暴露你的真实地址。也可以删除多余内容。
  • 认证。用户名和密码通过 Proxy-Authorization 请求头传递,通常采用 Basic 方案——即 Base64 编码,未加密。通过不安全的通道可以看到它们。

它做不到什么

一切非 HTTP 的东西。邮件协议、SSH、游戏服务器、种子客户端、VoIP 要么根本无法通过 HTTP 代理工作,要么要求程序能把连接包装进 CONNECT,且代理允许向任意端口建立此类隧道。许多代理只允许 CONNECT 到 443 端口。

三个匿名等级

由于请求头的原因,HTTP 代理传统上分为三类。透明代理在 X-Forwarded-For 中传递你的真实 IP,并在 Via 中如实表明自己。匿名代理隐藏地址,但保留关于代理的请求头——服务器知道面前是中间人。精英代理不添加任何东西,看起来就像普通客户端。SOCKS5 没有这种分类:它无法访问请求头,从定义上就不会添加任何东西。

SOCKS5 的运作方式

握手

连接开始时,客户端列出支持的认证方法,服务器选择其一:无认证、用户名密码认证(RFC 1929)或 GSS-API。然后客户端发送带有命令、地址类型和端口的请求。命令有三种:CONNECT——普通的出站 TCP 连接,BIND——接受入站连接(例如主动 FTP 需要),UDP ASSOCIATE——开启 UDP 数据报中继。

远程 DNS

与 SOCKS4 的关键区别:目标地址可以传域名,此时由代理而非你的电脑解析域名。在 curl 和 Python 中,这一区别体现在 URL 方案上:socks5:// 在本地解析域名,socks5h:// 在代理端解析。前者把 DNS 请求留在你的运营商那里,后者将它们随流量一起带走。对于不希望暴露地址的任务,需要的就是 socks5h。

UDP

通过 UDP ASSOCIATE 传输的是 TCP 不适合的东西:即时通讯中的语音和视频、DNS、部分游戏协议、QUIC。实际上并非所有服务器和客户端都支持通过 SOCKS5 传输 UDP,因此为此类任务购买代理前需要单独确认。

密码不加密

SOCKS5 中的用户名和密码(RFC 1929 方法)与 HTTP Basic 一样以明文传输。到代理的通道在两者中都不受保护;只有连接内部的 TLS 才能使流量安全。如果服务商提供按 IP 认证,这同样可靠,且不会在程序日志中留下密码。

主要差异一览表

标准HTTP 代理SOCKS5
层级应用层(懂 HTTP)会话层(转发字节)
流量HTTP,HTTPS 通过 CONNECT任意 TCP,可选 UDP
能看到内容HTTP 可见,HTTPS 仅见主机仅见目标地址
能修改请求能(请求头、缓存、过滤)不能
DNS 解析在代理端在代理端(socks5h)或本地(socks5)
加密无(仅内部 HTTPS)无(仅内部协议)
认证Proxy-Authorization,Basic用户名密码(RFC 1929)、GSS-API、无认证
程序支持几乎无处不在广泛但非普遍
开销解析请求头极低

速度:为什么差异不在人们寻找的地方

SOCKS5 不解析请求头也不缓冲响应,因此理论上每个请求能节省微秒级时间。相对于到代理以及从代理到服务器的网络延迟,这无法察觉。真正的速度由四件事决定:到代理服务器以及从它到目标的距离、IP 地址类型(移动和住宅线路比数据中心慢——详见代理类型一文)、具体服务器的负载,以及你并行打开的连接数。这个列表里没有协议。

HTTP 代理明显更快的唯一情况——是在重复内容上使用缓存代理。SOCKS5 明显更快的唯一情况——是那些根本无法通过 HTTP 代理传输的流量。

匿名性与泄露

通过代理泄露地址并非"因为协议",而是因为具体机制,且各有各的原因。

  • 请求头。透明 HTTP 代理在 X-Forwarded-For 中交出你的 IP。通过选择精英代理来解决。SOCKS5 没有这个泄露渠道。
  • DNS。如果域名在本地解析,你的运营商就能看到你访问哪里。HTTP 代理和 socks5h 在自己一端解析;socks5 则不然。
  • WebRTC。浏览器可能通过 STUN 绕过任何代理泄露本地和外部地址。这是浏览器的特性,而非代理的;可通过设置或扩展来关闭。
  • 绕过代理的流量。代理是为应用程序配置的。所有你没配置的东西——系统更新、另一个浏览器、即时通讯——都会直接出去。如果需要覆盖整个设备,那是 VPN 的任务,参见代理、VPN 与 Tor 对比。

软件兼容性

  • 浏览器。Chrome 和 Edge 从系统设置获取代理,两种类型都懂;Firefox 有独立设置,并能通过单独的勾选项"在 SOCKS5 时代理 DNS"。
  • curl。HTTP 用 curl -x http://user:pass@host:port,带远程 DNS 的 SOCKS5 用 curl -x socks5h://user:pass@host:port。
  • Python。在 requests 和 httpx 中 HTTP 代理开箱即用,SOCKS5 需安装额外包;socks5h:// 方案同样将解析切换到代理端。
  • Telegram、Discord、种子客户端、游戏。通常只支持 SOCKS5:它们的流量不是 HTTP。
  • 反检测浏览器和爬虫。两者都支持;移动和住宅代理服务商常常在同一端口上以两种协议提供。
  • SSH。ssh -D 1080 user@server 可通过任何你有权访问的服务器搭建本地 SOCKS5 代理——这是测试程序如何配合 SOCKS5 的便捷方法。

何时选择哪一种

任务选择原因
浏览器、网站操作任意;HTTP 更常见全部流量都是 HTTP(S),支持无处不在
通过 HTTP 库进行爬取HTTP 或 socks5h关键是让代理解析 DNS 且不发送多余请求头
即时通讯、游戏、种子、邮件SOCKS5非 HTTP 流量,有时是 UDP
反检测浏览器中的多账号任意;看 IP 而非协议反欺诈评估的是地址和指纹,而非连接方式
企业网络、管控与缓存HTTP需要按 URL 过滤和记录日志
设备完全隐私两者都不是这是 VPN 或 Tor 的任务
法则:如果程序有"HTTP 代理"字段且只走 HTTP(S)——就选 HTTP。如果程序与网页无关,或只有"SOCKS5"——就选带远程 DNS 的 SOCKS5。争论速度毫无意义。

常见错误

  1. 指望代理提供加密。HTTP 和 SOCKS5 都不保护到代理的流量;只有内部 TLS 才能保护。
  2. 使用 socks5:// 而非 socks5h://,然后到处找 DNS 是从哪里"泄露"的。
  3. 在非 HTTP 程序中配置 HTTP 代理,然后把它的沉默归咎于"代理太差"。
  4. 按速度选择协议。速度由地址和路由决定,一分钟就能测出来——参见如何检测代理的匿名性、泄露与速度。
  5. 认为精英 HTTP 代理比 SOCKS5"更匿名"。两者都不暴露地址;区别仅在于 SOCKS5 连添加它的技术能力都没有。

常见问题

SOCKS5 和 HTTP 代理哪个更快?

在同一台服务器上,相对于网络延迟,差异无法测量。速度由 IP 类型、距离和服务器负载决定,而非协议。

SOCKS5 会加密流量吗?

不会。SOCKS5 原样转发字节;用户名和密码也是明文传输。使流量安全的是连接内部的 TLS,例如 HTTPS。

可以用 HTTP 代理上 Telegram 或下载种子吗?

通常不行:它们的流量不是 HTTP,而大多数 HTTP 代理禁止通过 CONNECT 向任意端口建立隧道。这类程序需要 SOCKS5。

socks5h 与 socks5 有什么区别?

字母 h 表示域名由代理服务器解析。没有它,DNS 请求会从你的电脑经你的运营商发出,目标地址对它可见。

哪种协议更匿名?

精英 HTTP 代理和 SOCKS5 同样不暴露你的地址。透明 HTTP 代理通过请求头暴露它;SOCKS5 没有这种机制。其他泄露——DNS、WebRTC、绕过代理的流量——与协议无关。