把一条 SOCKS5 报文想象成快递单:每个字段填在哪个格子、占几格,都是约定好的,不能随便挪。代理IP客户端和服务器能互相读懂对方,靠的就是这套固定布局。
先说结论:SOCKS5 的请求报文由版本号、命令码、保留位、地址类型、地址、端口几部分组成,每一段的字节数都是固定的。哪一段写错,报文就废了。
| 字段 | 字节数 | 作用 |
|---|---|---|
| 版本号 | 1 | 固定为 5,表示 SOCKS5 |
| 命令码 | 1 | 1=CONNECT,2=BIND,3=UDP |
| 保留位 | 1 | 固定为 0,留给扩展 |
| 地址类型 ATYP | 1 | 1=IPv4,3=域名,4=IPv6 |
| 地址 | 不定长 | 按 ATYP 决定字节数与格式 |
| 端口 | 2 | 目标端口,大端序 |
以最常见的 IPv4 请求为例:版本号 1 字节、命令码 1 字节、保留位 1 字节、ATYP 1 字节、IPv4 地址 4 字节、端口 2 字节,一共 10 个字节。这 10 个字节排列整齐,服务器从第一个字节按顺序读,就能完整还原这次请求。
换成域名或 IPv6 地址,布局规则不变,只是地址段变长。域名会多一个长度字节在前,IPv6 固定 16 字节,其余字段位置一概不动。这就是“快递单”设计的好处:代理IP客户端和服务端只要约定好模板,无论地址类型怎么变,双方都能按同一套规则解析。
误区:报文不是自由格式
有人以为报文就像聊天记录,发过去一串文字服务器自己理解就行。实际完全不是这样——SOCKS5 是二进制协议,每一段字节都有固定含义,多一字节、少一字节都会解析错位。
更稳妥的理解是把它当模板:先写好版本、命令、保留位,再按 ATYP 填地址,最后补端口。顺序不能变,长度不能改,客户端工具通常已经封装好了这些细节,报错时能看懂字段布局,就能快速判断是哪一段出了问题。
报文格式对代理IP服务端同样重要。服务器收到请求后,也要按同一套模板逐段解析,任何一位客户端和它约定不一致,都会导致解析失败。这也是为什么协议文档强调字段顺序和字节数必须严格遵循——两边都按同一张快递单填,才能保证不丢件。对代理IP两端来说,这张单子是共同的约定。
版本号写错:服务器不认协议版本,直接拒绝握手。
命令码写错:请求的意图对不上,返回 07 命令不支持。
ATYP 与地址不符:按错误长度读地址,后面全部错位。
报文布局是协议的地基,地基稳了,代理IP的连接才能谈得上后面的速度与稳定。把这张快递单的格子记在心里,遇到连接异常时,很多问题一眼就能看出症结所在,不用每次都从头排查。
对于只关心日常使用的用户来说,报文里的每个字段不需要都背下来,但理解“先版本、再命令、后地址、补端口”这个顺序就够了。排查代理IP连接问题时,按这个顺序从头到尾核对一遍,通常能在几分钟内找到写错的那一格,省去反复重试的时间。
