Fragmentace IP datagramů

Fragmentace IP datagramů je v informatice rozdělování IP datagramů na menší části, aby mohly být přeneseny další částí počítačové sítě. Každá část přenosové trasy v počítačové síti má totiž definovanou svoji maximální MTU (anglicky Maximum Transmission Unit), která určuje maximální velikost IP datagramu, který je možné přenést. Současná obvyklá velikost MTU je 1500 bajtů (tj. maximální délka Ethernetového rámce), avšak vysokorychlostní sítě používají kvůli nižší režii větší délky (tzv. jumbogramy) a naopak tunelované spoje MTU kvůli vlastní režii snižují.

Fragmentace je při přenosu dovolena pouze v IPv4, nová verze IPv6 ji povoluje jen odesilateli datagramu. Obecně je snahou fragmentaci se vyhýbat, protože způsobuje řadu problémů.

Popis funkce

RFC 791 popisuje postup pro fragmentaci IP datagramů, jejich přenos a zpětné sestavení. RFC 815 popisuje zjednodušený algoritmus, který lze u síťových zařízení snadno realizovat. Pro řízení fragmentace jsou v hlavičce IP datagramu položky:

  • Identification – identifikace fragmentu
  • Fragment offset – pozice fragmentu v originálním paketu (počet osmic bytů dat od počátku původního datagramu k počátku tohoto fragmentu)
  • Don't Fragment (DF) – zákaz fragmentace (bitový příznak)
  • More Fragments – následují další fragmenty (bitový příznak)

V IPv4router při obdržení PDU (Protocol data unit, zde tedy IP datagram) větší velikosti, než je MTU následující trasy (příštího skoku) dvě možnosti. Buď PDU zahodí a odešle ICMP zprávu Packet too Big (paket příliš velký), nebo může PDU fragmentovat na menší části, které projdou linkou s menším MTU (pouze v případě, že fragmentace není zakázána pomocí příznaku Don't Fragment). V IPv6 má jen první možnost – pošle odesilateli ICMP zprávu a ten provede fragmentaci nebo datagram zmenší jiným způsobem.

Při defragmentaci se předpokládá, že původní datagram sestaví z fragmentů až příjemce, který výsledek předává do vyšší síťové vrstvy (např. aplikaci). V praxi však může být nutné sestavovat fragmenty již dříve – například na routeru, který provádí NAT (Network address translation), protože je nutné analyzovat obsah datagramů nebo je modifikovat a přepočítávat jejich kontrolní součty (viz FTP a NAT). V tomto případě je nutné, aby skrze takový router procházel veškerý síťový provoz k cílovému síťovému rozhraní, protože jinak by některé fragmenty mohly putovat jinou cestou a absence fragmentu by vyžadovala nový přenos celého původního velkého datagramu bez záruky toho, že příště projdou žádoucím uzlem.

Rozdíly v IPv4 a IPv6

Mechanismus fragmentace se v IPv4 (první a v současné době nejvíce používané verzi) a v novější verzi IPv6 liší v tom, která zařízení fragmentaci provádějí. V IPv4 datagramy může fragmentovat kterékoli zařízení, jímž během přepravy procházejí.

V IPv6 (a stejně tak i v IPv4 v případě použití příznaku DF – nefragmentovat) smí fragmentovat pouze odesilatel. Pokud router na trase zjistí, že datagram neprojde linkou, zahodí jej a informuje o tomto odesílatele ICMP zprávou. Ten může následně přenos datagramu zopakovat s menšími (jemněji fragmentovanými) pakety.

Přestože jsou formáty hlavičky pro IPv4 a IPv6 různé, jsou pro fragmentaci používána pole s obdobným významem, takže se k fragmentaci i opětovnému sestavení datagramů lze použít stejný algoritmus pro oba protokoly. V IPv4 jsou fragmentační údaje trvalou součástí hlavičky datagramu, v IPv6 se vkládají, jen pokud je datagram skutečně fragmentován. Slouží k tomu rozšiřující hlavička Fragment.

Problémy fragmentace

Zkušenosti z Internetu odhalily řadu problémů, které fragmentace vyvolává. Může například způsobovat nadměrné přenosy, pokud dojde ke ztrátě jednotlivých fragmentů, protože protokoly se zárukami (např. TCP) si vyžádají přenos celého původního datagramu, i když chybí jediný fragment.[1]

Řada prvků přenosové infrastruktury současného Internetu využívá ke své činnosti také informace transportní vrstvy (typicky čísla portů TCP nebo UDP). Patří mezi ně například firewally nebo zařízení rozkládající příchozí provoz mezi skupinu serverů. Transportní hlavička se nachází na začátku přenášených dat a po fragmentaci je nesena prvním fragmentem, v ostatních nejsou transportní údaje k dispozici. Důsledkem může být, že pokračovací fragmenty jsou daným zařízením zahozeny nebo doručeny jinému stroji. Původní datagram pak nelze složit a spojení se jeví jako nefunkční, přestože malé datagramy (např. při testování programem ping) procházejí bez problémů.

Objevila se také celá řada fragmentačních útoků. Jelikož IP nezaručuje zachování pořadí, příjemce skládá fragmenty bez ohledu na to, v jakém pořadí přišly. Pokud útočník dokáže předpovědět identifikační číslo fragmentovaného datagramu, může adresátovi poslat falešné pokračovací fragmenty předem. Jakmile pak dorazí první fragment skutečného datagramu, adresát si složí falsum. Tímto způsobem lze buď blokovat komunikaci, kdy útočník posílá zjevně nesmyslné fragmenty, nebo se snažit podvrhovat do probíhající komunikace vlastní data.

Vyskytly se také zahlcovací útoky, kdy útočník posílá oběti velký počet úmyslně nekompletních datagramů, aby došlo k vyčerpání datových struktur určených pro skládání.

Důsledkem je, že fragmentace je v současném Internetu vnímána jako nežádoucí a prosazují se mechanismy, jak jí předcházet. Tím základním je algoritmus objevování MTU cesty (Path MTU discovery) popsaný v RFC 1191, RFC 1981 a RFC 4821, který umožňuje zjistit maximální velikost MTU pro celou cestu a posílat co největší pakety, které není třeba fragmentovat.

Literatura

  • PETERKA, Jiří. Protokol IP [online]. eArchiv.cz: Computerworld, 1992/48 [cit. 2009-11-06]. Dostupné online. 

Reference

  1. Christopher A. Kent, Jeffrey C. Mogul. Fragmentation Considered Harmful [online]. Dostupné online.