Skip to main content

10.4 BONUS: Limity veľkosti PDU (MTU a MSS)

V súvislosti s protokolom TCP je vhodné poznať mechanizmus riadenia veľkosti segmentu.

MTU - veľkosť paketu

Vieme, že maximálna veľkosť paketu (v 3. vrstve = L3) je bežne 1500 B, čo zodpovedá limitu 1518 B v L2 pre ethernet. Táto hodnota sa označuje aj MTU (Maximum Transmission Unit), na zariadeniach MikroTik je ju možné definovať pre každé rozhranie. Hoci sa môže zdať, že s inou hodnotou MTU ako 1500 B sa prakticky ani nestretneme, opak je pravdou. Predovšetkým pri využívaní rôznych tunelov a PPPoE spojení (kam patria aj DSL pripojenia, či optické spojenia s modemom) sa zväčšujú L2 hlavičky, a teda zostane menej miesta pre L3. O hodnote MTU sa môžu komunikujúce zariadenia informovať cez ICMP správy, IPv4 pakety je možné tiež fragmentovať (rozdeliť na menšie).

Ako zistiť potrebnú hodnotu MTU? Môžeme využiť ping s rôznou definovanou veľkosťou paketu a s vypnutou fragmentáciou - v podstate hľadáme najväčšiu veľkosť, ktorá ešte prejde.

Pozor, pre ping z MikroTik zariadenia definujeme naozaj veľkosť paketu, no pre ping v operačnom systéme bežného počítača ide o veľkosť prenášanej správy! Keďže hlavička ICMPv4 má 28 B a ICMPv6 48 B, tak pri bežnom MTU 1500 B prejde zo zariadenia MikroTik pri oboch protokoloch ping veľkosti 1500 B, no z bežného počítača je to veľkosť správy 1472 B pre IPv4 a 1452 B pre IPv6. Preto je jednoduchšie testovať ping zo zariadenia MikroTik.

Praktická situácia pri PPPoE pripojení bude nasledovná: Keďže PPPoE protokol „berie“ 8 B pre hlavičky v L2, bežné MTU je 1492 B. Ak PPPoE spojenie realizujeme priamo zo smerovača MikroTik, pre toto spojenie automaticky nastaví MTU 1492 B. No pokiaľ je smerovač ISP samostatný, môže nastať problém - MikroTik smerovač nemá ako poznať MTU do internetu. Ak skúsime ping veľkosti nad 1492 B s vypnutou fragmentáciou, mala by zo smerovača ISP prísť ICMP informácia o tom, že je potrebné znížiť MTU. Problém nastane, ak by sme na firewalli blokovali všetko z WAN strany, potom táto správe nepríde. Pre istotu môžeme na WAN rozhraní nastaviť MTU 1492 B manuálne.

MSS - veľkosť segmentu

Prakticky je nevýhodné fragmentovať každý paket väčšej veľkosti, preto je vhodné, aby mala aj vyššia 4. vrstva informáciu o maximálnej veľkosti segmentu - označuje sa MSS (Maximum Segment Size). Pri nadväzovaní TCP spojenia sa komunikujúce strany navzájom informujú o svojom limite, odvodenom od veľkosti MTU - v prípade IPv4 sa od MTU odpočíta 40 B hlavičiek (teda pri „bežnom“ MTU ide o 1460 B), v prípade IPv6 je to 60 B (bežne 1440 B). Bude to teda všetko fungovať hneď? Pravdepodobne nie - vo vyššie spomínanom príklade s PPPoE pripojením bude síce MTU znížené o 8 B, ale len na strane WAN, nie v LAN. Čiže pripojený počítač má MTU bežných 1500 B, a teda ohlási MSS prislúchajúce tejto hodnote.

Ak je cestou potrebné znížiť MTU, smerovače môžu (a aj by mali) informáciu o MSS v segmentoch pri prenose upraviť tak, aby nedochádzalo k zbytočnej fragmentácii. Niekedy je to veľmi jednoduché - napríklad pri konfigurácii tunelov a VPN spojení má MikroTik priamo zaškrtávacie pole pre zapnutie zmeny MSS. No niekedy (napríklad v prípade externého smerovača ISP s PPPoE) je vhodné vynútiť zmenu MSS na smerovači - jedná sa o WinBox ponuku IP → Firewall → Mangle:

  • reťaz forward,
  • výstupné rozhranie WAN so zníženým MTU,
  • protokol TCP,
  • TCP príznak SYN,
  • veľkosť TCP MSS od hodnoty vyššej ako limit po 65535 (napríklad pre PPPoE: 1453-65535),
  • akcia Change MSS na maximálny limit (napríklad pre PPPoE: 1452).

Môžeme využiť aj príkaz:

/ip firewall mangle
add chain=forward out-interface=ether1-wan protocol=tcp tcp-flags=syn tcp-mss=1453-65535 action=change-mss new-mss=1452 passthrough=yes comment="zmena MSS pre PPPoE"

V prípade IPv6 je hranica o 20 B nižšia, no ak pre IPv6 používame tunel 6to4, ten sám má MTU znížené na 1480 B a pokiaľ je nadviazaný cez PPPoE pripojenie, bude MTU len 1472 B! Keďže MSS bude menšie o 60 B hlavičiek IPv6, úprava MSS by v prípade PPPoE mala byť:

/ipv6 firewall mangle
add chain=forward out-interface=6to4-tunel protocol=tcp tcp-flags=syn tcp-mss=1413-65535 action=change-mss new-mss=1412 passthrough=yes comment="zmena MSS pre 6to4"

Netreba zabúdať, že MSS sa týka len TCP segmentov a ničoho iného - nenahrádza teda MTU.

Ako sa prejavujú zle nastavené hodnoty MTU/MSS? Najrýchlejšie si všimneme, že niektoré weby (ktoré maximalizujú MSS) sa nenačítajú, známym príkladom sú služby Yahoo (napríklad Yahoo Search).