Socks 是一个代理协议,这里会对协议进行详细介绍,同时会介绍其使用场景。
简介
这是一种互联网协议,通过代理服务器在客户端和服务端之间交换网络数据,而 socks5
是 socks
协议的第五个版本,在 socks4
的基础上增加了 UDP 转发和认证功能,不过并不向下兼容。
协议详解
其中 socks5
是 SOCKS Protocol Version 5 的缩写,其规范在 RFC1928 中定义,是一个二进制协议,总共分成认证、建立连接、转发数据三步。
握手阶段
首先客户端会向 Proxy 发起协商,协议如下。
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
各个字段的含义如下:
VER
协议版本号,对应socks5
为0x05
。NMETHODS
认证的方法数量。METHODS
认证的方法,在 RFC 中预先定义了部分。
服务端会选中一个 Method 返回给客户端,格式如下。
+----+--------+
|VER | METHOD |
+----+--------+
| 1 | 1 |
+----+--------+
当客户端接收到 0x00
时会跳过认证直接进入请求阶段;如果收到 0xFF
则直接断开连接,其它值则进入到对应的认证阶段。
请求阶段
当顺利通过协商阶段后,客户端开始向服务发起请求。
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER
版本号,与协商阶段相同,对应socks5
的值为0x05
。CMD
对应几种操作:0x01
表示 CONNECT 请求;0x02
表示 BIND 请求;0x03
表示 UDP 转发。RSV
保留字段,值为0x00
。ATYP
目标地址类型,表示DST.ADDR
的数据对应这个字段的类型:0x01
表示IPv4
地址,对应DST.ADDR
长度为 4 字节;0x03
表示域名,DST.ADDR
是一个可变长度的域名,第一个字节表示长度;0x04
表示IPv6
地址,对应DST.ADDR
为 16 个字节长度。
DST.ADDR
一个可变长度的地址信息。DST.PORT
目标端口,固定 2 个字节。
在处理完用户请求之后会返回一个响应。
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER
协议版本号,同样为0x05
。REP
返回码信息:0x00
成功。0x01
成功。
实际上 Socks5 服务器和 Relay 服务器是可以分开的,分开后就是通过这里的 BND.ADDR
和 BND.PORT
告知客户端的服务器地址,否则全部设置为 0 即可。