Сеть
TCP Multiplexing — несколько streams в одном TCP-connection
Техника передачи нескольких логических потоков (streams) через один TCP-connection. Используется в smux/yamux/v2ray-mux для уменьшения handshake-overhead и обхода SYN-rate-limit DPI.
Определение
TCP Multiplexing (mux) — техника передачи нескольких независимых логических потоков (streams) через единственный TCP-connection. Каждый stream имеет свой ID и буфера; данные разных streams чередуются (interleaved) на проводе, но логически изолированы. Юзер открывает 10 параллельных HTTP-запросов — все идут через один TCP-сокет вместо 10 отдельных.
В VPN-туннелях mux решает три задачи: (1) уменьшение TCP handshake overhead, (2) сокрытие количества параллельных подключений от DPI, (3) обход SYN-rate-limit на провайдерской стороне.
Зачем нужен
Без mux — типичная сессия открытия 10 сайтов:
- 10 TCP-handshake к VPN-серверу.
- 10 TLS-handshake поверх каждого.
- 10 параллельных потоков на VPN-сервере.
- DPI видит «всплеск SYN-пакетов» — характерная сигнатура VPN.
С mux:
- 1 TCP-handshake к VPN-серверу.
- 1 TLS-handshake.
- Множество streams внутри.
- DPI видит «один долгий устойчивый коннект».
Реализации
- smux (
xtaci/smux) — самая популярная в xray/v2ray. Версии smux v1, smux v2. - yamux (HashiCorp) — изначально для Consul, используется в sing-box.
- HTTP/2 multiplexing — стандартный в HTTP/2 transport, built-in.
- HTTP/3 streams — на уровне QUIC, не нужно отдельное mux.
- v2ray mux.cool — собственное v2ray-расширение, скоро deprecated.
Конфиг в Xray-core
{
"mux": {
"enabled": true,
"concurrency": 8,
"xudpConcurrency": 0,
"xudpProxyUDP443": "reject"
}
}
concurrency: 8 — максимум 8 параллельных streams в одном connection. После 8 mux откроет второй connection. Меньше — меньше детектируемости, больше — лучше throughput.
Mux и DPI
Плюс для обхода: меньше TCP-handshakes → меньше шансов попасть под SYN-rate-limit или ALG-fingerprinting.
Минус: размер encrypted blobs может содержать паттерны (request size + response size одной операции), которые легче статистически анализировать на одном long-lived connection. Padding частично решает.
В России 2026: ТСПУ не показывала специфической детекции mux. Mux работает «прозрачно» — DPI видит обычный TCP-stream с трафиком. Если базовый TLS/Reality проходит — с mux тоже пройдёт.
Когда отключать mux
- Hysteria 2 / TUIC (QUIC) — встроенный streams-уровень, mux над ним избыточен и ломает производительность.
- WireGuard — UDP-based, mux неприменим.
- Real-time трафик (голос, gaming) — задержка в одном stream блокирует head-of-line для других (TCP-уровень). Лучше отдельный connection.
Связь с другими transports
| Transport | Встроенный mux? |
|---|---|
| Raw TCP | Нет, mux прикручивается отдельно |
| WebSocket | Нет; нужен smux/yamux сверху |
| gRPC (HTTP/2) | Да, через HTTP/2 streams |
| HTTPUpgrade | Нет |
| SplitHTTP | Не нужен — само построение из chunked-streams |
| QUIC/Hysteria 2 | Да, на уровне транспорта |
Анти-fingerprint роль
DPI может пытаться отличать mux-трафик от обычного TLS по таким сигналам:
- Размер ClientHello: одинаковый — mux не вносит ничего.
- Long-lived connection без TLS-renegotiation — некоторая аномалия для обычного HTTPS-серфинга (там connection short-lived).
- TLS-record размеры: mux отправляет много small records подряд — паттерн не как у браузера.
Smart-padding (DAITA-style) маскирует эти сигналы.
Источники
- xtaci/smux — Go implementation.
- HashiCorp yamux docs.
- v2ray.com — Mux.Cool spec.
Связанные термины
- xray-core — основной потребитель mux.
- sing-box — альтернативный движок, тоже поддерживает.
- WebSocket transport — часто комбинируется с mux.
- gRPC transport — встроенный mux через HTTP/2.
- TCP Fast Open — другой transport-optimization.