介绍#
vless 是类似于 socks5 协议的一种代理协议,被各大代理软件所使用,我推荐这个版本进行学习
https://github.com/sagerNet/sing-vmess
这个网页进行了简单的介绍,可以在这里了解一下
https://xtls.github.io/development/protocols/vless.html
报文解析#
请求#
| 版本号 | UUID | 附加信息长度 M | 附加信息 ProtoBuf | CMD | PORT | ATYP | DST.ADDR | DATA |
|---|---|---|---|---|---|---|---|---|
| 1 | 16 | 1 | 动态 | 1 | 2 | 1 | 动态 | 动态 |
- 版本号目前为 0x00
- CMD 是命令码
- 0x01 表示TCP转发
- 0x02 表示UDP转发
- 0x03 表示MUX
- ATYP 和 DST.ADDR
- 0x01 IPv4 地址,DST.ADDR 部分 4 字节长度
- 0x02 域名,DST.ADDR 部分第一个字节为域名长度,DST.ADDR剩余的内容为域名,没有\0结尾。
- 0x03 IPv6 地址,16 个字节长度。
- DATA 是第一次请求的数据,服务器会转发到目的地址
这里的 ATYP 和 socks5 是不一样的
响应#
| 版本号 | 附加信息长度 M | 附加信息 ProtoBuf | DATA |
|---|---|---|---|
| 1 | 1 | 动态 | 动态 |
- DATA 第一次的响应数据
之后客户端和目的地址就以服务器为中介互相传递数据
附加信息#
sing-box 里面只实现了一种附加信息,就是 flow = xtls-rprx-vision ,报文就是如下
| flow 标识符 | 字符串长度 | 字符串内容 |
|---|---|---|
| 0x0a | 16 | xtls-rprx-vision |
sing-box 还解析了另一个种附加信息,就是 seed ,标识符为 0x12
udp#
和转发 tcp 的区别是 udp 的报文前会插入 2 个字节的报文大小,之后是 udp 数据