Hlavní navigace

Sokety a C/C++: volitelné položky IP záhlaví

1. 9. 2003
Doba čtení: 5 minut

Sdílet

Dnes se podíváme na volitelné položky IP záhlaví. Doposud jsme pracovali s IP pakety, které měly hlavičku ve likosti 20 bytů. IP hlavička může mít až 60 bytů. Dnes se podíváme na těch 40 bytů navíc. Dnešní článek je teoretický. Nenaleznete v něm ani řádku zdrojového textu.

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

Tabulka č. 478
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

Tabulka č. 479
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.networksor­cery.com/enp/pro­tocol/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.

Tabulka č. 480
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.

Tabulka č. 481
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_TSAN­DADDR) – 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.

root_podpora

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

Byl pro vás článek přínosný?