Open Bpazy opened 10 months ago
VMess 是 V2Ray 原创的加密通讯协议。
当前版本号为 1。
VMess 是一个基于 TCP 的协议,所有数据使用 TCP 传输。
ID 等价于 UUID,是一个 16 字节长的随机数,它的作用相当于一个令牌(Token)。 一个 ID 形如:de305d54-75b4-431b-adb2-eb6b9e546014,几乎完全随机,可以使用任何的 UUID 生成器来生成,比如这个。
用户 ID 可在配置文件中指定。
VMess 是一个无状态协议,即客户端和服务器之间不需要握手即可直接传输数据,每一次数据传输对之前和之后的其它数据传输没有影响。 VMess 的客户端发起一次请求,服务器判断该请求是否来自一个合法的客户端。如验证通过,则转发该请求,并把获得的响应发回给客户端。 VMess 使用非对称格式,即客户端发出的请求和服务器端的响应使用了不同的格式。
认证信息是一个 16 字节的哈希(hash)值,它的计算方式如下:
指令部分经过 AES-128-CFB 加密:
选项 Opt 细节:(当某一位为 1 时,表示该选项启用)
其中:
数据部分有两种格式,默认为基本格式。
此格式仅作为向后兼容所用,在之后的版本中可能被删除。
所有数据均认为是请求的实际内容。这些内容将被发往指令部分所指定的地址。当 Cmd = 0x01 时,这些数据将以 TCP 的形式发送;当 Cmd = 0x02 时,这些数据将以 UDP 形式发送。
此格式支持 None 和 AES-128-CFB 两种加密方式,加密的 Key 和 IV 由指令部分指定。
当 Opt(S) 开启时,数据部分使用此格式。实际的请求数据被分割为若干个小块,每个小块的格式如下。服务器校验完所有的小块之后,再按基本格式的方式进行转发。
在传输结束之前,数据包中必须有实际数据,即除了长度和认证数据之外的数据。当传输结束时,客户端必须发送一个空的数据包,即 L = 0(不加密)或认证数据长度(有加密),来表示传输结束。
设数据包长度为 R = L - P,按加密方式不同,数据包的格式如下:
应答头部数据使用 AES-128-CFB 加密。响应加密 IV 为 MD5(请求加密 IV),响应加密 Key 为 MD5(请求加密 Key)。实际应答数据视加密设置不同而不同。
客户端在收到动态端口指令时,服务器已开放新的端口用于通信,这时客户端可以将数据发往新的端口。在 T 分钟之后,这个端口将失效,客户端必须重新使用主端口进行通信。
https://www.v2fly.org/developer/protocols/vmess.html
VMess 协议
VMess 是 V2Ray 原创的加密通讯协议。
版本
当前版本号为 1。
依赖
底层协议
VMess 是一个基于 TCP 的协议,所有数据使用 TCP 传输。
用户 ID
ID 等价于 UUID,是一个 16 字节长的随机数,它的作用相当于一个令牌(Token)。 一个 ID 形如:de305d54-75b4-431b-adb2-eb6b9e546014,几乎完全随机,可以使用任何的 UUID 生成器来生成,比如这个。
用户 ID 可在配置文件中指定。
函数
通讯过程
VMess 是一个无状态协议,即客户端和服务器之间不需要握手即可直接传输数据,每一次数据传输对之前和之后的其它数据传输没有影响。 VMess 的客户端发起一次请求,服务器判断该请求是否来自一个合法的客户端。如验证通过,则转发该请求,并把获得的响应发回给客户端。 VMess 使用非对称格式,即客户端发出的请求和服务器端的响应使用了不同的格式。
客户端请求
认证信息
认证信息是一个 16 字节的哈希(hash)值,它的计算方式如下:
指令部分
指令部分经过 AES-128-CFB 加密:
选项 Opt 细节:(当某一位为 1 时,表示该选项启用)
其中:
数据部分
数据部分有两种格式,默认为基本格式。
基本格式 (弃用)
此格式仅作为向后兼容所用,在之后的版本中可能被删除。
所有数据均认为是请求的实际内容。这些内容将被发往指令部分所指定的地址。当 Cmd = 0x01 时,这些数据将以 TCP 的形式发送;当 Cmd = 0x02 时,这些数据将以 UDP 形式发送。
此格式支持 None 和 AES-128-CFB 两种加密方式,加密的 Key 和 IV 由指令部分指定。
标准格式
当 Opt(S) 开启时,数据部分使用此格式。实际的请求数据被分割为若干个小块,每个小块的格式如下。服务器校验完所有的小块之后,再按基本格式的方式进行转发。
其中:
在传输结束之前,数据包中必须有实际数据,即除了长度和认证数据之外的数据。当传输结束时,客户端必须发送一个空的数据包,即 L = 0(不加密)或认证数据长度(有加密),来表示传输结束。
设数据包长度为 R = L - P,按加密方式不同,数据包的格式如下:
服务器应答
应答头部数据使用 AES-128-CFB 加密。响应加密 IV 为 MD5(请求加密 IV),响应加密 Key 为 MD5(请求加密 Key)。实际应答数据视加密设置不同而不同。
其中:
动态端口指令
其中:
客户端在收到动态端口指令时,服务器已开放新的端口用于通信,这时客户端可以将数据发往新的端口。在 T 分钟之后,这个端口将失效,客户端必须重新使用主端口进行通信。
注释