MSS
MSS (Maximum Segment Size) — максимальный размер payload'а TCP-сегмента без заголовков. Клиент и сервер объявляют MSS в SYN-пакете, и дальше не отсылают TCP-сегменты больше этого.
Как считается
MSS = MTU - IP header - TCP header
= 1500 - 20 - 20 = 1460 (стандарт Ethernet, IPv4)
= 1500 - 40 - 20 = 1440 (IPv6)
= 1492 - 20 - 20 = 1452 (PPPoE, DSL)
= 1450 - 20 - 20 = 1410 (внутри VXLAN)
= 1420 - 20 - 20 = 1380 (WireGuard)
Каждый туннель отнимает свой overhead — итоговый MSS падает.
Обмен MSS в TCP handshake
Client → Server: SYN, MSS=1460
Server → Client: SYN+ACK, MSS=1460
Client → Server: ACK
Дальше: min(client MSS, server MSS) — эффективное MSS сессии
Опция кодируется как 0x02 0x04 0x05 0xB4 в TCP options (0x05B4 = 1460).
Проблема — MSS clamping
Хосты за туннелем (VPN, PPPoE) могут не знать что реальный MTU меньше. Они шлют пакеты 1460 байт → на пути пакет становится 1500+overhead и фрагментируется или дропается (если DF-flag).
Решение — MSS clamping: роутер/файрвол переписывает MSS в проходящих SYN-пакетах на меньшее значение, форсируя стороны использовать меньше.
Linux iptables clamping
# Автоматически по MTU интерфейса
iptables -t mangle -A FORWARD \
-o wg0 -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
# Или явное значение
iptables -t mangle -A FORWARD \
-o eth0 -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --set-mss 1380
Cisco / Mikrotik
! Cisco IOS
interface Tunnel0
ip tcp adjust-mss 1380
# Mikrotik RouterOS
/ip firewall mangle add chain=forward \
protocol=tcp tcp-flags=syn action=change-mss \
new-mss=clamp-to-pmtu out-interface=wg0
Симптомы проблем с MSS
- Соединение открывается (маленькие пакеты проходят: DNS, SYN, ACK).
- Большие ответы — зависают. Веб-страница «загружает», но не показывает.
- SSH работает интерактивно, но
lsс большим выводом — виснет. - Скачивание файлов зависает после нескольких пакетов.
Классический признак — работает через один прокси/VPN, ломается через другой.
MSS vs MTU vs Segment size
| Термин | Что |
|---|---|
| MTU | Максимальный размер IP-пакета целиком (заголовки + данные) |
| MSS | Максимальный payload TCP (данные приложения в одном сегменте) |
| Segment | TCP-единица передачи |
| Frame | Ethernet-единица (MTU + Ethernet header) |
| Packet | IP-единица (MTU целиком) |
Path MTU Discovery
Правильный способ узнать MTU пути — PMTUD. TCP использует ICMP «Fragmentation Needed» и подстраивается. Но ICMP часто блокируют → black hole. MSS clamping — workaround «руками задать поменьше».
Реальные значения
| Сценарий | MSS |
|---|---|
| Ethernet, обычный интернет | 1460 |
| Ethernet + IPv6 | 1440 |
| PPPoE (DSL) | 1452 |
| IPsec transport | ~1420 |
| IPsec tunnel | ~1380 |
| OpenVPN default | ~1380 |
| WireGuard | ~1380 |
| Tor | 498 (жёстко) |
| Jumbo Ethernet (9000) | 8960 |