详解
SOCKS5 是在 RFC 1928 中定义的传输层代理协议。与理解并解析 HTTP 请求和响应的 HTTP 代理不同,SOCKS5 代理运行在更底层:它在您与目标之间转发原始 TCP 或 UDP 数据包,而不检查或修改有效载荷。这意味着 SOCKS5 代理可以承载任何运行在 TCP 或 UDP 之上的协议,而不仅限于网络流量。
SOCKS5 是 SOCKS 代理协议的现代版本,新增了对 IPv6、UDP 转发以及多种身份验证方式(无需验证、用户名/密码、GSS-API)的支持。大多数住宅和 ISP 代理提供商同时通过 HTTP 和 SOCKS5 公开其端点,以便客户端选择适合自身技术栈的协议。
对于通过 HTTPS 进行的网络抓取,HTTP CONNECT 代理与 SOCKS5 代理的行为几乎完全相同——两者最终都是对加密的 TCP 流量进行隧道传输。当您的客户端使用非 HTTP 协议(FTP、SMTP、IRC、BitTorrent、游戏)或明确需要 UDP 支持时,两者之间的差异才会变得显著。
工作原理
当您的客户端连接到 SOCKS5 代理时,它会发送一个小型握手包来指定认证方式,然后发送一个包含目标主机和端口的 CONNECT 命令。代理向该目标建立 TCP 连接,此后仅在客户端与目标之间简单地转发字节。这里没有 HTTP 层感知——代理不读取 URL、请求头或响应体。
这种传输层透明性正是 SOCKS5 能够适用于任何基于 TCP 的协议的原因。UDP 支持使用独立的 UDP ASSOCIATE 流程,客户端将 UDP 数据报发送给代理,代理再将其转发至目标。认证(如果启用)仅在初始握手阶段进行一次,并适用于整个会话。