IP

Fragmentacja IP

Jak duże pakiety IP są dzielone i składane dla różnych rozmiarów MTU.

Różne wartości MTU na trasie pakietu

Pakiet IP przechodzi przez łącza o różnych parametrach. Każde łącze określa maksymalny rozmiar jednostki, którą może przenieść bez dalszego podziału. Trasa z komputera w Gdańsku do serwera WWW w Krakowie może obejmować sieć lokalną, łącza operatorskie i tunele, więc wartości tego limitu mogą się różnić na kolejnych odcinkach.

Limit dla danego łącza (takiego jak Ethernet, Wi-Fi lub dalekosiężne łącze światłowodowe) nazywa się Maksymalną Jednostką Transmisji (MTU). MTU określa największy pakiet, w bajtach, który może zostać przesłany przez ten odcinek. Typowa wartość dla Ethernetu wynosi 1500 bajtów. Wartość MTU obejmuje nagłówki i dane jednostki przekazywanej przez łącze, więc aplikacja nie może przeznaczyć całych 1500 bajtów na dane użytkownika, gdy dochodzą nagłówki IPv4 i protokołu transportowego. Zmniejszenie ładunku pozostawia miejsce na te nagłówki.

Problem pojawia się, gdy pakiet przygotowany dla większego MTU ma przejść przez łącze o mniejszym MTU. Jeśli nadawca lub router nie zmniejszy rozmiaru jednostki, przekazanie nie powiedzie się. Jedną z metod jest podzielenie datagramu na mniejsze części, które mieszczą się w ograniczeniu. Odbiorca składa fragmenty dopiero po zebraniu informacji z ich nagłówków, a do czasu zakończenia musi przechowywać części datagramu. W IPv4 fragmentację może wykonać nadawca albo router pośredni, gdy flaga DF jest wyzerowana, a składanie odbywa się u odbiorcy. Ten proces nazywa się .

Pola fragmentacji IPv4 w nagłówku

Aby podzielić datagram i odtworzyć go w miejscu docelowym, IPv4 używa określonych pól nagłówka. Te pola pozwalają odbiorcy rozpoznać fragmenty należące do jednego datagramu oraz umieścić dane na właściwych pozycjach.

Jak omówiono w temacie Nagłówek IPv4, trzy pola współpracują przy fragmentacji:

  • 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.

Znaczenie pól kontrolnych fragmentacji

Każde z tych trzech pól pełni odrębną funkcję w procesie fragmentacji i ponownego składania datagramu.

Pole Identyfikator (ID)

Identyfikator działa jak numer grupy fragmentów. Router kopiuje tę samą wartość do każdego fragmentu danego datagramu, dzięki czemu odbiorca może odróżnić go od innych datagramów przesyłanych równocześnie. Przykładowa wartość identyfikatora to „Przesyłka nr 12345”.

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 216=65,5362^{16} = 65,536 unikalnych identyfikatorów, zanim numery zaczną się powtarzać. Ponowne składanie uwzględnia także adres źródłowy, docelowy i protokół z nagłówka, więc samo ID nie jest jedynym kryterium grupowania.

Pole Flagi

To 3-bitowe pole zawiera sygnały sterujące fragmentacją i składaniem.

  • Bit 0: Zarezerwowany. Ten bit jest zawsze ustawiony na 0.
  • Bit 1: Flaga Nie Fragmentuj (DF). Gdy bit ma wartość 1, router nie może fragmentować datagramu. Jeśli datagram przekracza MTU następnego łącza, router odrzuca go i zwykle wysyła do nadawcy komunikat ICMP „Wymagana fragmentacja, a ustawiono flagę DF”. Flaga DF stanowi podstawę mechanizmu .
  • Bit 2: Flaga Więcej Fragmentów (MF). Flaga przekazuje odbiorcy informację, czy po danym fragmencie występują kolejne części.
    • Jeśli flaga MF jest ustawiona na 1, po tym fragmencie występują kolejne części.
    • Jeśli flaga MF jest ustawiona na 0, datagram jest niepodzielony albo fragment jest jego ostatnią częścią. Odbiorca może wtedy rozpoznać koniec zakresu fragmentów.

Pole Przesunięcie Fragmentu

Pole przesunięcia fragmentu podaje położenie danych fragmentu w ładunku datagramu. Przykład poglądowy może opisywać części od 0 cm do 100 cm albo od 100 cm do 200 cm. W nagłówku wartości są wyrażane w jednostkach ośmiobajtowych.

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

Przesunięcie nie jest mierzone w pojedynczych bajtach. Jest wyrażane w jednostkach 8-bajtowych. Wartość w polu Przesunięcie Fragmentu należy pomnożyć przez 8, aby uzyskać rzeczywiste przesunięcie w bajtach.
Pole ma 13 bitów, co pozwala na 213=81922^{13} = 8192 różnych wartości. Gdyby każda wartość reprezentowała jeden bajt, opisany zakres obejmowałby tylko 8192 bajty. Maksymalny rozmiar ładunku pakietu IPv4 to prawie 64 KB (65515 bajtów), dlatego jednostka przesunięcia ma 8 bajtów. Zakres 8192 jednostek obejmuje 8192imes8=65,5368192 imes 8 = 65,536 bajtów, a maksymalna wartość pola przesunięcia wynosi 8191.

Oznacza to, że z wyjątkiem ostatniego fragmentu, ładunek danych każdego fragmentu musi być wielokrotnością 8 bajtów.

Przykład: datagram 4000 bajtów przy MTU 1500 bajtów

Rozważmy cały proces. Host źródłowy wysyła datagram IP, który router musi podzielić na odcinku o MTU 1500 bajtów.

  • Rozmiar Oryginalnego Datagramu: 4000 bajtów
  • Rozmiar Nagłówka: 20 bajtów
  • Rozmiar Ładunku (Danych): 4000−20=39804000 - 20 = 3980 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, więc całkowity rozmiar każdego fragmentu (nagłówek i dane) nie może przekroczyć tej wartości.
Maksymalna ilość danych na fragment = MTU - Rozmiar Nagłówka = 1500−20=14801500 - 20 = 1480 bajtów.
Dane fragmentów muszą również spełniać zasadę 8 bajtów dla przesunięcia. Wartość 1480 jest podzielna przez 8, ponieważ 1480/8=1851480 / 8 = 185. Możemy więc użyć maksymalnego rozmiaru danych 1480 bajtów dla pierwszych fragmentów.

Krok 2: Utwórz Pierwszy Fragment

Router tworzy pierwszy fragment zawierający początkową część oryginalnych danych.

  • Dane: Pierwsze 1480 bajtów z oryginalnego ładunku 3980-bajtowego (Bajty 0-1479).
  • Całkowita Długość: 1480 (dane)+20 (nagłoˊwek)=15001480 \text{ (dane)} + 20 \text{ (nagłówek)} = 1500 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 0/8=00 / 8 = 0.

Krok 3: Utwórz Drugi Fragment

Po pierwszym fragmencie pozostaje 3980−1480=25003980 - 1480 = 2500 bajtów danych. Router tworzy drugi fragment.

  • Dane: Następne 1480 bajtów oryginalnego ładunku (Bajty 1480-2959).
  • Całkowita Długość: 1480+20=15001480 + 20 = 1500 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 1480/8=1851480 / 8 = 185.

Krok 4: Utwórz Ostatni Fragment

Po drugim fragmencie pozostaje 2500−1480=10202500 - 1480 = 1020 bajtów danych. Router tworzy trzeci i ostatni fragment.

  • Dane: Ostatnie 1020 bajtów oryginalnego ładunku (Bajty 2960-3979).
  • Całkowita Długość: 1020+20=10401020 + 20 = 1040 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 2960/8=3702960 / 8 = 370.

Datagram o rozmiarze 4000 bajtów został podzielony na trzy fragmenty (1500, 1500 i 1040 bajtów), każdy z własnym nagłówkiem. Host docelowy użyje identycznego ID, przesunięć 0, 185 i 370 oraz końcowej flagi MF=0, aby odtworzyć dane w pierwotnej kolejności. Każdy fragment niesie własny nagłówek 20-bajtowy, więc podział zwiększa łączny narzut o dwa dodatkowe nagłówki i wymaga przechowania stanu składania.

Fragmentacja w IPv6: odpowiedzialność hosta źródłowego

W IPv6 routery pośredniczące nie wykonują fragmentacji. Jeżeli pakiet jest zbyt duży dla łącza, źródło musi dobrać rozmiar na podstawie PMTUD albo użyć nagłówka Fragment. W modelu IPv6:

  • Routery nie fragmentują: Routery pośredniczące w sieci IPv6 odrzucają zbyt duży pakiet i wysyłają komunikat Packet Too Big.
  • Wykrywanie MTU ścieżki (PMTUD): Określenie najmniejszego MTU na ścieżce należy do hosta źródłowego. Host wysyła pakiety i reaguje na komunikaty o błędzie "Pakiet za duży" od routera, który nie może ich przekazać. Następnie dostosowuje rozmiar pakietów przed kolejną transmisją.
  • Nagłówek rozszerzający Fragment: Jeśli host źródłowy musi wysłać pakiet większy niż MTU ścieżki, może podzielić go samodzielnie i dołączyć nagłówek Fragment. Nagłówek zawiera 32-bitowy identyfikator, 13-bitowe przesunięcie w jednostkach 8-bajtowych oraz flagę M. Jest przetwarzany przez host docelowy, a routery pośredniczące go nie modyfikują.

Koszty i problemy fragmentacji

Fragmentacja IPv4 bywa potrzebna przy różnicach MTU, lecz zwiększa koszt przetwarzania i komplikuje obsługę ruchu. PMTUD oraz właściwy dobór rozmiaru pakietu często ograniczają jej użycie. Opisy tego mechanizmu zwracają także uwagę na problemy z utratą części danych, filtrowaniem i różnicami w obsłudze fragmentów przez urządzenia.

  • 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ęć.
  • Większe ryzyko nieukończenia: Utrata pojedynczego fragmentu uniemożliwia odbiorcy złożenie całego datagramu. Po upływie limitu czasu odbiorca odrzuca pozostałe fragmenty. Ponowną transmisję może zlecić protokół wyższej warstwy, na przykład TCP, dlatego nie każdy cały datagram jest automatycznie wysyłany ponownie przez IP. Utrata fragmentu zwiększa opóźnienie i zużycie przepustowości.
  • 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.

Powiązane artykuły