Протоколы
HTTPUpgrade — HTTP/1.1 Upgrade transport для VLESS
Новый транспортный слой для VLESS и Trojan, добавленный в xray-core и sing-box в 2024 году: использует механизм HTTP/1.1 Upgrade для маскировки под обычный WebSocket-like трафик, но без overhead WS-фрейминга.
Определение
HTTPUpgrade — это транспортный слой для VLESS / Trojan / Shadowsocks, использующий механизм HTTP/1.1 Upgrade header (RFC 7230) для перехода с HTTP-handshake на сырой TCP-stream после успешного запроса. Добавлен в xray-core 1.8.7 (январь 2024) и в sing-box 1.7 (февраль 2024) как промежуточное решение между классическим WebSocket и более тяжёлым gRPC-transport.
Идея: повторить WS-маскировку (через nginx reverse-proxy с HTTP-handshake’ом и path’ом), но избавиться от overhead WebSocket-фрейминга (4–14 байт на каждый фрейм).
Как работает
HTTPUpgrade выглядит как обычный HTTP/1.1 GET-запрос с заголовком Upgrade: websocket (или custom), на который сервер отвечает 101 Switching Protocols, после чего TCP-соединение переходит в режим сырых байт без WS-фреймов. Алгоритм:
- TLS handshake. Клиент устанавливает TLS 1.3 к сервер-домену (обычно через CDN или nginx). SNI настоящий, сертификат настоящий.
- HTTP GET. Клиент шлёт:
GET /your-path HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: ... Sec-WebSocket-Version: 13 - Server response. Сервер (xray / sing-box) отвечает:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade - Raw TCP. С этого момента TCP-stream — это сырой VLESS-трафик. Никаких WS-frame-header’ов, никаких opcode-байт. Просто payload.
Отличия от WebSocket:
- WebSocket добавляет 4–14 байт header’а на каждый фрейм + mask-байты (на клиенте всегда), что замедляет throughput.
- HTTPUpgrade делает один handshake, дальше — нулевой overhead.
- WebSocket поддерживает ping/pong frames для keepalive, HTTPUpgrade нет — keepalive на уровне TCP.
Совместимость с reverse-proxy. HTTPUpgrade проходит через nginx, Caddy, traefik как обычный WebSocket-upgrade. Сервер видит legitimate HTTP/1.1 запрос с Upgrade header и устанавливает passthrough. Это позволяет коэкзистировать с настоящим веб-сайтом на том же домене.
Применение в России 2026
HTTPUpgrade — рекомендованный transport для VLESS в РФ если нужна CDN-маскировка. Когда выбирать его над альтернативами:
- vs WebSocket-transport. HTTPUpgrade быстрее на 5–10% за счёт отсутствия WS-фрейминга. Маскировка от ТСПУ одинаковая (оба смотрят как HTTPS-веб-трафик после handshake).
- vs SplitHTTP. SplitHTTP сильнее обфусцирован (множественные GET/POST), но имеет больший latency. HTTPUpgrade — single-connection.
- vs Raw TCP. Raw TCP без транспорта быстрее всех, но не работает за CDN (Cloudflare/Fastly требуют HTTP-handshake).
- vs gRPC. gRPC требует HTTP/2, что у некоторых CDN ограничено или дорого. HTTPUpgrade использует HTTP/1.1 — работает везде.
Setup. В xray-config:
"streamSettings": {
"network": "httpupgrade",
"httpupgradeSettings": {
"path": "/your-secret-path",
"host": "example.com"
},
"security": "tls"
}
Когда не использовать. Если у вас direct-VPS без CDN — лучше Reality без транспорта. HTTPUpgrade нужен именно для CDN-сценариев или для коэкзистанса с реальным веб-сайтом на том же сервере.
Юзеру: HTTPUpgrade — это «WebSocket для тех, кому жалко overhead’а». Если ваш провайдер использует WS — попросите попробовать HTTPUpgrade, скорость на slow-connection ощутимо выше.
Связанные термины
VLESS — основной протокол. WebSocket transport — предшественник. SplitHTTP — альтернатива с более сильной обфускацией. Xray-core и Sing-box — реализации.
Источники
- GitHub: XTLS/Xray-core — HTTPUpgrade PR — оригинальный pull request.
- Sing-box documentation — HTTPUpgrade — конфиг-формат.
- RFC 7230 (HTTP/1.1) §6.7 — Upgrade mechanism.