AXPath
AXPath — это транспортный слой на основе нескольких параллельных TCP subflow. Он разбивает логическое соединение на сегменты размером не более chunkSize, помечает их соединительным Data Sequence Number (DSN, байтовое смещение) и распределяет по subflows TCP соединениям. Получатель переупорядочивает по DSN и собирает обратно непрерывный поток байт.
- Надежность: кумулятивный ACK (
dataAck) + SACK блоки (список диапазонов) + повторная передача (с reinjection на другие subflow). - Устойчивость: обрыв одного subflow не прерывает логическое соединение; неподтвержденные блоки, отправленные через этот subflow, будут поставлены в очередь повторно и отправлены через оставшиеся subflow.
- Возобновление: когда все subflow разорваны, сессию можно возобновить, если новые subflow подключатся в течение
resumeTimeoutMs; иначе соединение закрывается. - Безопасность:
streamSettings.securityподдерживает"none"/"tls"/"reality". При включенном TLS/REALITY каждый subflow выполняет собственное рукопожатие.pskиспользуется только для аутентификации HELLO и не заменяет TLS/REALITY.
AXPath не обратно совместим: обе стороны должны использовать одну и ту же реализацию (одну и ту же сборку/версию Xray), иначе HELLO не пройдет.
Конфигурации должны быть симметричны на обеих сторонах.
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
Максимальный размер одного сегмента данных (байты). AXPath режет поток на сегменты не больше этого значения. По умолчанию: 32768.
ackMaskBits: number
Емкость SACK в битах. Должно быть кратно 8.
Один SACK блок занимает 128 бит (start + end как uint64), поэтому один ACK может нести примерно ackMaskBits/128 блоков (макс. 64). По умолчанию: 1024 (до 8 блоков).
maxInflightBytes: number
Максимум неподтвержденных (in-flight) байт на направление для ограничения памяти/скорости. При достижении лимита отправитель перестает слать данные и ждет ACK; если ACK не приходит, типичный симптом — "застрял примерно на maxInflightBytes". По умолчанию: 33554432 (32 MiB).
maxQueuePerFlow: number
Максимум кадров в очереди на запись для каждого subflow (данные + управление). По умолчанию: 32.
joinTimeoutMs: number
Клиент: таймаут ожидания готовности хотя бы одного subflow при Dial (мс). По умолчанию: 16000.
resumeTimeoutMs: number
Как долго держать пустую сессию (без subflow) для возобновления (мс). По умолчанию: 10000.
reconnect: true | false
Клиент: автоматически переподключать отсутствующие subflow. По умолчанию: true.
psk: string
Опциональный PSK для аутентификации HELLO. Пустая строка означает выключено.
Советы по настройке
maxInflightBytes: увеличивайте на путях с потерями/переупорядочиванием или высоким BDP; это увеличивает потребление памяти.ackMaskBits: увеличивайте при сильном переупорядочивании, чтобы получатель мог сообщать больше SACK блоков.chunkSize: уменьшение снижает гранулярность повторной передачи, но увеличивает накладные расходы/CPU.subflows: больше subflow может увеличить скорость, но также увеличивает конкуренцию TCP и "нечестность"; начните с 2-4.
Отладка
- Зависания: ищите
axpath: send window full(часто означает in-flight достигmaxInflightBytesиlast_data_ackперестал двигаться). - Разрывы: ищите
axpath: subflow errorиaxpath: session closing(причина + снимок состояния). - Для дев-отладки смотрите
testing/scenarios/AXPATH_DEBUG.mdв репозитории Xray-core (1GiB loopback + fault injection).