Протоколы
SplitHTTP — split-HTTP transport для VLESS / Trojan
Транспортный слой для VLESS / Trojan / Shadowsocks с разделением upload и download потоков на разные HTTP-запросы: upload через POST, download через долгий GET; усиленная маскировка под обычный веб-трафик.
Определение
SplitHTTP — это транспортный слой для VLESS / Trojan / Shadowsocks, разделяющий upload и download потоки на отдельные HTTP-запросы: клиент шлёт upload-данные через серии POST-запросов, а server-side push приходит через долгий GET-запрос (long-polling pattern). Реализован в xray-core 1.8.10 (март 2024) и в sing-box 1.8 (апрель 2024).
Цель — максимально размыть трафик под легитимный браузерный паттерн: AJAX-запросы + long-polling SSE / fetch streaming. Идея пришла из эволюции «mux.cool» (multiplexing для xray) и из наблюдения, что массовые SaaS-сайты делают именно так.
Как работает
Главная идея — асимметричное разделение направления передачи. Алгоритм:
- TLS-handshake. Стандартный TLS 1.3 к домену, SNI настоящий, сертификат валидный.
- Initialize session. Клиент шлёт первый POST
/sessionId/0с initial-payload (VLESS-header + первые данные). Сервер возвращает 200 OK. - Open download-stream. Параллельно клиент шлёт GET
/sessionIdс заголовкомAccept: text/event-stream. Сервер ОТВЕЧАЕТ долгим chunked-response, в который пишет downstream-трафик по мере поступления. - Upload chunks. Каждый блок upload-данных идёт отдельным POST
/sessionId/N(где N — sequence number). Сервер собирает в правильном порядке. - Keepalive. Через каждые ~25 секунд клиент шлёт пустой POST для удержания state’а.
Параметры конфига:
path— путь, по которому работает SplitHTTP (/your-secret/path/).maxUploadSize— максимум байт в одном POST до начала нового (по умолчанию 1MB).minUploadIntervalMs/maxUploadIntervalMs— рандомизация задержки между POST’ами для рассеивания тайминг-анализа.host— Host-header (для virtual hosting).
Отличия от WebSocket / HTTPUpgrade:
- WS / HTTPUpgrade — единый bidirectional stream после handshake. Длинное TCP-соединение, лёгкая статистическая детекция по тому, что одна connection живёт часами.
- SplitHTTP — множественные короткие POST’ы + один long-poll GET. Выглядит как обычная веб-страница с AJAX. Тяжелее статистически отличить от легитимного SaaS-трафика.
Применение в России 2026
SplitHTTP — самый параноидальный transport для CDN-маскировки в РФ. Когда оправдан:
- ТСПУ начал блокировать ваш WS / HTTPUpgrade-VPN после нескольких недель работы, IP «спалился».
- Вы хостите VPN-endpoint на CDN (Cloudflare, Fastly) и хотите минимизировать статистическую вероятность фингерпринтинга.
- У вас high-throughput сценарий — SplitHTTP позволяет parallel POST’ы для upload, что иногда быстрее single-stream.
Когда НЕ оправдан:
- High-latency сценарий. Длинная цепочка коротких POST’ов добавляет 20–50 мс per round-trip overhead. Для VoIP / gaming не подходит.
- Прямой VPS без CDN. Используйте Reality — оно сильнее на direct-connection.
- Mobile-сеть с frequent reconnects. SplitHTTP плохо переживает обрыв long-poll GET’а — нужен полный reconnect.
Setup. В xray-config:
"streamSettings": {
"network": "splithttp",
"splithttpSettings": {
"path": "/api/v1/sse",
"host": "example.com",
"maxUploadSize": 1000000
},
"security": "tls"
}
Маскировка ещё сильнее, если path имитирует реальный API (/api/v1/messages, /ws/inbox, /sse/stream), и Host совпадает с фасадным доменом (например, blog на Hugo / Astro на том же сервере).
Юзеру: SplitHTTP — это «WebSocket для параноиков». Если простой VLESS + WS работает у вас стабильно — нет смысла переходить. Если ТСПУ давит — попросите провайдера попробовать SplitHTTP, обычно ситуация улучшается.
Связанные термины
VLESS — базовый протокол. HTTPUpgrade — single-stream альтернатива. WebSocket transport — старый стандарт. Xray-core и Sing-box — реализации.
Источники
- GitHub: XTLS/Xray-core — SplitHTTP PR — оригинальная реализация.
- Sing-box — splithttp transport — конфигурация.
- Project X documentation — общая документация по транспортам.