Názor k článku Velké trable s malým MTU od Ondřej Caletka - Odpověď na tyto otázky jsem vložil do odstavce...

  • Článek je starý, nové názory již nelze přidávat.
  • 9. 1. 2013 9:24

    Ondřej Caletka
    Zlatý podporovatel

    Odpověď na tyto otázky jsem vložil do odstavce nad podnadpisem „Objevování MTU cesty,“ zkusím to tedy napsat ještě jinak a podrobněji.

    U TCP to nechapu vubec. Vzdyt prece tim, ze se (aplikacni) programator rozhodne pouzit TCP, tak od toho v podstate dava ruce pryc se slovy "delejte si s tim cestou, co chcete, hlavne at do dorazi neporuseny a ve spravnem poradi".

    Ano, a taky takový programátor chce, aby spojení fungovalo co nejkvalitněji. A k tomu právě pomůže vypnutí fragmentace. Fragmentace totiž neobsahuje žádné opravné prostředky pro náhradu ztracených fragmentů. Když se TCP segment velikosti 3000 B rozdělí na 1200, 1200 a 600 B dlouhé fragmenty a kterýkoli z nich se ztratí, je celý segment ztracený. Proto se snaží TCP stack přizpůsobit velikost segmentu MTU cesty, aby se segmenty dále nefragmentovaly.

    Jenže TCP stack vidí jen MTU rozhraní, aby mohl zjistit MTU cesty, musí nutně odesílat pakety s flagem DF (a doufat v to, že obdrží ICMP zprávu při zahození). Kdyby přizpůsobil velikost segmentu pouze MTU rozhraní, dopadlo by to třeba u xDSL dost tragicky - odeslal by segment 1460+20(TCP)+­20(IPv4) B, který by se hned na xDSL modemu rozfragmentoval na 1452+20+20 a 8+20+20 B. Takže i když by nebyl problém se ztrátovostí, rozhodně by přenos neprobíhal hospodárně a tedy ani nedosahoval maximální možné rychlosti.

    A u UDP uz programator tak nejak pocita s tim, ze se cestou muze stat cokoliv. A kdyz se boji, tak bude odesilat minimalni pakety, aby to proslo vzdycky.

    Ano, u UDP musí programátor počítat s tím, že se může kterýkoli paket ztratit. Zároveň ale předpokládá, že procento ztracených paketů se nebude blížit stovce. Odesílat vždy dostatečně krátké UDP zprávy je možnost (rozebíral jsem to ve vedlejším příspěvku), ale v podstatě to znamená vybudovat si v aplikaci něco jako TCP. Spousta aplikací pro UDP protokol je ale zprávově orientovaná (například DNS) a každá UDP zpráva je právě tak dlouhá, kolik v ní je potřeba přenést dat.

    Mimochodem, pokud taková velká UDP zpráva někde na cestě zahozena (a odesílatel obdrží ICMP zprávu o zahození), odesílatelův UDP/IP stack stejně už nemá možnost zprávu rozdělit na fragmenty znovu, protože odesláním zprávy je vymazána z bufferu. Stane se tedy jenom to, že odesílatel si poznamená snížené MTU cesty k danému cíli a čeká na aplikační vrstvu, až se rozhodne UDP zprávu poslat znovu.