Skip to content

Транспорт — Xray-core

Выбор транспорта в Xray живёт в streamSettings. Схема такова:

json
"streamSettings": {
  "network": "<transport>",
  "security": "<tls|reality|none>",
  "<transport>Settings": { ... }
}

network — одно из tcp, ws, httpupgrade, grpc, mkcp, splithttp (теперь также известен как XHTTP). Читается соответствующий блок <transport>Settings. method принимается как псевдоним network — когда заданы оба, приоритет у method.

network: tcp

ПолеТипПо умолчаниюДопустимые значенияОписание
headerjson.RawMessage{type: "none"}{type: "none"} | {type: "http", request: {...}, response: {...}}Необязательная обфускация заголовком. По умолчанию `none` — чистый TCP. HTTP-форма отправляет поддельные HTTP-запрос/ответ, имитируя обычный веб-трафик.
acceptProxyProtocolboolfalsetrue | falseВходящее подключение — принимать заголовок PROXY protocol v1/v2, добавленный вышестоящим балансировщиком нагрузки.

Исходный код: infra/conf/transport_method.go:232-235 · зафиксировано на v26.7.28 (5ca6f4b)

tcpSettings — вариант по умолчанию: большинство схем использует чистый TCP с TLS в роли уровня безопасности.

network: ws — WebSocket

ПолеТипПо умолчаниюДопустимые значенияОписание
hoststring(server address)<hostname>HTTP-заголовок Host, отправляемый при апгрейде WebSocket. Приоритет на клиенте: host > serverName > address.
pathstring//<path>[?ed=<bytes>]Путь WebSocket. Query-параметр `?ed=N` включает 0-RTT early data объёмом до N байт.
headersmap[string]string{}{<header>: <value>}Дополнительные HTTP-заголовки. Указывать здесь `host` — устаревший приём; используйте поле `host` верхнего уровня.
acceptProxyProtocolboolfalsetrue | falseВходящее подключение — принимать PROXY protocol на нижележащем TCP-соединении.
heartbeatPerioduint320 (disabled)<seconds>Отправлять ping-кадры WebSocket с этим интервалом, чтобы поддерживать NAT-отображения живыми. 0 — отключено.

Исходный код: infra/conf/transport_method.go:613-619 · зафиксировано на v26.7.28 (5ca6f4b)

network: httpupgrade

Более лёгкий родственник WebSocket: использует рукопожатие HTTP Upgrade, но без полного WebSocket-кадрирования после него. Поток после рукопожатия — просто байты, что экономит несколько процентов CPU ценой преимуществ WS-кадрирования (например, кодов закрытия).

ПолеТипПо умолчаниюДопустимые значенияОписание
hoststring(server address)<hostname>HTTP-заголовок Host.
pathstring//<path>[?ed=<bytes>]Обслуживаемый путь. `?ed=N` включает early data.
headersmap[string]string{}{<header>: <value>}Дополнительные заголовки запроса. `host` здесь **запрещён** — задавайте его через поле `host` верхнего уровня.
acceptProxyProtocolboolfalsetrue | falseПринимать PROXY protocol на нижележащем TCP-соединении.

Исходный код: infra/conf/transport_method.go:655-660 · зафиксировано на v26.7.28 (5ca6f4b)

network: grpc

ПолеТипПо умолчаниюДопустимые значенияОписание
authoritystring(server address)<authority>Псевдозаголовок HTTP/2 :authority, отправляемый в gRPC-запросе.
serviceNamestring(required)<service path>Имя gRPC-сервиса. Полный путь запроса — `/{serviceName}/Tun` или `/{serviceName}/TunMulti` в зависимости от `multiMode`.
multiModeboolfalsetrue | falseМультиплексировать множество логических потоков в одном двунаправленном gRPC-потоке. Снижает задержку для коротких соединений.
idle_timeoutint3260<seconds>Тайм-аут простоя gRPC-соединения. По истечении интервала пиру отправляется ping; отсутствие ответа закрывает соединение.
health_check_timeoutint3220<seconds>Тайм-аут ожидания ответа на ping.
permit_without_streamboolfalsetrue | falseРазрешить keepalive-пинги gRPC даже без активного потока.
initial_windows_sizeint320 (lib default)<bytes>Начальный размер окна HTTP/2 на уровне потока. Полезно для каналов с большим BDP.
user_agentstring(lib default)<UA string>User-Agent, отправляемый на нижележащем HTTP/2-соединении.

Исходный код: infra/conf/transport_method.go:578-587 · зафиксировано на v26.7.28 (5ca6f4b)

network: mkcp

ПолеТипПо умолчаниюДопустимые значенияОписание
mtu*uint321350>= 21Максимальный размер сегмента mKCP в байтах. Не меньше 21.
tti*uint325010-1000 msИнтервал передачи в миллисекундах (10–1000). Меньшие значения — более быстрые повторные передачи ценой нагрузки на CPU.
uplinkCapacity*uint325<MB/s>Оценка полосы отдачи в МБ/с. mKCP использует её для расчёта окна отправки.
downlinkCapacity*uint3220<MB/s>Оценка полосы загрузки в МБ/с.
cwndMultiplier*uint32(default)>= 1Множитель окна перегрузки — задаёт, насколько агрессивно mKCP наращивает окно. Не меньше 1. Заменяет старый логический переключатель `congestion`.
maxSendingWindow*uint32(default)>= mtuВерхняя граница окна отправки. Должна быть не меньше `mtu`, иначе конфигурация отклоняется при сборке.
headerjson.RawMessage(removed)(use finalmask)Удалено. Установка `header` или `seed` завершается ошибкой при сборке с отсылкой к новым заголовочным транспортам finalmask.
seed*string(removed)(use finalmask)Удалено. Так же, как `header`.

Исходный код: infra/conf/transport_method.go:523-533 · зафиксировано на v26.7.28 (5ca6f4b)

network: splithttp (XHTTP)

XHTTP — современный транспорт Xray с поддержкой HTTP/2 и HTTP/3. У него 30 полей — эта страница описывает самые используемые; остальные разбираются на отдельной странице SplitHTTP.

ПолеТипПо умолчаниюДопустимые значенияОписание
hoststring(server address)<hostname>HTTP-заголовок Host.
pathstring//<path>Префикс пути.
modestringautoauto | packet-up | stream-up | stream-oneРежим кадрирования SplitHTTP. `auto` согласуется с сервером. `packet-up` отправляет каждую запись прикладного уровня отдельным POST; `stream-up` использует один долгоживущий POST; `stream-one` держит на том же TCP-соединении открытым даже ответ.
headersmap[string]string{}{<header>: <value>}Дополнительные заголовки, добавляемые к каждому запросу.
xPaddingBytesInt32Range(unset){from, to}Диапазон случайных байтов паддинга, добавляемых к каждому запросу.
xmuxXmuxConfig(unset)XmuxConfigНастройка пула соединений X-Mux.
downloadSettings*StreamConfig(unset)StreamConfigАльтернативные stream-настройки для половины **загрузки** (асимметричные схемы, например отдача через SplitHTTP, а загрузка по чистому TLS).

Исходный код: infra/conf/transport_method.go:257-288 · зафиксировано на v26.7.28 (5ca6f4b)

Оставшиеся поля покрывают продвинутое формирование трафика (xPaddingObfsMode, xPaddingKey, sessionIDKey, sessionIDPlacement, seqPlacement, uplinkDataKey, …) и пул соединений X-Mux (maxConcurrency, maxConnections, cMaxReuseTimes, …).

Примеры

WebSocket + TLS:

json
{
  "streamSettings": {
    "network": "ws",
    "security": "tls",
    "wsSettings": {
      "path": "/vl?ed=2048",
      "host": "example.com",
      "headers": { "User-Agent": "Mozilla/5.0..." }
    },
    "tlsSettings": { "serverName": "example.com" }
  }
}

gRPC + REALITY:

json
{
  "streamSettings": {
    "network": "grpc",
    "security": "reality",
    "grpcSettings": {
      "serviceName": "GunService",
      "multiMode": true,
      "idle_timeout": 60
    },
    "realitySettings": { /* ... */ }
  }
}

XHTTP + REALITY с асимметричной загрузкой:

json
{
  "streamSettings": {
    "network": "splithttp",
    "security": "reality",
    "splithttpSettings": {
      "mode": "auto",
      "path": "/xhttp",
      "host": "www.cloudflare.com",
      "xmux": {
        "maxConcurrency": { "from": 4, "to": 8 },
        "hMaxReusableSecs": { "from": 300, "to": 360 }
      },
      "downloadSettings": {
        "network": "splithttp",
        "security": "tls",
        "splithttpSettings": { "mode": "stream-one" }
      }
    },
    "realitySettings": { /* ... */ }
  }
}

Примечания

  • network: "http" (транспорт HTTP/2) из Xray-core удалён. Используйте вместо него splithttp (XHTTP) — он покрывает HTTP/2 и HTTP/3.
  • path WebSocket принимает query-параметр ?ed=<bytes>, кодирующий максимальный размер early data. Параметр вырезается из пути, уходящего на провод, и применяется как настройка транспорта при сборке конфигурации.
  • HttpUpgrade отклоняет host внутри headers с явной ошибкой (infra/conf/transport_method.go:677-679). WebSocket для той же схемы лишь выдаёт предупреждение об устаревании.
  • Модель перегрузки mKCP изменилась: логический congestion и поля readBufferSize / writeBufferSize удалены и заменены на cwndMultiplier (множитель роста окна, ≥ 1) и maxSendingWindow (потолок окна, ≥ mtu).
  • Поля header и seed в mKCP удалены. Установка любого из них завершается ошибкой при сборке конфигурации с отсылкой к новым заголовочным транспортам finalmask (или выделенным типам mkcp-original / mkcp-aes128gcm).
  • finalmask — переработанная подсистема маскировки UDP-пакетов в Xray (transport/internet/finalmask/*). Она заменяет старую обфускацию заголовков mKCP подключаемыми строительными блоками, выбираемыми по типу — header-custom, mkcp-original, mkcp-aes128gcm, mkcp-legacy, realm, salamander, noise, xdns, xicmp, sudoku, fragment, — включая небольшой DSL выражений transform для побайтовой перезаписи. Это продвинутая область; полную схему по каждому типу см. в апстрим-пакете finalmask.
  • downloadSettings в XHTTP включает асимметричный транспорт: клиент отдаёт по одному транспорту, а загружает по другому. Используйте против DPI, снимающего отпечаток с симметрии запрос/ответ HTTP.
  • idle_timeout и health_check_timeout в gRPC пишутся в snake_case, как в protobuf, а не в camelCase, как остальная поверхность конфигурации Xray.

Сравнение с другими ядрами

  • sing-box использует полиморфный блок transport: { type: "ws|http|grpc|httpupgrade|quic", ... }, встроенный в каждое входящее/исходящее подключение с поддержкой TLS. См. Транспорт — sing-box.
  • mihomo распределяет параметры транспорта по блокам *-opts каждого протокола (ws-opts, h2-opts, grpc-opts, xhttp-opts) на каждой записи прокси. См. Транспорт — mihomo.

Исходный код: infra/conf/transport_method.go:232-660 · v26.7.28 (5ca6f4b)

Core Tutorial от Argsment