5. díl - Sítě - Internet protokol - hlavička

Sítě Sítě - Internet protokol - hlavička

V tomto díle se seznámíme s páteřním protokolem dnešního Internetu – naprostá většina dat je přes tuto síť routerů přenášena právě díky Internet protokolu (IP). Prozkoumáme hlavičku IP paketu a jak se používá v dnešním (2015) Internetu.

IP paket a jeho transport

IP_paket

Jakmile zařízení vytvoří nějaký blok dat (může to být požadavek na webovou stránku, samotná stránka, úsek streamovaného videa, nebo – při používání Voice over IP telefonu – třeba váš hlas) a na jeho začátek přidá IP hlavičku, vytvoří IP paket. Díky informacím v této hlavičce mohou takový paket přeposílat routery od odesílatele k příjemci. Pokud je paket po cestě nějak poškozen, nebo musel být zahozen (viz dále), router odesílateli odešle ICMP zprávu, proč paket nemohl být doručen. K ICMP se ještě dostanu. Zatím bude stačit vědět, že ICMP zprávy slouží k informování o různých chybách a k diagnostice sítě. I tyto zprávy jsou přenášeny v IP paketu.

Takový IP paket však nemůže cestovat v síti „osamocený“ – musí být zapouzdřen (zabalen) v dalším protokolu (aby vznikl rámec). Tento slouží pouze pro komunikaci mezi bezprostředně spojenými zařízeními - například PC a router nebo router a switch. Každé takové zařízení (přesněji každý port takového zařízení) má svou MAC adresu (viz. předchozí díly) a po přijetí rámce zjistí, kam dále ho má poslat.

Protokoly, co mohou nést IP paket, mají tuto obecnou strukturu:

DatalinkFrame

Hlavička obsahuje obecně tyto pole: cílová adresa, zdrojová adresa a protokol, který rámec nese. Patička (FCS – frame checksum) je kontrolní součet celého rámce – každé zařízení (routery, switche, zesilovače, příjemce, ...) vždy znovu spočítá kontrolní součet rámce. Pokud se neshoduje s původním, znamená to, že se data po cestě poškodila, a zařízení celý rámec zahodí. Jeden takový protokol už známe - Ethernet.

IP hlavička a jednotlivá pole

IP_header

Pozn. Differentiated services je rozsáhlejší téma a má vyhrazený samostatný článek. Červená pole mají samostatnou kapitolu níže - "Fragmentace paketu a MTU discovery"

Verze

IP, o kterém se nyní bavíme, je verze 4. Ještě existuje verze 6, která je dnes horkým tématem – k tomu později, teď se soustřeďme na IPv4. Hodnota tohoto pole pro IPv4 bude 0100 (4).

Délka hlavičky

Hlavička (na obrázku) je dlouhá 20 bajtů. Na co je potřeba toto pole? Internet protokol byl navrhnut i s tzv. IP options – což měly být pole, které se přidávají hned za hlavičku. Options pole mohou být různých délek a v různém počtu až do velikosti 40 bajtů – IP hlavička tedy má délku 20 – 60 bajtů. Dnes se options již nepoužívá, takže délka je pevná – 20 bajtů.

Problém spíše je, v jakých „jednotkách“ se délka vyjadřuje. Pole je 4 bity velké, takže maximální hodnota je 1111 (15). Pochopitelně to nemůže být délka v bitech, ale ani v bajtech – i nejmenší hlavička je dlouhá 20 bajtů. Délka je zde vyjádřená ve 4 bajtových blocích (neboli 32-bitových slovech), takže pro hlavičku délky 20 bajtů bude hodnota v poli 5 (5x4 = 20 bajtů).

Celková délka

Celková délka IP paketu (hlavička + data) v bajtech. Minimální délka je 20 – pouze hlavička, paket tedy nenese žádná data (ještě jsem se s tím nesetkal), a maximální délka 216 = 65 535 (pole je 16 bitové). Taková délka je ovšem spíše teoretická a prakticky omezena MTU (viz. dále).

Time to live

Hodnota zabraňuje nekonečnému cestování paketu v síti (třeba kvůli chybě v routovací tabulce by paket neustále obíhal kolečko mezi pěti routery). Odesílatel ji nastaví na nějakou počáteční hodnotu (doporučená je 64, můj PC dává 128) a každý router, který tento IP paket obdrží, tuto hodnotu sníží o 1. Pokud se hodnota TTL dostane na nulu (a paket nebyl doručen cílovému zařízení), pak router paket zahodí a odesílateli odešle ICMP zprávu „Time exceeded“.

Můžete si to zkusit: Poslouží nám utilita ping, která vysílá (na Windows defaultně čtyřikrát) na danou IP adresu ICMP zprávu „Echo request“. Pokud je příjemce on-line (tj. že normálně funguje) a není nakonfigurovaný tak, aby na Echo request neodpovídal, tak vám pošle zpátky ICMP „Echo reply“. Do příkazového řádku napište ping –i 3 www.google.com. Přepínačem „i“ měníme právě hodnotu TTL – nastavil jsem 3, takže ideálně paket projde vašim routerem, přes vašeho ISP, a zastaví se hned na dalším routeru – TLL klesne na nulu, a dostanete „Time exceeded“ zprávu (TLL expired in transit):

ping_cmd

Protokol

Pole má stejnou funkci jako u Ethernetu – určí, který typ protokolu IP paket nese. Např. pro ICMP je to 1, pro TCP - 6 nebo pro UDP - 17. Transportní protokoly TCP a UDP budou tématem některého z následujících dílů.

Kontrolní součet hlavičky

Kontrolní součet se vypočítá z IP hlavičky (včetně tohoto pole, v době výpočtu je vyplněno nulami) a umístí se sem. Pokud je IP paket nesen Ethernetem či jiným protokolem s FCS, pak je pole celkem zbytečné – protokol obsahuje FCS celého rámce a pokud ten nesouhlasí, celý rámec je zahozen.

Zdrojová a cílová IP adresa

Tyhle pole jsou snad jasná :-)

Fragmentace IP paketu a MTU discovery

Než se budeme bavit o fragmentaci, musíme vědět, co je to MTU (maximum transmission unit). Je to maximální délka IP paketu včetně hlavičky, který může projít po daném typu sítě. S jedním MTU jsme se setkali – MTU pro Ethernet – 1500 bajtů. Např. pro Wi-Fi je to 2300 bajtů. Pro různé typy sítí se stanovily různé MTU z ještě různějších důvodů (dříve značně omezená velikost vyrovnávací paměti - zařízení jednoduše nemohlo přijmout celý paket, dnes spíše jako kompromis mezi efektivitou a chybovostí - delší pakety se spíše poškodí). Každopádně, toto MTU je uložené na každém PC / routeru, který má přístup k síti (čili má NIC). Pokud odesílá paket, první zjistí jeho délku, a když je větší než MTU, tak paket musí zahodit. Pokud se jedná o router, odešle odesílateli ICMP zprávu „Packet too big“:

packetTooBigScheme

Fragmentace paketu

Je první možnost řešení různých MTU. Pracuje následovně: Pokud má zařízení odeslat paket, který je větší než MTU jeho sítě, rozporcuje (fragmentuje) paket na díly, které se do sítě „vejdou“, přidělí jim vlastní IP hlavičku a odešle je. Fragmenty poté putují po Internetu jako nezávislé IP pakety, dokud je nedostane příjemce. Ten fragmenty sestaví dohromady pomocí informací, které jsou v obrázku IP headeru (začátek článku) obarveny červeně. O nich budu teď mluvit:

Pole Identifikace

Každý odeslaný IP paket dostane své 16 bitové ID. Nastavuje se tak, aby pro každé spojení [odesílatel|pří­jemce|protokol] bylo jedinečné (alespoň po určitou dobu, IETF doporučuje 2 minuty). Důležité je, že pokud je paket fragmentován, tak všechny fragmenty jednoho paketu dostanou stejné ID. Příjemce tak může sestavit paket se správných „dílků“.

Flagy

První bit (flag) IETF rezervovalo, a dodnes pro něj nenašli použití - hodnota je vždy 0. Druhý flag, alias Don’t fragment flag (DF), zakazuje fragmentaci paketu, pokud je nastaven na 1. Takže jakmile je paket větší než MTU sítě, router paket zahodí a odesílateli odešle ICMP „packet too big“. Opět si můžete pohrát s příkazovým řádkem:

Zkuste příkaz ping –f –l 2000 www.itnetwork.cz. Parametr f nastaví flag DF na 1, a l určí, kolik bajtů náhodně vygenerovaných dat se má poslat na server naší oblíbené webové stránky. Pokud jede vaše LAN na Ethernetu (a nevrtali jste se v nastavení), tak uvidíte chybovou hlášku.

Třetí flag – More fragments flag (MF) – říká příjemci (pokud má hodnotu 1), který si momentálně shromažďuje fragmenty v paměti (aby je mohl sestavit a jako celek předat další části operačního systému pro zpracování), že paket ještě není celý – následuje více fragmentů. Z toho vyplývá, že poslední fragment bude mít tento flag nastaven na 0.

Pozice fragmentu (Fragment offset)

Říká příjemci, kolik oktetů (osmic bajtů) od začátku původního paketu se data ve fragmentu nachází – doslova „odsazení“ fragmentu od začátku. Z toho také vyplývá, že délka dat (v bajtech) v každém fragmentu (krom posledního) musí být dělitelná osmi. Pole je potřeba, protože fragmenty nemusí dorazit ve stejném pořadí, jak byly odesílány. Fragment offset tedy vlastně určuje pořadí fragmentu v paketu.

První fragment má tuto hodnotu vždy 0. Následující fragment dostane hodnotu předcházejícího fragmentu + délka dat v předcházejícím fragmentu v bajtech. Zde je příklad takové fragmentace v Ethernetu:

fragmentace

Když vezmeme jednotlivé datové bloky ve fragmentech, jejich Fragment offset hodnoty a poskládáme je za sebe, začíná to dávat smysl:

fragmentOffset

Tyto kusy dat příjemce extrahuje z jednotlivých fragmentů, a poskládá je za sebe podle Fragment offset pole.

Od fragmentace se již upustilo (nebo upouští), protože má několik nevýhod. V prvé řadě je to práce navíc pro routery (kopírovat IP hlavičky a přeskládávat data). Je to práce navíc také na straně příjemce, který musí čekat, až dostane všechny fragmenty, které pak seřadí a sestaví původní paket. Dále, pokud dojde ke ztrátě jen jediného fragmentu, musí se zahodit celý zbytek paketu – není možnost, jak přeposlat jen jeden fragment.

Místo fragmentace si tedy odesilatel zjistí, jak maximálně velký může paket být, aby mohl projít celou cestou vcelku.

MTU discovery

Jak říká název – je to metoda pro zjištění MTU pro danou cestu. Neposílají se žádné speciální „MTU discovery pakety“ nebo něco podobného. Zjišťování probíhá za běhu:

Odesilatel (typicky PC) odešle klasický paket s daty tak veliký, jak mu jeho síť dovolí, přičemž nastaví flag Don’t fragment na 1. Pokud se po cestě vyskytne síť s menším MTU, router nemůže paket fragmentovat kvůli DF flagu. Zahodí tedy paket a pošle PC zprávu „Packet too big“ – tato obsahuje i MTU sítě, kterou paket nemohl projít. PC tedy zmenší paket na danou hodnotu, a odesílá znovu. Postup se opakuje do té doby, než paket projde celou cestou. U Internetu platí, že jednotlivé pakety pro stejnou destinaci mohou cestovat jinudy – proto je pak ve všech odeslaných paketech nastaven DF flag vždy na 1, aby se PC mohl přizpůsobit i při změně trasy.

Většina spojů v Internetu má MTU stejnou nebo větší než Ethernet (a Ethernet je globální standard pro LAN sítě). Fragmentace tedy není v současnosti velký problém a probíhá de facto jen na PC (resp. serverech) při odesílání webových stránek či stahování filmů, her.. Toto nicméně není IP fragmentace, o které jsme mluvili. Server zná své MTU a štěpí proud dat ještě předtím, než začne připojovat protokolové hlavičky.

V dalším díle dokončíme IP hlavičku - pole Differentiated services a jeho mechanismy. Otázky prosím do komentářů :-)


 

  Aktivity (7)

Článek pro vás napsal Lukas C#
Avatar
Věnuji se IT spíše co se týče SW, baví mě programování v C#. Nejvíc mě však těší, když můžu pomáhat a učit ostatní :-)

Jak se ti líbí článek?
Celkem (6 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Síťové technologie

 

 

Komentáře

Avatar
mkub
Redaktor
Avatar
mkub:

doplnim, ze v texte malo byt namiesto 216 toto: (216)-1 (216 nie je 65535, ale 65536)
v Linuxe pre prikaz ping na upravu TTL sluzi parameter -t: ping -t 3 www.google.com
upusta sa od fragmentacie aj z toho dovodu, ze je pouzitelny aj na DoS utok

 
Odpovědět 8.12.2015 22:49
Avatar
Lako
Člen
Avatar
Lako:

Hustý 8-)

 
Odpovědět 10.12.2015 22:40
Avatar
tjanuska
Člen
Avatar
tjanuska:

V příkladu fragmentace by měl být u poslédního paketu MF flag = 0

 
Odpovědět  +1 15.12.2015 10:16
Avatar
Lukas C#
Redaktor
Avatar
 
Odpovědět 15.12.2015 11:03
Avatar
Vít Vohralík:

super. Funkce ping v cmd je super. Děkuji :-)

 
Odpovědět 22. listopadu 16:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.