Skip to content

协议概览

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

协议能力矩阵

协议入站出站TCPUDP加密方式多路复用支持认证方式
VMessAES-128-GCM、ChaCha20-Poly1305、无是 (v1.mux.cool)UUID + AEAD 头部
VLESS无(依赖传输层 TLS)是 (XUDP)UUID
Trojan无(依赖 TLS)SHA224(password)
ShadowsocksAES-128-GCM、AES-256-GCM、ChaCha20-Poly1305、XChaCha20、无按密钥
Shadowsocks 20222022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm 等PSK (base64)
SOCKS5是 (UDP Associate)用户名/密码
HTTP无(HTTPS 通过传输层)Basic Auth
Dokodemo-door不适用(透明代理)不适用
Freedom不适用(直连)不适用
Blackhole不适用不适用不适用不适用
WireGuardNoise 协议 (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-17proxy/trojan/protocol.go:16-20proxy/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/

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