W rozmowach, które wynikły z innych pytań na tej stronie , zdałem sobie sprawę, że nie do końca rozumiem, kiedy wykonywana jest ścieżka MTU Discovery (PMTUD).
Wiem, co robi - odkryj najniższą MTU na ścieżce od klienta do serwera).
Wiem, jak to robi - wysyłaj stopniowo większe pakiety z ich zestawem bitów „Don't Fragment” i zobacz, jak duży pakiet można przejść bez wyświetlania błędu „ICMP Need to Fragment”.
Moje pytanie dotyczy zatem, kiedy host wykona PMTUD?
Szukam konkretnych przypadków. Nie tylko coś takiego jak „kiedy host chce odkryć MTU ścieżki”. Punkty bonusowe, jeśli możesz zapewnić przechwytywanie pakietów przez host, który to robi, lub podać instrukcje dotyczące generowania takiego przechwytywania pakietów.
Mówię też o IPv4. Wiem, że przejściowe routery IPv6 nie są odpowiedzialne za fragmentację i mogę sobie wyobrazić, że PMTUD zdarza się znacznie częściej. Ale na razie szukam konkretnych przykładów PMTUD w IPv4. (chociaż jeśli jedyne przechwytywanie pakietów, które można złożyć razem z PMTUD, to IPv6, nadal chciałbym je zobaczyć)
Odpowiedzi:
Odpowiedź jest prosta: zawsze, gdy gospodarz zechce. Naprawdę. To takie proste.
Poniższe wyjaśnienie zakłada środowisko tylko IPv4, ponieważ IPv6 eliminuje fragmentację w routerach (zmuszając hosta do radzenia sobie z fragmentacją i wykrywaniem MTU).
Nie ma ścisłej zasady, która reguluje, kiedy (a nawet jeśli) host dokonuje Wykrywania MTU ścieżki. Powodem pojawienia się PMTUD jest to, że fragmentacja jest uważana za szkodliwą z różnych powodów. Aby uniknąć fragmentacji pakietów, koncepcja PMTUD została wprowadzona w życie jako obejście problemu. Oczywiście fajny system operacyjny powinien używać PMTUD, aby zminimalizować fragmentację.
Tak więc, naturalnie, dokładna semantyka użycia PMTUD zależy od systemu operacyjnego nadawcy - w szczególności od implementacji gniazda. Mogę mówić tylko w konkretnym przypadku Linuksa, ale inne warianty UNIX prawdopodobnie nie różnią się bardzo.
W systemie Linux PMTUD jest kontrolowany przez
IP_MTU_DISCOVER
opcję gniazda. Możesz odzyskać jego bieżący statusgetsockopt(2)
, określając poziomIPPROTO_IP
iIP_MTU_DISCOVER
opcję. Ta opcja jest ważnaSOCK_STREAM
tylko dla gniazd (SOCK_STREAM
gniazdo jest dwukierunkowym, niezawodnym, zorientowanym na połączenie gniazdem; w praktyce jest to gniazdo TCP, chociaż możliwe są inne protokoły), a po ustawieniu Linux wykona PMTUD dokładnie tak, jak zdefiniowano w RFC 1191.Należy zauważyć, że w praktyce PMTUD jest procesem ciągłym; pakiety są wysyłane z ustawionym bitem DF - w tym z 3-stronnymi pakietami uzgadniania - możesz myśleć o tym jako o właściwości połączenia (chociaż implementacja może w pewnym momencie zaakceptować pewien stopień fragmentacji i przestać wysyłać pakiety z DF zestaw bitów). Zatem PMTUD jest tylko konsekwencją faktu, że wszystko na tym połączeniu jest wysyłane z DF.
Co jeśli nie ustawisz
IP_MTU_DISCOVER
?Istnieje wartość domyślna. Domyślnie
IP_MTU_DISCOVER
jest włączony wSOCK_STREAM
gniazdach. Można to odczytać lub zmienić, czytając/proc/sys/net/ipv4/ip_no_pmtu_disc
. Wartość zero oznacza, żeIP_MTU_DISCOVER
jest domyślnie włączona w nowych gniazdach; niezerowa oznacza coś przeciwnego.Co z gniazdami bezpołączeniowymi?
Jest to trudne, ponieważ niepołączone, niewiarygodne gniazda nie retransmitują utraconych segmentów. Obowiązkiem użytkownika jest spakowanie danych w porcje wielkości MTU. Oczekuje się również, że użytkownik dokona niezbędnych retransmisji w przypadku zbyt dużego błędu komunikatu. Zasadniczo kod użytkownika musi ponownie wdrożyć PMTUD. Niemniej jednak, jeśli jesteś gotowy na wyzwanie, możesz zmusić bit DF, przekazując
IP_PMTUDISC_DO
flagę dosetsockopt(2)
.Dolna linia
źródło
Zazwyczaj wykrywanie maksymalnej ścieżki transmisji (PMTUD) ma miejsce zawsze, gdy host myśli, że pakiet został odrzucony z powodu zbyt dużego rozmiaru.
Może to być odpowiedź na wymaganą fragmentację ICMP (typ 3, kod 4), która wyraźnie wskazuje, że pakiet został odrzucony. W typowej praktyce wszystkie pakiety IPv4 są ustawione z ustawioną flagą „nie fragmentuj” (DF), więc każdy pakiet przekraczający MTU wywoła taką odpowiedź. IPv6 w ogóle nie obsługuje fragmentacji.
Niektóre routery lub zapory hosta często odrzucają cały ICMP, ponieważ naiwny administrator uważa ICMP za zagrożenie bezpieczeństwa . Lub niektóre schematy agregacji łączy mogą przerywać dostarczanie ICMP . W RFC4821 zaproponowano alternatywny mechanizm wykrywania MTU, który nie opiera się na ICMP .
tracepath
to moje ulubione narzędzie do sondowania MTU w systemie Linux. Oto przykład z hosta z jednostką MTU 9001 w sieci LAN, ale który musi przejść przez sieć VPN IPsec, aby osiągnąć 10.33.32.157:Błędy ICMP można zaobserwować za pomocą
tcpdump
:Odkrycia MTU są buforowane. W Linuksie można to zaobserwować i usunąć
ip
(uwaga na zmiany od Linuksa 3.6 ):W przypadku protokołu TCP przekroczenie MTU można uniknąć w ramach konfiguracji połączenia. Do SYN wysyłanego przez każdy koniec zawarty jest maksymalny rozmiar segmentu (MSS). Nagłówek TCP (20 bajtów bez opcji ) i nagłówek IP (20 bajtów) oznaczają, że MSS i MTU są powiązane różnicą 40 bajtów.
Oto przykład konfiguracji połączenia między tymi dwoma hostami podczas przesyłania dużego pliku za pomocą
scp
:W pierwszym pakiecie host lokalny proponuje MSS 8961. Jest to skonfigurowana jednostka MTU 9001, mniej niż 40 bajtów. Zwrócony SYN / ACK ma MSS 1379, co sugeruje MTU 1419. Zdarza się, że w tej sieci zdalny host również wysłał 8961, ale wartość została zmodyfikowana przez router, ponieważ wie, że ścieżka zawiera ścieżkę internetową ( MTU 1500) narzut z tunelu IPsec. Router zmodyfikował również nasz wysłany MSS 8961, aby pojawiał się jako 1419 na drugim hoście. Nazywa się to zaciskaniem MSS .
W pewnym sensie PMTUD dzieje się cały czas. W praktyce może się to nigdy nie zdarzyć, jeśli blokowanie MSS jest na miejscu, a cały ruch odbywa się przez TCP lub jeśli żaden z routerów nie ma MTU mniejszej niż skonfigurowana w punktach końcowych. Nawet bez blokowania MSS może się to zdarzyć rzadko, gdy pamięć podręczna wygaśnie.
źródło
PMTUD służy do obliczania najlepszego MSS dla sesji TCP. Jednym z przykładów jest implementacja BGP na routerach Cisco lub Juniper.
http://www.juniper.net/techpubs/en_US/junos12.1/topics/usage-guidelines/routing-configuring-mtu-discovery-for-bgp-sessions.html
Dzięki.
źródło