Skip to content

协议概览 ​

Xray-core 实现了一系列多样化的代理协议,每个协议都通过其 init() 函数中的 common.RegisterConfig() 进行注册。核心根据配置将入站连接分发给相应的协议处理器,出站处理器则连接到上游服务器或目标地址。

协议能力矩阵 ​

协议入站出站TCPUDP加密方式多路复用支持认证方式
VMess是是是是AES-128-GCM、ChaCha20-Poly1305、无是 (v1.mux.cool)UUID + AEAD 头部
VLESS是是是是无(依赖传输层 TLS)是 (XUDP)UUID
Trojan是是是是无(依赖 TLS)否SHA224(password)
Shadowsocks是是是是AES-128-GCM、AES-256-GCM、ChaCha20-Poly1305、XChaCha20、无否按密钥
Shadowsocks 2022是是是是2022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm 等否PSK (base64)
SOCKS5是是是是 (UDP Associate)无否用户名/密码
HTTP是是是否无(HTTPS 通过传输层)否Basic Auth
Dokodemo-door是否是是不适用(透明代理)否不适用
Freedom否是是是不适用(直连)否不适用
Blackhole否是不适用不适用不适用否不适用
WireGuard是是是是Noise 协议 (Curve25519、ChaCha20-Poly1305)否公钥/私钥
Hysteria2是是是是 (QUIC 数据报)QUIC TLS 1.3否基于密码

架构 ​

入站处理器接口 ​

每个入站协议都实现了 proxy.Inbound 接口:

go
type Inbound interface {
    Network() []net.Network        // Supported networks (TCP, UDP, UNIX)
    Process(ctx context.Context,
        network net.Network,
        conn stat.Connection,
        dispatcher routing.Dispatcher) error
}

关键源码:proxy/proxy.go

出站处理器接口 ​

每个出站协议都实现了 proxy.Outbound 接口:

go
type Outbound interface {
    Process(ctx context.Context,
        link *transport.Link,
        dialer internet.Dialer) error
}

关键源码:proxy/proxy.go

注册模式 ​

所有协议都在各自的 init() 函数中使用相同的模式进行自注册:

go
func init() {
    common.Must(common.RegisterConfig((*Config)(nil),
        func(ctx context.Context, config interface{}) (interface{}, error) {
            return New(ctx, config.(*Config))
        }))
}

连接流程 ​

mermaid
graph LR
    A[客户端] -->|传输层| B[入站处理器]
    B -->|解码协议| C[分发器]
    C -->|路由规则| D[出站处理器]
    D -->|编码协议| E[传输层]
    E --> F[目标地址]

Splice 拷贝级别 ​

入站/出站元数据上的 CanSpliceCopy 字段控制零拷贝优化:

值含义
0不使用 splice
1允许 splice(direct/dokodemo)
2握手后可使用 splice(socks/http 原始模式)
3完全支持 splice(加密协议)

地址解析 ​

大多数协议使用 protocol.NewAddressParser,采用 SOCKS5 风格的地址族字节:

字节值地址族
0x01IPv4(4 字节)
0x03域名(1 字节长度前缀 + 字符串)
0x04IPv6(16 字节)

VMess 使用不同的编排方式:0x01 = IPv4、0x02 = 域名、0x03 = IPv6,且采用端口在前、地址在后的格式。

源码:proxy/vmess/encoding/encoding.go:12-17、proxy/trojan/protocol.go:16-20、proxy/shadowsocks/protocol.go:24-31

关键源码文件 ​

协议目录
VMessproxy/vmess/(aead/、encoding/、inbound/、outbound/)
VLESSproxy/vless/
Trojanproxy/trojan/
Shadowsocksproxy/shadowsocks/
Shadowsocks 2022proxy/shadowsocks_2022/
SOCKSproxy/socks/
HTTPproxy/http/
Dokodemo-doorproxy/dokodemo/
Freedomproxy/freedom/
Blackholeproxy/blackhole/
WireGuardproxy/wireguard/
Hysteria2proxy/hysteria/

用于重新实现目的的技术分析。