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. Táto hodnota sa označuje aj MTU (Maximum Transmission Unit), na zariadeniach MikroTik je ju možné definovať pre každé rozhranie. Veľkosť paketu 1500 B v L3 zodpovedá limitu 1518 B v L2 pre ethernet. 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).
Čo sa stane, pokiaľ odošleme L3 paket veľkosti 1500 B cez rozhranie s nižším MTU?
Môžu nastať dve situácie: Buď sa paket rozdelí (fragmentuje) na dve časti do dvoch rámcov - napríklad pri MTU 1492 sa v 1. rámci odošle 1492 B a v 2. rámci zvyšných 8 B. Vzhľadom na L2 hlavičky sa takýto prenos stane pomerne neefektívnym. Alebo sa neodošle vôbec - to nastane v situácii, že je fragmentácia zakázaná. V protokole IPv6 je fragmentácia možná len na strane odosielateľa, smerovačom na trase to nie je dovolené, tie príliš veľký paket proste zahodia.
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 PPPoE realizované na zariadení od ISP, 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.
Praktická situácia pri IPv6 tuneli (6to4) bude nasledovná: Keďže tunel 6to4 „berie“ 20 B pre hlavičky v L2, jeho bežné MTU bude 1480 B. Pozor, pokiaľ tunel realizujeme cez PPPoE spojenie, veľkosť MTU bude 1492 - 20 = 1472 B!
Čo sa stane, pokiaľ je jeden koniec tunela vedený cez bežné ethernet rozhranie a druhý koniec cez PPPoE rozhranie?
Pokiaľ nastavenia nijako neupravíme, na ethernet konci bude MTU tunela 1480 B a na PPPoE konci 1472 B. Ak odosielatelia prispôsobia veľkosť paketov svojmu MTU (rozoberieme nižšie v texte), prenosy z PPPoE konca budú bezproblémové. No prenosy z ethernet konca budú presahovať veľkosť paketu, a teda nastane fragmentácia, čo zníži rýchlosť v tomto smere prenosu (v praktickom experimente až o cca 30 %). Preto je dôležité na oboch koncoch definovať rovnakú hodnotu MTU, a to tú nižšiu.
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 ďalšieho smerovača ISP s PPPoE, ktorý takúto zmenu nerobí) je vhodné vynútiť zmenu MSS na smerovači MikroTik - ide 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"
V uvedenej situácii tunela 6to4 je však priamo v rozhraní tunela uvedená hodnota MTU (resp. je ju možné zmeniť) a tiež je možné zapnúť funkciu Clamp TCP MSS (v predvolenom stave je zapnutá). Vďaka tomu bude smerovač upravovať MSS automaticky, no len pri prichádzajúcich údajov. Pokiaľ je rovnaká funkcia zapnutá aj na druhom konci tunela (a má rovnakú hodnotu MTU), všetko bude fungovať. No ak nie, musíme zmenu MSS vynútiť vyššie uvedeným pravidlom pre Mangle alebo jednoduchším variantom: nie je potrebné špecifikovať podmienku veľkosti MSS a ani nastavovať konkrétnu veľkosť - do akcie Change MSS zvolíme možnosť „clamp to pmtu“. Vykonať to môžeme aj príkazom:
/ipv6 firewall mangle
add chain=forward out-interface=6to4-tunel protocol=tcp tcp-flags=syn action=change-mss new-mss=clamp-to-pmtu 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). Menej zreteľným prejavom je už spomínaná znížená rýchlosť prenosu.