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。争论速度毫无意义。
常见错误
- 指望代理提供加密。HTTP 和 SOCKS5 都不保护到代理的流量;只有内部 TLS 才能保护。
- 使用
socks5://而非socks5h://,然后到处找 DNS 是从哪里"泄露"的。 - 在非 HTTP 程序中配置 HTTP 代理,然后把它的沉默归咎于"代理太差"。
- 按速度选择协议。速度由地址和路由决定,一分钟就能测出来——参见如何检测代理的匿名性、泄露与速度。
- 认为精英 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、绕过代理的流量——与协议无关。