Транспорт — Xray-core
Выбор транспорта в Xray живёт в streamSettings. Схема такова:
"streamSettings": {
"network": "<transport>",
"security": "<tls|reality|none>",
"<transport>Settings": { ... }
}network — одно из tcp, ws, httpupgrade, grpc, mkcp, splithttp (также называется XHTTP). Читается соответствующий блок <transport>Settings. method принимается как псевдоним network — когда заданы оба, приоритет у method.
network: tcp
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
header | json.RawMessage | {type: "none"} | {type: "none"} | {type: "http", request: {...}, response: {...}} | Необязательная обфускация заголовком. По умолчанию none — чистый TCP. HTTP-форма отправляет поддельные HTTP-запрос/ответ, имитируя обычный веб-трафик. |
acceptProxyProtocol | bool | false | true | false | Входящее подключение — принимать заголовок PROXY protocol v1/v2, добавленный вышестоящим балансировщиком нагрузки. |
Исходный код: infra/conf/transport_method.go:231-234 · зафиксировано на v26.9.9 (52a412d)
tcpSettings — вариант по умолчанию: большинство схем использует чистый TCP с TLS в роли уровня безопасности.
network: ws — WebSocket
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
host | string | (server address) | <hostname> | HTTP-заголовок Host, отправляемый при апгрейде WebSocket. Приоритет на клиенте: host > serverName > address. |
path | string | / | /<path>[?ed=<bytes>] | Путь WebSocket. Query-параметр ?ed=N включает 0-RTT early data объёмом до N байт. |
headers | map[string]string | {} | {<header>: <value>} | Дополнительные HTTP-заголовки. Указывать здесь host — устаревший приём; используйте поле host верхнего уровня. |
acceptProxyProtocol | bool | false | true | false | Входящее подключение — принимать PROXY protocol на нижележащем TCP-соединении. |
heartbeatPeriod | uint32 | 0 (disabled) | <seconds> | Отправлять ping-кадры WebSocket с этим интервалом, чтобы поддерживать NAT-отображения живыми. 0 — отключено. |
Исходный код: infra/conf/transport_method.go:608-614 · зафиксировано на v26.9.9 (52a412d)
network: httpupgrade
Более лёгкий родственник WebSocket: использует рукопожатие HTTP Upgrade, но без полного WebSocket-кадрирования после него. Поток после рукопожатия — просто байты, что экономит несколько процентов CPU ценой преимуществ WS-кадрирования (например, кодов закрытия).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
host | string | (server address) | <hostname> | HTTP-заголовок Host. |
path | string | / | /<path>[?ed=<bytes>] | Обслуживаемый путь. ?ed=N включает early data. |
headers | map[string]string | {} | {<header>: <value>} | Дополнительные заголовки запроса. host здесь запрещён — задавайте его через поле host верхнего уровня. |
acceptProxyProtocol | bool | false | true | false | Принимать PROXY protocol на нижележащем TCP-соединении. |
Исходный код: infra/conf/transport_method.go:650-655 · зафиксировано на v26.9.9 (52a412d)
network: grpc
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
authority | string | (server address) | <authority> | Псевдозаголовок HTTP/2 :authority, отправляемый в gRPC-запросе. |
serviceName | string | (required) | <service path> | Имя gRPC-сервиса. Полный путь запроса — /{serviceName}/Tun или /{serviceName}/TunMulti в зависимости от multiMode. |
multiMode | bool | false | true | false | Мультиплексировать множество логических потоков в одном двунаправленном gRPC-потоке. Снижает задержку для коротких соединений. |
idle_timeout | int32 | 60 | <seconds> | Тайм-аут простоя gRPC-соединения. По истечении интервала пиру отправляется ping; отсутствие ответа закрывает соединение. |
health_check_timeout | int32 | 20 | <seconds> | Тайм-аут ожидания ответа на ping. |
permit_without_stream | bool | false | true | false | Разрешить keepalive-пинги gRPC даже без активного потока. |
initial_windows_size | int32 | 0 (lib default) | <bytes> | Начальный размер окна HTTP/2 на уровне потока. Полезно для каналов с большим BDP. |
user_agent | string | (lib default) | <UA string> | User-Agent, отправляемый на нижележащем HTTP/2-соединении. |
Исходный код: infra/conf/transport_method.go:573-582 · зафиксировано на v26.9.9 (52a412d)
network: mkcp
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
mtu | *uint32 | 1350 | >= 21 | Максимальный размер сегмента mKCP в байтах. Не меньше 21. |
tti | *uint32 | 50 | 10-1000 ms | Интервал передачи в миллисекундах (10–1000). Меньшие значения — более быстрые повторные передачи ценой нагрузки на CPU. |
uplinkCapacity | *uint32 | 5 | <MB/s> | Оценка полосы отдачи в МБ/с. mKCP использует её для расчёта окна отправки. |
downlinkCapacity | *uint32 | 20 | <MB/s> | Оценка полосы загрузки в МБ/с. |
cwndMultiplier | *uint32 | (default) | >= 1 | Множитель окна перегрузки — задаёт, насколько агрессивно mKCP наращивает окно. Не меньше 1. |
maxSendingWindow | *uint32 | (default) | >= mtu | Верхняя граница окна отправки. Должна быть не меньше mtu, иначе конфигурация отклоняется при сборке. |
header | json.RawMessage | (ignored) | (use finalmask mkcp-legacy) | Разбирается, но игнорируется — используйте элемент mkcp-legacy в finalmask.udp (см. «Примечания»). |
seed | *string | (ignored) | (use finalmask mkcp-legacy) | Разбирается, но игнорируется, как и header. Seed задаётся в value элемента finalmask mkcp-legacy. |
Исходный код: infra/conf/transport_method.go:522-532 · зафиксировано на v26.9.9 (52a412d)
network: splithttp (XHTTP)
XHTTP — современный транспорт Xray с поддержкой HTTP/2 и HTTP/3. У него 30 полей — эта страница описывает самые используемые; остальные разбираются на отдельной странице SplitHTTP.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
host | string | (server address) | <hostname> | HTTP-заголовок Host. |
path | string | / | /<path> | Префикс пути. |
mode | string | auto | auto | packet-up | stream-up | stream-one | Режим кадрирования SplitHTTP. auto согласуется с сервером. packet-up отправляет каждую запись прикладного уровня отдельным POST; stream-up использует один долгоживущий POST; stream-one держит на том же TCP-соединении открытым даже ответ. |
headers | map[string]string | {} | {<header>: <value>} | Дополнительные заголовки, добавляемые к каждому запросу. |
xPaddingBytes | Int32Range | (unset) | {from, to} | Диапазон случайных байтов паддинга, добавляемых к каждому запросу. |
xmux | XmuxConfig | (unset) | XmuxConfig | Настройка пула соединений X-Mux. |
downloadSettings | *StreamConfig | (unset) | StreamConfig | Альтернативные stream-настройки для половины загрузки (асимметричные схемы, например отдача через SplitHTTP, а загрузка по чистому TLS). |
Исходный код: infra/conf/transport_method.go:256-287 · зафиксировано на v26.9.9 (52a412d)
Оставшиеся поля покрывают продвинутое формирование трафика (xPaddingObfsMode, xPaddingKey, sessionIDKey, sessionIDPlacement, seqPlacement, uplinkDataKey, …) и пул соединений X-Mux (maxConcurrency, maxConnections, cMaxReuseTimes, …).
Примеры
WebSocket + TLS:
{
"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:
{
"streamSettings": {
"network": "grpc",
"security": "reality",
"grpcSettings": {
"serviceName": "GunService",
"multiMode": true,
"idle_timeout": 60
},
"realitySettings": { /* ... */ }
}
}XHTTP + REALITY с асимметричной загрузкой:
{
"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": { /* ... */ }
}
}Примечания
- В Xray-core нет транспорта
network: "http"(HTTP/2). Используйте вместо негоsplithttp(XHTTP) — он покрывает HTTP/2 и HTTP/3. pathWebSocket принимает query-параметр?ed=<bytes>, кодирующий максимальный размер early data. Параметр вырезается из пути, уходящего на провод, и применяется как настройка транспорта при сборке конфигурации.- HttpUpgrade отклоняет
hostвнутриheadersс явной ошибкой (infra/conf/transport_method.go:672-674). WebSocket для той же схемы лишь выдаёт предупреждение об устаревании. - У mKCP нет логического
congestionи полейreadBufferSize/writeBufferSize; поведение при перегрузке настраивается черезcwndMultiplier(множитель роста окна, ≥ 1) иmaxSendingWindow(потолок окна, ≥mtu). - Поля
headerиseedв mKCP разбираются, но игнорируются. Их эквивалент — элементmkcp-legacyвstreamSettings.finalmask.udp:settings.headerвыбирает маскировку заголовком (dns,dtls,srtp,utp,wechat,wireguard; дляdnsвvalueуказывается домен), а безheadersettings.value— это seed: пустое значение даёт обычную обфускацию mKCP, непустое — AES-128-GCM с этим ключом (infra/conf/transport_finalmask.go:598-631). - finalmask — подсистема маскировки пакетов в Xray (
transport/internet/finalmask/*). Она предоставляет подключаемые строительные блоки, выбираемые по типу, — TCP-маскиheader-custom,fragment,sudoku,xmc; UDP-маскиheader-custom,mkcp-legacy,noise,salamander,sudoku,xdns,xicmp,realm,udphop(infra/conf/transport_finalmask.go:72-89), — включая небольшой DSL выраженийtransformдля побайтовой перезаписи.udphop— клиентская маска скачков портов, описанная на странице Hysteria2. Это продвинутая область; полную схему по каждому типу см. в апстрим-пакете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:231-655 · v26.9.9 (52a412d)
