Skip to content

协议概览

sing-box 支持 20 多种代理协议,所有协议都遵循一致的适配器模式。协议实现是轻量级的包装层,将实际的线路格式处理委托给 sing-* 库。

源码: protocol/, include/

注册模式

每个协议都通过 include 系统进行注册:

go
// include/inbound.go
func InboundRegistry() *inbound.Registry {
    registry := inbound.NewRegistry()
    tun.RegisterInbound(registry)
    vless.RegisterInbound(registry)
    vmess.RegisterInbound(registry)
    trojan.RegisterInbound(registry)
    // ...
    return registry
}

每个协议都提供一个注册函数:

go
// protocol/vless/inbound.go
func RegisterInbound(registry adapter.InboundRegistry) {
    inbound.Register[option.VLESSInboundOptions](registry, C.TypeVLESS, NewInbound)
}

泛型 Register 函数的映射关系为:(type string, options type) → factory function

Inbound 模式

所有 inbound 都遵循以下结构:

go
type Inbound struct {
    myInboundAdapter  // 内嵌适配器,包含 Tag(), Type()
    ctx      context.Context
    router   adapter.ConnectionRouterEx
    logger   log.ContextLogger
    listener *listener.Listener    // TCP 监听器
    service  *someprotocol.Service // 协议服务
}

func NewInbound(ctx, router, logger, tag string, options) (adapter.Inbound, error) {
    // 1. 创建协议服务(来自 sing-* 库)
    // 2. 创建监听器
    // 3. 将服务连接到路由器进行连接处理
}

func (h *Inbound) Start(stage adapter.StartStage) error {
    // 启动监听器
}

func (h *Inbound) Close() error {
    // 关闭监听器和服务
}

// 监听器为每个新连接调用此方法
func (h *Inbound) NewConnectionEx(ctx, conn, metadata, onClose) {
    // 此处进行协议特定的解码
    // 然后: h.router.RouteConnectionEx(ctx, conn, metadata, onClose)
}

Outbound 模式

所有 outbound 都实现 N.Dialer

go
type Outbound struct {
    myOutboundAdapter  // 内嵌适配器,包含 Tag(), Type(), Network()
    ctx       context.Context
    dialer    N.Dialer           // 底层拨号器(可能是 detour)
    transport *v2ray.Transport   // 可选的 V2Ray 传输层
    // 协议特定选项
}

func NewOutbound(ctx, router, logger, tag string, options) (adapter.Outbound, error) {
    // 1. 创建底层拨号器(默认或 detour)
    // 2. 如有配置则创建 V2Ray 传输层
    // 3. 配置协议选项
}

func (h *Outbound) DialContext(ctx, network, destination) (net.Conn, error) {
    // 1. 拨号传输层连接
    // 2. 执行协议 handshake
    // 3. 返回包装后的连接
}

func (h *Outbound) ListenPacket(ctx, destination) (net.PacketConn, error) {
    // 用于支持 UDP 的协议
}

协议分类

代理协议(客户端/服务端)

协议InboundOutbound
VLESSsing-vmess
VMesssing-vmess
Trojantransport/trojan(内置)
Shadowsockssing-shadowsocks / sing-shadowsocks2
ShadowTLSsing-shadowtls
Hysteria2sing-quic
TUICsing-quic
AnyTLSsing-anytls
NaiveProxy内置
WireGuardEndpointEndpointwireguard-go
TailscaleEndpointEndpointtailscale

本地代理协议

协议InboundOutbound
SOCKS4/5
HTTP
Mixed (SOCKS+HTTP)-
Redirect-
TProxy-
TUN-

工具类协议

协议用途
Direct直连出站
Block丢弃所有连接
DNS转发到 DNS 路由器
Selector手动选择出站
URLTest基于延迟自动选择
SSHSSH 隧道
TorTor 网络

V2Ray 传输层集成

许多协议支持 V2Ray 兼容的传输层:

go
// 从选项创建传输层
transport, err := v2ray.NewServerTransport(ctx, logger, common.PtrValueOrDefault(options.Transport), tlsConfig, handler)

// 或客户端侧
transport, err := v2ray.NewClientTransport(ctx, dialer, serverAddr, common.PtrValueOrDefault(options.Transport), tlsConfig)

支持的传输层:WebSocket、gRPC、HTTP/2、HTTPUpgrade、QUIC。

多路复用集成

Outbound 可以使用多路复用进行包装:

go
if options.Multiplex != nil && options.Multiplex.Enabled {
    outbound.multiplexDialer, err = mux.NewClientWithOptions(ctx, outbound, muxOptions)
}

处理链

Inbound Listener → 协议解码 → Router → 规则匹配 → Outbound 选择
    ↓                                                          ↓
TCP/UDP accept                                          协议编码
    ↓                                                          ↓
协议服务                                                传输层拨号
    ↓                                                          ↓
提取目标地址                                            远程连接
    ↓                                                          ↓
路由到 outbound ─────────────────────────────→ ConnectionManager.Copy

与 Xray-core 的主要区别

方面Xray-coresing-box
线路格式内置编码sing-*
Inbound 模型proxy.Inbound.Process() 返回 Linkadapter.Inbound → router 回调
Outbound 模型proxy.Outbound.Process() 使用 LinkN.Dialer interface (DialContext/ListenPacket)
数据流Pipe Reader/Writer直接使用 net.Conn/PacketConn
Mux内置 mux + XUDPsing-mux
Vision/XTLS内置于 proxy.go不支持(采用不同方案)