Транспорт — 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:232-235 · зафиксировано на v26.7.28 (5ca6f4b)
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:613-619 · зафиксировано на v26.7.28 (5ca6f4b)
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:655-660 · зафиксировано на v26.7.28 (5ca6f4b)
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:578-587 · зафиксировано на v26.7.28 (5ca6f4b)
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. Заменяет старый логический переключатель `congestion`. |
maxSendingWindow | *uint32 | (default) | >= mtu | Верхняя граница окна отправки. Должна быть не меньше `mtu`, иначе конфигурация отклоняется при сборке. |
header | json.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.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
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:257-288 · зафиксировано на v26.7.28 (5ca6f4b)
Оставшиеся поля покрывают продвинутое формирование трафика (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": { /* ... */ }
}
}Примечания
network: "http"(транспорт HTTP/2) из Xray-core удалён. Используйте вместо негоsplithttp(XHTTP) — он покрывает HTTP/2 и HTTP/3.pathWebSocket принимает 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)
