Fragmentacja IP
Jak duże pakiety IP są dzielone i składane dla różnych rozmiarów MTU.
Problem: Różne Rozmiary Dróg na Informacyjnej Autostradzie
Wyobraź sobie, że internet to globalna sieć logistyczna. Twoje dane podróżują w cyfrowych „ciężarówkach” zwanych pakietami. Pakiet, jak ciężarówka, ma określony rozmiar, zależny od tego, ile „ładunku” (danych) przewozi. Teraz wyobraź sobie, że ta ciężarówka jedzie z magazynu w Gdańsku (Twój komputer) do centrum dystrybucyjnego w Krakowie (serwer WWW). Podróż ta nie jest pojedynczą, jednolitą autostradą. To seria różnych dróg, mostów i tuneli, z których każdy ma własne ograniczenia rozmiaru. Szeroka autostrada A1 może pozwalać na przejazd bardzo dużych pojazdów, ale lokalna droga w górach może mieć znacznie niższy limit tonażu lub wysokości.
W sieciach komputerowych ten „limit rozmiaru pojazdu” dla danej sieci fizycznej (takiej jak sieć LAN Ethernet, połączenie Wi-Fi czy łącze światłowodowe na duże odległości) nazywa się Maksymalną Jednostką Transmisji (MTU). MTU definiuje największy możliwy pakiet, w bajtach, który może być przesłany przez to konkretne łącze. Najczęstsze MTU, z jakim się spotkasz, dotyczy sieci Ethernet i wynosi 1500 bajtów.
Problem pojawia się, gdy duży pakiet, stworzony dla sieci o wysokim MTU, musi przejść przez inną sieć o niższym MTU. Podobnie jak ciężarówka, która jest za wysoka, by zmieścić się w tunelu, duży pakiet po prostu nie może przejść. Rozwiązaniem nie jest zawrócenie; jest nim podzielenie dużego pakietu na mniejsze części, które się zmieszczą. Ten proces nazywa się .
Zestaw Narzędzi do Fragmentacji IPv4: Spojrzenie w Nagłówek
Aby zarządzać procesem dzielenia pakietu i zapewnić, że można go poprawnie złożyć z powrotem w miejscu docelowym, IPv4 używa zestawu specyficznych pól w swoim nagłówku. Pola te działają jak szczegółowa instrukcja obsługi dołączona do każdej części oryginalnego pakietu.
Jak omówiono w temacie Nagłówek IPv4, trzy specyficzne pola współpracują ze sobą, aby obsłużyć fragmentację:
- Identyfikator (16 bitów): Do identyfikacji, do którego oryginalnego pakietu należy dany fragment.
- Flagi (3 bity): Do kontrolowania procesu fragmentacji i oznaczania ostatniego fragmentu.
- Przesunięcie Fragmentu (13 bitów): Do określenia dokładnej pozycji danych fragmentu wewnątrz oryginalnego pakietu.
Dogłębna Analiza Pól Kontrolnych Fragmentacji
Zbadajmy szczegółowo każde z tych trzech pól, aby zrozumieć ich precyzyjne role w procesie fragmentacji i ponownego składania.
Pole Identyfikator (ID)
Analogia: Pomyśl o tym jak o unikalnym numerze przesyłki. Jeśli rozkładasz duży mebel do wysyłki, na każdym pudle piszesz ten sam numer (np. „Przesyłka nr 12345”). Gdy pudła dotrą, nawet jeśli osobno, odbiorca łatwo zorientuje się, że wszystkie należą do tego samego mebla.
W sieciach, gdy router fragmentuje datagram IP, kopiuje wartość Identyfikatora z oryginalnego datagramu do nagłówka każdego pojedynczego fragmentu. Host docelowy użyje tego wspólnego ID, aby zgrupować wszystkie otrzymane fragmenty należące do tego samego oryginalnego pakietu, zanim będzie mógł rozpocząć ponowne składanie. To 16-bitowe pole pozwala na unikalnych identyfikatorów, zanim numery zaczną się powtarzać.
Pole Flagi
To 3-bitowe pole działa jak zestaw przełączników on/off, które dostarczają kluczowych sygnałów kontrolnych.
- Bit 0: Zarezerwowany. Ten bit jest zawsze ustawiony na 0.
- Bit 1: Flaga Nie Fragmentuj (DF). Gdy ten bit jest ustawiony na 1, jest to surowy rozkaz dla routerów: "Zabrania się fragmentowania tego pakietu". Jeśli router otrzyma pakiet z ustawioną flagą DF, a pakiet jest większy niż MTU następnego łącza, router nie ma wyboru – musi odrzucić pakiet. Zazwyczaj wysyła wtedy komunikat o błędzie ICMP "Wymagana fragmentacja, a ustawiono flagę DF" z powrotem do pierwotnego nadawcy.
Analogia: To odpowiednik umieszczenia na kopercie dużej naklejki "KRUCHE - NIE ZGINAĆ". Poczta nie może złożyć jej, aby zmieścić w mniejszej skrzynce; musi ją zwrócić. Ta flaga jest kamieniem węgielnym bardzo ważnego mechanizmu zwanego . - Bit 2: Flaga Więcej Fragmentów (MF). Ta flaga jest niezbędna do ponownego składania. Informuje hosta docelowego, czy w drodze są kolejne fragmenty.
- Jeśli flaga MF jest ustawiona na 1, oznacza to: "To jest fragment większego pakietu, a po nim nadejdą kolejne".
- Jeśli flaga MF jest ustawiona na 0, oznacza to jedną z dwóch rzeczy: albo jest to ostatni fragment pakietu, albo pakiet w ogóle nie był fragmentowany. Odbiorca wie, że otrzymał ostatni kawałek, gdy dostanie fragment z MF=0.
Pole Przesunięcie Fragmentu
Analogia: Działa to jak instrukcja montażu, która mówi, jak pasują do siebie części rozłożonego mebla. Etykieta na każdym pudle może mówić: „To pudło zawiera części od 0 cm do 100 cm” lub „To pudło zawiera części od 100 cm do 200 cm”.
Pole Przesunięcie Fragmentu informuje hosta docelowego, dokładnie gdzie w ładunku danych oryginalnego datagramu należą dane z tego konkretnego fragmentu. Pozwala to hostowi na ponowne złożenie danych w prawidłowej kolejności, nawet jeśli fragmenty dotrą w innej kolejności.
Zasada 8 Bajtów
Jest tu kluczowy szczegół techniczny: przesunięcie nie jest mierzone w pojedynczych bajtach. Jest mierzone w jednostkach 8-bajtowych. Wartość w polu Przesunięcie Fragmentu należy pomnożyć przez 8, aby uzyskać rzeczywiste przesunięcie w bajtach.
Dlaczego? Pole to ma tylko 13 bitów długości, co pozwala na różnych wartości. Gdyby każda wartość reprezentowała jeden bajt, moglibyśmy opisać przesunięcie tylko do 8192 bajtów. Jednak maksymalny rozmiar ładunku pakietu IPv4 to prawie 64 KB (65515 bajtów). Ustalając, że każda jednostka przesunięcia jest równa 8 bajtom, 13-bitowe pole może objąć cały możliwy zakres: bajtów.
Oznacza to, że z wyjątkiem ostatniego fragmentu, ładunek danych każdego fragmentu musi być wielokrotnością 8 bajtów.
Dogłębny Przykład: Pakiet 4000 Bajtów Spotyka MTU 1500 Bajtów
Prześledźmy cały proces. Host źródłowy wysyła duży datagram IP, który router musi sfragmentować.
- Rozmiar Oryginalnego Datagramu: 4000 bajtów
- Rozmiar Nagłówka: 20 bajtów
- Rozmiar Ładunku (Danych): bajtów
- MTU Sieci: 1500 bajtów
Krok 1: Oblicz Rozmiar Fragmentu
Router otrzymuje pakiet 4000-bajtowy. Następne łącze ma MTU 1500 bajtów. Oznacza to, że całkowity rozmiar każdego fragmentu (nagłówek + dane) nie może przekroczyć 1500 bajtów.
Maksymalna ilość danych na fragment = MTU - Rozmiar Nagłówka = bajtów.
Musimy również przestrzegać zasady 8 bajtów dla przesunięcia. Czy 1480 jest podzielne przez 8? Tak, . Możemy więc użyć maksymalnego możliwego rozmiaru danych, czyli 1480 bajtów, dla naszych fragmentów.
Krok 2: Utwórz Pierwszy Fragment
Router tworzy pierwszy fragment zawierający pierwszą część oryginalnych danych.
- Dane: Pierwsze 1480 bajtów z oryginalnego ładunku 3980-bajtowego (Bajty 0-1479).
- Całkowita Długość: bajtów.
- Identyfikator: Skopiowany z oryginalnego pakietu (powiedzmy, że to 1234).
- Flagi: DF to 0. Ponieważ jest więcej danych do wysłania, MF jest ustawione na 1.
- Przesunięcie Fragmentu: Ten fragment zaczyna się od bajtu 0 oryginalnego ładunku. Wartość przesunięcia to .
Krok 3: Utwórz Drugi Fragment
Wciąż mamy do wysłania bajtów danych. Router tworzy drugi fragment.
- Dane: Następne 1480 bajtów oryginalnego ładunku (Bajty 1480-2959).
- Całkowita Długość: bajtów.
- Identyfikator: 1234 (musi być taki sam).
- Flagi: DF to 0. Nadal jest więcej danych do wysłania, więc MF wciąż jest 1.
- Przesunięcie Fragmentu: Dane tego fragmentu zaczynają się od bajtu 1480 oryginalnego ładunku. Wartość przesunięcia to .
Krok 4: Utwórz Ostatni Fragment
Pozostało nam bajtów danych. Router tworzy trzeci i ostatni fragment.
- Dane: Ostatnie 1020 bajtów oryginalnego ładunku (Bajty 2960-3979).
- Całkowita Długość: bajtów.
- Identyfikator: 1234 (musi być taki sam).
- Flagi: DF to 0. To ostatnia część oryginalnego pakietu, więc MF jest ustawione na 0. To sygnalizuje koniec odbiornikowi.
- Przesunięcie Fragmentu: Dane tego fragmentu zaczynają się od bajtu 2960 oryginalnego ładunku. Wartość przesunięcia to .
Oryginalny pakiet o rozmiarze 4000 bajtów został pomyślnie przekształcony w trzy mniejsze fragmenty (1500, 1500 i 1040 bajtów), każdy z poprawnie skonfigurowanym nagłówkiem, gotowe do wysłania przez sieć. Host docelowy użyje identycznego ID, rosnących przesunięć i końcowej flagi MF=0, aby idealnie złożyć z powrotem oryginalne dane.
Podejście IPv6: Odpowiedzialność End-to-End
Projektanci IPv6 uznali, że fragmentacja przez routery pośredniczące jest głównym źródłem nieefektywności. W modelu IPv6:
- Routery NIE Fragmentują: Routery pośredniczące w sieci IPv6 mają zakaz fragmentowania pakietów.
- Wykrywanie MTU Ścieżki (PMTUD): Odpowiedzialność za określenie najmniejszego MTU na całej ścieżce do celu spoczywa na hoście źródłowym. Robi to, wysyłając pakiety i nasłuchując komunikatów o błędach "Pakiet za duży" od każdego routera, który nie może ich przesłać. Host następnie dostosowuje rozmiar swoich pakietów przed wysłaniem.
- Nagłówek Rozszerzający Fragmentacji: Jeśli host źródłowy bezwzględnie musi wysłać pakiet większy niż MTU ścieżki, może sam dokonać fragmentacji i dołączyć specjalny Nagłówek Rozszerzający Fragmentacji. Nagłówek ten zawiera te same informacje co pola IPv4 (ID, flagi, przesunięcie). Co kluczowe, ten nagłówek jest przetwarzany tylko przez hosta docelowego, a nie przez routery po drodze, co utrzymuje szybkość działania sieci szkieletowej.
Wady i Problemy Związane z Fragmentacją
Chociaż fragmentacja jest konieczna dla IPv4, ogólnie uważa się ją za szkodliwy proces, którego należy unikać, gdy tylko to możliwe, ze względu na kilka istotnych wad.
- Narzut Wydajnościowy: Fragmentacja zwiększa obciążenie zarówno dla routera, który ją wykonuje (musi utworzyć wiele nowych nagłówków), jak i dla hosta docelowego, który musi ponownie złożyć części, zużywając procesor i pamięć.
- Zwiększona Niezaowodność: Utrata pojedynczego fragmentu jest katastrofalna dla całego pakietu. Jeśli nawet jeden mały fragment oryginalnego datagramu zaginie w tranzycie, host docelowy nie może złożyć całości. Musi poczekać na upłynięcie limitu czasu, a następnie odrzucić wszystkie pozostałe fragmenty, które już otrzymał. Cały oryginalny pakiet musi zostać ponownie przesłany przez źródło, co znacznie zwiększa opóźnienie i marnuje przepustowość.
- Podatności na Ataki: Fragmentacja pakietów była wykorzystywana w różnych atakach sieciowych. Na przykład, zapory sieciowe i systemy wykrywania włamań mogą mieć trudności z inspekcją sfragmentowanego ruchu, ponieważ pełny kontekst danych jest rozproszony na wiele pakietów.
- Komplikacje z NAT/Zaporami Sieciowymi: Wiele zapór i urządzeń NAT działa na podstawie numerów portów znajdujących się w nagłówku warstwy transportowej (TCP/UDP). Jednak w sfragmentowanym pakiecie IPv4 tylko pierwszy fragment zawiera ten nagłówek. Kolejne fragmenty go nie mają. Utrudnia to lub uniemożliwia tym urządzeniom poprawne filtrowanie lub tłumaczenie tych kolejnych fragmentów, co często prowadzi do ich blokowania.