SOCKS5 和 HTTP 代理的主要区别在于能承载什么。HTTP 代理使用 HTTP 协议,通过 CONNECT 方法建立 TCP 隧道。SOCKS5 代理工作在更低一层:它能转发任何 TCP 连接,还能转发 UDP,而通话、游戏和 QUIC 都需要 UDP。两者本身都不加密你的流量。
本文详细对比 SOCKS5 和 HTTP 代理:UDP、DNS 与 socks5h、借助 HTTPS 代理和 SOCKS5 over TLS 实现的加密、速度,以及该选哪一个。
SOCKS5 和 HTTP 代理一览
| HTTP 代理 | SOCKS5 代理 | |
|---|---|---|
| 标准 | HTTP CONNECT(RFC 9110) |
RFC 1928 |
| TCP | 是 | 是 |
| UDP | 否 | 是,前提是服务器允许 |
| 由谁解析域名 | 始终是代理 | 你的设备或代理(socks5h) |
| 认证 | 用户名和密码(Basic) | 用户名和密码(RFC 1929) |
| 是否加密 | 否;HTTPS 代理加了 TLS | 否;SOCKS5 over TLS 为 TCP 加了 TLS |
| 能否读取明文 HTTP 请求 | 能,在转发模式下 | 否 |
| 常见端口 | 8080、3128 | 1080 |
| iOS“设置”是否内置 | 是,按无线局域网设置 | 否 |
HTTP 代理的工作原理
HTTP 代理能理解网页请求。它有两种工作方式:
- 转发。 对于普通的
http://页面,浏览器把整个请求发给代理,由代理去获取页面。代理能看到并修改所有内容。 - 隧道。 对于其他所有流量(包括每一个 HTTPS 网站),客户端发送
CONNECT请求,代理打开一条原始的 TCP 隧道:
CONNECT example.org:443 HTTP/1.1
Host: example.org:443
Proxy-Authorization: Basic YWxpY2U6czNjcmV0
代理回复 200 后,客户端就通过这条隧道与网站进行 TLS 通信。代理只能看到目标名称和端口。注意,Proxy-Authorization 这一行不过是 alice:s3cret 的 Base64 编码,所以在普通 HTTP 代理上,路径上的任何人都能读出你的密码。
SOCKS5 代理的工作原理
SOCKS5 是一种小巧的二进制协议,并不关心你通过它发送什么。客户端先向服务器打招呼,协商认证方式,然后发送以下三种命令之一:
- CONNECT 建立到 IPv4 或 IPv6 地址、或某个域名的 TCP 连接。
- UDP ASSOCIATE 在另一个端口上建立 UDP 转发。
- BIND 接受一个传入连接,少数老协议(如主动模式 FTP)会用到。
由于 SOCKS5 从不查看流量内容,它适用于任何 App,而不仅仅是浏览器。
UDP:实际使用中最大的区别
语音和视频通话、很多网络游戏、DNS,以及 HTTP/3 底层的传输协议 QUIC 都使用 UDP。HTTP 代理只承载 TCP。虽然有一个较新的标准 CONNECT-UDP,但支持它的代理很少。
SOCKS5 可以转发 UDP,但前提是服务器开启了这项功能,而且防火墙放行了 UDP 端口。很多服务商并不开启,所以依赖它之前请先确认。
当 UDP 无法经过代理时,会出现以下两种情况之一:
- App 退回到 TCP。浏览器通常会从 QUIC 切换到 HTTP/2,所以网站仍能打开。
- UDP 流量直连,或者直接失败。直连的 UDP 会使用你的真实 IP 地址,如果你用代理是为了隐私,这一点就很重要。
DNS:远程解析与 socks5h
在连接 example.org 之前,总得有人先查出它的 IP 地址。
- HTTP 代理总是在
CONNECT请求中收到域名,并自行解析。 - SOCKS5 客户端既可以在本地解析域名后发送 IP,也可以直接发送域名,交给服务器解析。后一种方式叫远程 DNS,curl 等工具把它写作
socks5h://。
通常你想要的就是远程 DNS。你的本地网络看不到你查询了哪些域名,而且你拿到的解析结果与代理所在地区相符,这对区分地区的网站很重要。Potatso 对 TCP 连接总是发送域名,所以 socks5:// 和 socks5h:// 链接效果相同。见 SOCKS5 参考。
加密:HTTPS 代理与 SOCKS5 over TLS
普通的 HTTP 和 SOCKS5 代理在你和代理之间以明文传输一切,包括你的代理密码和你访问的网站名称。HTTPS 网站仍然是端到端加密的,但明文 HTTP 流量就不是了。
有两种变体在你和代理之间加上了 TLS:
- HTTPS 代理是通过 TLS 访问的 HTTP 代理。所有内容(包括
CONNECT请求和密码)都经过加密。见 HTTP 和 HTTPS 参考。 - SOCKS5 over TLS 用 TLS 包裹 SOCKS5 连接。TCP 是加密的,但 SOCKS5 仍在 TLS 连接之外发送 UDP,所以 UDP 以未加密的形式到达服务器。
在检查流量的人看来,两者仍然是代理。如果你需要更难被识别特征的流量,请考虑为此而设计的协议,例如 Shadowsocks 或 Trojan。
速度
连接建立后,两种协议几乎都不增加开销:每条连接多几个字节,之后数据直接通过。SOCKS5 的握手稍微紧凑一些,HTTP 代理可能会多加一两个头部。实际上,服务器的距离、负载和带宽对速度的影响远大于协议本身。加上 TLS 后,每条连接会多一次握手。
该选哪一个?
- 选 SOCKS5:如果你想让整台设备的流量都走代理,或需要 UDP 来通话、玩游戏或使用 QUIC。对于浏览器以外的 App,它也是更好的选择。
- 选 HTTP:如果你只浏览网页、服务商只提供 HTTP,或者你想用 iOS 内置的无线局域网代理设置(它只接受 HTTP)。
- 选 TLS 变体(HTTPS 代理或 SOCKS5 over TLS):只要通往代理的路径经过你不信任的网络,例如公共 Wi-Fi。
- 同一个账号两种都提供? 很多住宅和数据中心代理服务商会同时给你一个 HTTP 端口和一个 SOCKS5 端口。选 SOCKS5,把 HTTP 留作备用。
在 iPhone 上使用 SOCKS5 或 HTTP 代理
iOS 只有按无线局域网设置的 HTTP 代理,没有 SOCKS5 选项,也不支持蜂窝数据。Potatso 是一款免费的 iPhone 和 iPad 代理客户端,支持 SOCKS5、SOCKS5 over TLS、HTTP 和 HTTPS 代理,在任何网络下都对整台设备生效。按照教程操作:iPhone 设置 SOCKS5 代理。想把它们与加密协议比较,请阅读代理协议对比。
常见问题
- SOCKS5 比 HTTP 代理快吗?
- 通常感觉不出差别。连接建立后,两者增加的开销都很小。服务器的位置、负载和带宽,比你用的是这两种协议中的哪一种重要得多。
- SOCKS5 代理会加密我的流量吗?
- 不会。普通的 SOCKS5 和 HTTP 代理都不加密任何内容,包括你的代理密码。HTTPS 网站仍然是端到端加密的,但要保护与代理本身之间的连接,请使用 SOCKS5 over TLS、HTTPS 代理,或 Shadowsocks、Trojan 这类加密协议。
- socks5h 是什么?
- socks5h 表示由代理服务器而不是你的设备来解析网站的域名。curl 等工具用 socks5h:// 来表示这种方式。它让 DNS 查询不经过你的本地网络,并让你拿到代理所在地区看到的解析结果。
- HTTP 代理能访问 HTTPS 网站吗?
- 能。客户端用 HTTP CONNECT 请求让代理打开一条隧道,再通过它与网站进行 TLS 通信。代理能看到网站的名称和端口,但看不到页面和数据。
- 哪种代理支持 UDP?
- SOCKS5,通过它的 UDP ASSOCIATE 命令,前提是服务器开启了这项功能。HTTP 代理只承载 TCP,所以语音通话、很多游戏和 QUIC 都无法经过它。