Народный

Протоколы

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-сайты делают именно так.

Как работает

Главная идея — асимметричное разделение направления передачи. Алгоритм:

  1. TLS-handshake. Стандартный TLS 1.3 к домену, SNI настоящий, сертификат валидный.
  2. Initialize session. Клиент шлёт первый POST /sessionId/0 с initial-payload (VLESS-header + первые данные). Сервер возвращает 200 OK.
  3. Open download-stream. Параллельно клиент шлёт GET /sessionId с заголовком Accept: text/event-stream. Сервер ОТВЕЧАЕТ долгим chunked-response, в который пишет downstream-трафик по мере поступления.
  4. Upload chunks. Каждый блок upload-данных идёт отдельным POST /sessionId/N (где N — sequence number). Сервер собирает в правильном порядке.
  5. 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 — реализации.

Источники