Транспорт — sing-box
Параметры транспорта sing-box располагаются в блоке transport, встроенном в каждый входящий и исходящий с поддержкой TLS. Блок полиморфный: поле type выбирает один из пяти вариантов транспорта, и применяется соответствующее подмножество полей.
"transport": { "type": "<ws|http|grpc|quic|httpupgrade>", ...variant fields }type: "ws"
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
path | string | / | /<path> | Путь WebSocket. |
headers | badoption.HTTPHeader | {} | {<header>: <value or list>} | Дополнительные заголовки запроса upgrade. |
max_early_data | uint32 | 0 | <bytes> | Максимум байт ранних данных 0-RTT, буферизуемых до завершения WS-рукопожатия. 0 отключает. |
early_data_header_name | string | Sec-WebSocket-Protocol | <header name> | HTTP-заголовок, несущий ранние данные в base64, когда сервер ожидает их под нестандартным именем. |
Исходный код: option/v2ray_transport.go:94-99 · зафиксировано на v1.14.2 (af6e64c)
type: "http" (HTTP/2)
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
host | badoption.Listable[string] | [] | [<hostname>] | Список значений заголовка Host. Сервер использует список для сопоставления SNI; клиент выбирает одно случайно на каждый запрос. |
path | string | / | /<path> | HTTP-путь. |
method | string | PUT | <HTTP method> | HTTP-метод. Стандартный транспорт использует PUT, чтобы препятствовать кэшированию. |
headers | badoption.HTTPHeader | {} | {<header>: <value or list>} | Дополнительные заголовки запроса. |
idle_timeout | badoption.Duration | 0 | <duration> | Сервер: закрывать HTTP/2-клиентов, простаивающих столько времени (GOAWAY). Клиент: отправлять PING для проверки соединения, если за это время не получено ни одного кадра. 0 отключает оба механизма. |
ping_timeout | badoption.Duration | 15s | <duration> | HTTP/2-клиент: сколько ждать ответа на PING перед закрытием соединения. 0 означает умолчание 15s; PING отправляются, только если задан idle_timeout. |
Исходный код: option/v2ray_transport.go:85-92 · зафиксировано на v1.14.2 (af6e64c)
При включённом объемлющем блоке TLS HTTP-транспорт использует HTTP/2; TLS не обязателен, и без него транспорт откатывается на обычный HTTP/1.1. Режима HTTP/3 нет.
type: "grpc"
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
service_name | string | (required) | <service path> | Имя gRPC-сервиса. |
idle_timeout | badoption.Duration | 0 | <duration> | Тайм-аут простоя. 0 отключает. |
ping_timeout | badoption.Duration | 0 | <duration> | Тайм-аут keepalive-пингов. 0 отключает PING. |
permit_without_stream | bool | false | true | false | Разрешить PING без активного потока. |
Исходный код: option/v2ray_transport.go:103-109 · зафиксировано на v1.14.2 (af6e64c)
type: "quic"
Структура QUIC-транспорта не имеет пользовательских полей — это просто { "type": "quic" }. Вся настройка QUIC происходит на уровне протокола (у Hysteria2 / TUIC собственные нативные QUIC-стеки).
type: "httpupgrade"
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
host | string | (server address) | <hostname> | Заголовок HTTP Host. |
path | string | / | /<path> | HTTP-путь. |
headers | badoption.HTTPHeader | {} | {<header>: <value or list>} | Дополнительные заголовки запроса. |
Исходный код: option/v2ray_transport.go:111-115 · зафиксировано на v1.14.2 (af6e64c)
Примеры
WebSocket + TLS:
{
"outbounds": [{
"type": "vless",
"server": "example.com",
"server_port": 443,
"uuid": "...",
"tls": {
"enabled": true,
"server_name": "example.com"
},
"transport": {
"type": "ws",
"path": "/vl",
"headers": { "Host": "example.com" }
}
}]
}gRPC + REALITY:
{
"outbounds": [{
"type": "vless",
"server": "example.com",
"server_port": 443,
"uuid": "...",
"tls": {
"enabled": true,
"server_name": "www.cloudflare.com",
"utls": { "enabled": true, "fingerprint": "chrome" },
"reality": { "enabled": true, "public_key": "...", "short_id": "..." }
},
"transport": {
"type": "grpc",
"service_name": "GunService",
"idle_timeout": "60s",
"ping_timeout": "20s",
"permit_without_stream": true
}
}]
}HTTP/2 (HTTP-транспорт поверх TLS):
{
"outbounds": [{
"type": "vless",
"server": "example.com",
"server_port": 443,
"uuid": "...",
"tls": {
"enabled": true,
"server_name": "example.com",
"alpn": ["h2"]
},
"transport": {
"type": "http",
"host": ["example.com"],
"path": "/h2",
"method": "PUT"
}
}]
}Примечания
- sing-box не содержит отдельного транспорта SplitHTTP / XHTTP. Ближайший эквивалент —
type: "http"(HTTP/2 поверх TLS); режима HTTP/3 у HTTP-транспорта нет. - Keepalive-пинги управляются только
idle_timeout: при0(по умолчанию) они не отправляются, аping_timeout: 0лишь означает умолчание 15s. Для долгоживущих соединений за NAT задайтеidle_timeoutвроде"30s", чтобы нижележащее TCP-соединение видело периодическую активность. - Поле
hostуtype: "http"— это список. Сервер использует его для сопоставления SNI (подходит любое значение); клиент выбирает одно случайно на каждый запрос — полезно, когда вышестоящий балансировщик нагрузки маршрутизирует по заголовку Host. early_data_header_nameу WebSocket по умолчанию —Sec-WebSocket-Protocol, тот же заголовок, что и у V2Ray. Переопределяйте, только если вышестоящий прокси вырезает этот заголовок.
Сравнение с другими ядрами
- Xray-core использует
streamSettings.network+ блок*Settingsдля каждого транспорта, с вариантами TCP, mKCP и SplitHTTP/XHTTP, которых нет в sing-box. См. Транспорт — Xray-core. - mihomo распределяет настройки транспорта по блокам
*-optsдля каждого протокола в каждой записи прокси. См. Транспорт — mihomo.
Исходный код: option/v2ray_transport.go:85-115 · v1.14.2 (af6e64c)
