Několikrát jsem ve svém seriálu zdůrazňoval, že hlavička IP paketu může mít takzvané volitelné položky, které jsou nepovinné. Doposud jsme pracovali s IP pakety, které měly hlavičku velikosti 20 bytů. Několikrát jsem upozorňoval, že mohou existovat IP pakety, které mají větší záhlaví.
Druhá část prvního bytu IP paketu verze 4 (atribut ihl) obsahuje délku hlavičky IP paketu vydělenou čtyřmi. Doposud jsme se setkali s hodnotou 5, protože 5 * 4 = 20 (bytů), což je velikost povinné části hlavičky IP paketu. Polovina bytu (4 bity) může obsahovat maximálně číslo 15. Vynásobíme-li 15*5=60 (bytů), získáme maximální velikost hlavičky IP paketu. 40 bytů, které jsme získali, může obsahovat volitelné položky IP záhlaví.
Formát volitelných položek IP hlavičky
1 byte | 1 byte | ? |
---|---|---|
Kód | Délka | Data (Mají délku rovnou atributu Délka – 2 byte) |
První byte udává typ volitelných položek. Existuje několik typů volitelných položek. Je-li nejvyšší bit prvního bytu roven jedné, volba se při fragmentaci kopíruje do všech fragmentů. Je-li nastaven na nulu, volba je zkopírována pouze do prvního fragmentu, ostatní již tuto nepovinou volbu ve své hlavičce neobsahují. Druhý atribut obsahuje celkovou délku rozšířené volby IP paketu.
Typy volitelných položek IP hlavičky
Typ (hodnota 1. byte) | Název makra | Hodnota kódu | Popis |
---|---|---|---|
Zaznamenávej směrovače | IPOPT_RR | 7 | Každý směrovač, kterým IP datagram projde, zapíše do datové části rozšířené IP hlavičky (viz formát volitelné položky) adresu síťového rozhraní, kterým IP datagram směrovač opouští. |
Časové razítko | IPOPT_TS | 68 | Každý směrovač, kterým IP datagram projde, zapíše do datové části rozšířené IP hlavičky (viz formát volitelné položky) časové razítko (aktuální čas). |
Směrování | IPOPT_LSRR | 131 | Předepíše IP adresy směrovačů, kterými IP paket musí projít. Datová část rozšířené IP hlavičky obsahuje seznam IP adres, přes které IP paket projde. |
Striktní směrování | IPOPT_SSRR | 137 | Předepíše IP adresy směrovačů, kterými IP paket musí projít. Datová část rozšířené IP hlavičky obsahuje seznam IP adres, přes které IP paket projde. |
Existuje více typů volitelných záhlaví. Více informací lze získat na podle mě velmi pěkně udělané stránce www.networksorcery.com/enp/protocol/ip.htm. Já vybral jen ty, kterými se chci v budoucích článcích zabývat.
Všechna makra jsou definována v hlavičkovém souboru iphdr.h, který jsme doposud používali pro práci s IP hlavičkou. Pro WinDev dodám definici maker v příštím článku, kde bude součástí příkladu. Ostatně definovat několik maker není problém.
Podíváte-li se na binární tvar jednotlivých kódů (3. sloupec), zjistíte, že například volby „časové razítko“ a „zaznamenávej směrovače“ se při fragmentaci nekopírují do každého fragmentu, ale pouze do prvního. Naopak volby typu „směrování“ a „striktní směrování“ se kopírují do každého fragmentu, dojde-li někdy k fragmentaci IP paketu.
Jestliže k cílovému počítači dorazí IP paket s nějakou volitelnou položkou ve své hlavičce a očekává se, že počítač by měl adresátovi nějak odpovědět, odpoví IP paketem se stejnou rozšiřující volbou hlavičky. Například nastavíme-li nějakou volbu v IP paketu, který přenáší ICMP paket typu žádost o ECHO, ECHO odpověď by nám měla přijít v IP paketu, který obsahuje stejnou volbu rozšiřující IP záhlaví.
Volba „zaznamenávej směrovače“
Datová část IP hlavičky bude obsahovat čtyři bytové buňky, do kterých jednotlivé směrovače, přes které IP paket projde, zapisují IP adresu síťového rozhraní, kterým IP paket směrovač opouští. Tím můžeme získat představu o počítačích, které jsou na cestě mezi odesílatelem a příjemcem IP paketu. Odešleme-li s takto nastavenou IP hlavičkou paket nesoucí ICMP paket žádost o ECHO, v ECHO odpovědi budeme mít v rozšířené části IP hlavičky seznam požadovaných adres směrovačů. Cílový počítač při obdržení ECHO žádosti překopíruje všechny zapsané směrovače do „zpátečního paketu“ (ECHO odpověď) a odešle jej zpět.
Velikost | 1 byte | 1 byte | 1 byte | ? |
---|---|---|---|---|
Název | Kód | Délka | Ukazatel | IP adresy (4 bytové buňky) |
Hodnota | 7 | (3 + 4 * počet buněk) bytů | Na začátku má hodnotu 4, potom se při průchodu každým směrovačem zvýší o 4. | Jednotlivé IP adresy |
Atribut ukazatel obsahuje počet bytů od počátku volby ve volitelné části IP záhlaví k začátku první buňky pro IP adresu, která není obsazená. Možná vhodnější pojem než ukazatel je offset (posunutí). Na začátku není vyplněná žádná buňka a ukazatel obsahuje hodnotu 4. Při průchodu prvním počítačem bude na místo, které je od počátku volitelné části IP hlavičky posunuto o počet bytů uložený v atributu ukazatel, zapsána IP adresa výstupního síťového rozhraní. Poté bude hodnota ukazatel zvětšena o 4 a paket bude odeslán. Volbě „zaznamenávej směrovače“ se budeme věnovat v příštím článku.
Protože je počáteční hodnota ukazatele rovná 4, znamená to, že první byte datové části je vlastně nevyužitý.
Volba „časové razítko“
V podstatě velmi podobná volba jako volba „zaznamenávej směrovače“. Rozdíl je v tom, že místo IP adres směrovačů jsou zaznamenávány časy, ve kterých IP paket prošel směrovači. Odešleme-li takto nastavený IP paket nesoucí ICMP žádost o ECHO, z ECHO odpovědi získáme časy průchodů IP paketu směrovači.
Velikost | 1 byte | 1 byte | 1 byte | 4 bity | 4 bity | ? |
---|---|---|---|---|---|---|
Název | Kód | Délka | Ukazatel | Příznak OF | Příznak FL | IP adresy (4 nebo 8 bytových buněk) |
Hodnota | 68 | (4 + 4 * počet buněk) bytů nebo (4 + 8 * počet buňek) bytů | Na začátku má hodnotu 4, potom se při průchodu každým směrovačem zvýší o 4 (nebo 8). | Indikuje přetečení | [0,1,3] | Jednotlivá časová razítka (a možná také IP adresy) |
Atributy mají v podstatě stejný význam jako u volby „zaznamenávej směrovače“. Přibyl nový byte s dvěma příznaky. První udává, jestli se vyskytly směrovače, které svůj čas nemohly do IP hlavičky zapsat (již tam nebylo místo), druhý udává, co všechno se má na směrovači do IP hlavičky udávat. Může nabývat hodnot:
- 0 (makro IPOPT_TS_TSONLY) – zaznamenávají se pouze časy. Každá buňka má 4 byte. Hodnota ukazatele roste vždy o 4.
- 1 (makro IPOPT_TS_TSANDADDR) – zaznamenávají se časy i směrovače. Každá buňka má 8 byte. Hodnota ukazatele roste vždy o 8.
- 3 (makro IPOPT_TS_PRESPEC) – zaznamenává časy pouze na definovaných směrovačích.
Volba „směrování“
V datové části rozšířené IP hlavičky IP paketu jsou IP adresy, kterými musí IP paket projít na cestě od odesílatele k příjemci. Směrovače nemusejí být na cestě bezprostředně za sebou, jak jsou uvedeny v seznamu. Mohou mít mezi sebou jiné směrovače. Pomocí této volby můžeme určit, jakou cestou bude IP paket po síti putovat.
Formát je úplně stejný jako u volby „zaznamenávej směrovače“.
Volba „striktní směrování“
Obdobná volba jako volba „směrování“ s tím rozdílem, že striktní směrování vyžaduje, aby směrovače byly bezprostředně za sebou tak, jak jsou uvedeny v seznamu. Opět pomocí této volby určujeme cestu, po které IP paket půjde, ale oproti volbě „směrování“ přísněji.
Formát je úplně stejný jako u volby „zaznamenávej směrovače“.
Práce s volitelnými položkami IP hlavičky v programech
Existuje volba soketů jménem IP_OPTIONS definovaná v úrovni voleb SOL_IP (IPROTO_IP). Pomocí ní lze nastavit volitelné položky IP záhlaví. Konkrétněji se na práci s volitelnými položkami IP hlavičky podíváme příště. Odešleme ICMP paket žádost o ECHO s nastavením volby „zaznamenávej směrovače“.