Mux.Cool 协议

Mux.Cool 协议是一个多路复用传输协议,用于在一条已建立的数据流中传输多个各自独立的数据流。

版本

当前版本是 1 Beta。

依赖

底层协议

Mux.Cool 必须运行在一个已建立的可靠数据流之上。

通讯过程

一个 Mux.Cool 连接中可传输若干个子连接,每个子连接有一个独立的 ID 和状态。传输过程由帧(Frame)组成,每一帧用于传输一个特定的子连接的数据。

客户端行为

当有连接需求时并且没有现有可用的连接时,客户端向服务器发起一个新连接,以下称为“主连接”。

  1. 一个主连接可用于发送若干个子连接。客户端可自主决定主连接可承载的子连接数量。
  2. 对于一个新的子连接,客户端必须发送状态New以通知服务器建立子连接,然后使用状态Keep来传送数据。
  3. 当子连接结束时,客户端发送End状态来通知服务器关闭子连接。
  4. 客户端可自行决定何时关闭主连接,但必须确定服务器也同时保持连接。
  5. 客户端可使用 KeepAlive 状态来避免服务器关闭主连接。

服务器端行为

当服务器端接收到新的子连接时,服务器应当按正常的连接来处理。

  1. 当收到状态End时,服务器端可以关闭对目标地址的上行连接。
  2. 在服务器的响应中,必须使用与请求相同的 ID 来传输子连接的数据。
  3. 服务器不能使用New状态。
  4. 服务器可使用 KeepAlive 状态来避免客户端关闭主连接。

传输格式

Mux.Cool 使用对称传输格式,即客户端和服务器发送和接收相同格式的数据。

帧格式

2 字节 L 字节 X 字节
元数据长度 L 元数据 额外数据

元数据

元数据有若干种类型,由状态 S 来区分。所有类型的元数据都包含 ID 和 Opt 两项,其含义为:

  • ID: 子连接的唯一标识
  • Opt:
    • D(0x01): 有额外数据

当选项 Opt(D) 开启时,额外数据格式如下:

2 字节 L 字节
长度 L 数据

新建子连接 (New)

2 字节 1 字节 1 字节 1 字节 2 字节 1 字节 X 字节
ID 0x01 选项 Opt 网络类型 N 端口 地址类型 T 地址 A

其中:

  • 网络类型 N:
    • 0x01:TCP,表示当前子连接的流量应当以 TCP 的方式发送至目标。
    • 0x02:UDP,表示当前子连接的流量应当以 UDP 的方式发送至目标。
  • 地址类型 T:
    • 0x01:IPv4
    • 0x02:域名
    • 0x03:IPv6
  • 地址 A:
    • 当 T = 0x01 时,A 为 4 字节 IPv4 地址;
    • 当 T = 0x02 时,A 为 1 字节长度(L) + L 字节域名;
    • 当 T = 0x03 时,A 为 16 字节 IPv6 地址;

在新建子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。

保持子连接 (Keep)

2 字节 1 字节 1 字节
ID 0x02 选项 Opt

在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。

关闭子连接 (End)

2 字节 1 字节 1 字节
ID 0x03 选项 Opt

在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。

保持连接 (KeepAlive)

2 字节 1 字节 1 字节
ID 0x04 选项 Opt

在保持连接时:

  • 若 Opt(D) 开启,则这一帧所带的数据必须被丢弃。
  • ID 可为随机值。

应用

Mux.Cool 协议与底层协议无关,理论上可以使用任何可靠的流式连接来传输 Mux.Cool 的协议数据。

在目标导向的协议如 Shadowsocks 和 VMess 协议中,连接建立时必须包含一个指定的地址。为了保持兼容性,Mux.Cool 协议指定地址为“v1.mux.cool”。即当主连接的目标地址与之匹配时,则进行 Mux.Cool 方式的转发,否则按传统方式进行转发。

修订历史

2017.04.12 重构页面,加入 KeepAlive 状态
2017.04.03 初版