Wracamy trochę do tematów bardziej sieciowych. Ostatnio było dużo o hackerach i włamaniach, ale prawda jest taka, że mamy dość gorący okres, ze wzgledu na dużo wydań i pojawienie się niechlubnych dziur w niektórych systemach, o których warto wiedzieć. Dzisiaj opowiemy Wam troszkę o wysyłaniu pakietów w sieci.
W sieci komputerowej możemy określić maksymalną jednostkę transmisji (MTU). Ten parametr mówi, jak duże pakiety możemy wysłać pomiędzy dwoma hostami (lub routerami). W celu wykorzystania dostępnych zasobów w 100% należy wysłać możliwie jak największe pakiety. Dlaczego właściwie sieć nie lubi fragmentacji pakietów? W sumie, jest to bardzo ciekawe pytanie i całkowicie na miejscu. Postaramy się na nie odpowiedzieć. Dzieje się tak, ponieważ nasz komputer musi poskładać wszystkie fragmenty takiego pakietu. I wtedy powstaje znaczące pytanie – co się stanie, jeśli któryś z fragmentów zostanie zagubiony/utracony lub przekłamany? No odpowiedź dość trywialna i wcale nie zaskakująca – musimy wysłać ponownie cały pakiet. Stąd właśnie wynika problem z fragmentacją.
Czy jest w takim razie słynne MTU dla większości sieci? Najbardziej popularne są sieci Ethernet z MTU 1500.
Zróbmy zatem prościutki eksperyment. Zobaczmy, jak sprawdzić, czy pakiet 1500 bajtów może dotrzeć do serwera docelowego. Możemy to sprawdzić za pomocą prostego polecenia ping. W tym poleceniu można określić rozmiar datagramu i fragmentacji bloku. Dlatego też, jeżeli “coś” zechce fragmentować nasz pakiet wtedy pakiet nie osiągnie swojego celu i będziemy o tym wiedzieć 🙂 Jednak trzeba pamiętać, że nagłówek UDP + IPv4 ma 28 bajtów, więc powinniśmy zdefiniować 1472 bajtów dla rozmiaru datagramu. W systemach operacyjnych Windows, polecenie takie będzie wyglądać następująco:
ping -f -l 1472 google.com
A wyjście prezentuje się, jak widać poniżej:
Pinging google.com [216.58.209.78] with 1472 bytes of data: Reply from 216.58.209.78: bytes=64 (sent 1472) time=43ms TTL=53 Reply from 216.58.209.78: bytes=64 (sent 1472) time=27ms TTL=53 Reply from 216.58.209.78: bytes=64 (sent 1472) time=24ms TTL=53 Reply from 216.58.209.78: bytes=64 (sent 1472) time=27ms TTL=53 Ping statistics for 216.58.209.78: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 24ms, Maximum = 43ms, Average = 30ms
Teraz spróbujmy zwiększyć rozmiar datagramu o 1:
ping -f -l 1473 google.com
Pinging google.com [216.58.209.78] with 1473 bytes of data: Packet needs to be fragmented but DF set. Packet needs to be fragmented but DF set. Packet needs to be fragmented but DF set. Packet needs to be fragmented but DF set. Ping statistics for 216.58.209.78: Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
To działa 🙂 Mamy konkretny wniosek – MTU między naszym hostem i serwerem google wynosi 1500.
W przypadku połączeń internetowych PPPoE, MTU jest 1492 (ze względu na protokół PPPoE, który dodaje 8 bajtów nagłówka). Dlatego też, jeśli są pewne problemy z przepustowością, a posiadacie niechlubne połączenie PPPoE, możecie zmienić konfiguracje MTU w systemie operacyjnym na 1492 bajtów. To może naprawdę wbrew pozorom pomóc i ułatwić sieciowe życie.