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

Классический признак — работает через один прокси/VPN, ломается через другой.

MSS vs MTU vs Segment size

ТерминЧто
MTUМаксимальный размер IP-пакета целиком (заголовки + данные)
MSSМаксимальный payload TCP (данные приложения в одном сегменте)
SegmentTCP-единица передачи
FrameEthernet-единица (MTU + Ethernet header)
PacketIP-единица (MTU целиком)

Path MTU Discovery

Правильный способ узнать MTU пути — PMTUD. TCP использует ICMP «Fragmentation Needed» и подстраивается. Но ICMP часто блокируют → black hole. MSS clamping — workaround «руками задать поменьше».

Реальные значения

СценарийMSS
Ethernet, обычный интернет1460
Ethernet + IPv61440
PPPoE (DSL)1452
IPsec transport~1420
IPsec tunnel~1380
OpenVPN default~1380
WireGuard~1380
Tor498 (жёстко)
Jumbo Ethernet (9000)8960

См. также