AXPath
AXPath 是一种基于多条并行 TCP 子连接(subflow)的传输层。它把一个逻辑连接在用户态切分为不超过 chunkSize 的数据段(segment),并用连接级 Data Sequence Number(DSN,字节偏移)标记;发送端把 segment 条带化到 subflows 条 TCP 子连接上发送;接收端按 DSN 重排并拼接回连续字节流。
- 可靠性:累计 ACK(
dataAck)+ SACK(范围列表)+ 重传(可跨 subflow 重新注入)。 - 容错:单条 subflow 掉线不会中断逻辑连接;未确认的数据会重新入队并在其它 subflow 上继续传输。
- 断流恢复:当所有 subflow 都断开时,在
resumeTimeoutMs内如果有新的 subflow attach,逻辑连接继续;超时则关闭。 - 安全:
streamSettings.security支持"none"/"tls"/"reality",当启用 TLS/REALITY 时每条 subflow 独立握手;psk仅用于 HELLO 认证,不替代 TLS/REALITY。
AXPath 协议不向后兼容,两端必须使用同一代 AXPath 实现(同一 Xray 版本/构建),混用会在握手阶段失败。
两端配置必须对称。
AXPathObject
AXPathObject 对应传输配置的 axpathSettings 项。
{
"subflows": 4,
"chunkSize": 32768,
"ackMaskBits": 1024,
"maxInflightBytes": 33554432,
"maxQueuePerFlow": 32,
"joinTimeoutMs": 16000,
"resumeTimeoutMs": 10000,
"reconnect": true,
"psk": ""
}2
3
4
5
6
7
8
9
10
11
subflows: number
并行 TCP subflow 数量。取值范围 1-16(大于 16 会被截断为 16),默认值 4。
chunkSize: number
单个数据段(segment)的最大大小(字节)。AXPath 会按不超过该值切分字节流。默认值 32768。
ackMaskBits: number
SACK 容量(bit),必须为 8 的倍数。
每个 SACK block 占 128 bit(start + end 两个 uint64),因此单个 ACK 最多可携带约 ackMaskBits/128 个 block(上限 64)。默认值 1024(最多 8 个 block)。
maxInflightBytes: number
单方向允许的最大未确认(in-flight)字节数,用于限流与内存上限。达到上限时发送端会停发并等待 ACK;若 ACK 被阻塞,常见表现是卡在约 maxInflightBytes。默认值 33554432(32 MiB)。
maxQueuePerFlow: number
每条 subflow writer 的最大排队帧数(包含数据段与控制帧)。默认值 32。
joinTimeoutMs: number
客户端 Dial 时等待至少 1 条 subflow 就绪的超时时间(毫秒)。默认值 16000。
resumeTimeoutMs: number
当所有 subflow 都断开后,保持会话可恢复的时间(毫秒)。默认值 10000。
reconnect: true | false
客户端是否自动补齐/重连 subflows。默认值 true。
psk: string
可选 PSK,用于 HELLO 认证。空字符串表示禁用。
调参建议
maxInflightBytes: 丢包/乱序/高 BDP 场景可适当增大;会增加内存占用与重传队列压力。ackMaskBits: 乱序更严重时可增大以携带更多 SACK block;过小会让丢失定位与重传变慢。chunkSize: 降低可减小重传粒度与乱序缓存压力,但会增加帧开销与 CPU 开销。subflows: 更多 subflow 可能提升吞吐,但也会带来更多 TCP 竞争与不公平性;优先从 2-4 开始。
调试
- 卡住:关注日志
axpath: send window full(通常表示 in-flight 达到maxInflightBytes且last_data_ack长时间不前进)。 - 断线:关注
axpath: subflow error与axpath: session closing的原因字段与状态快照。 - 开发场景下可参考 Xray-core 仓库内
testing/scenarios/AXPATH_DEBUG.md的 1GiB 回环测试与故障注入用例。