ICMP (anglicky Internet Control Message Protocol) je v informatice jeden z nejdůležitějších protokolů počítačových sítí založených na rodině protokolů TCP/IP (tedy protokolu, který používá Internet). Protokol ICMP používají operační systémy v síti pro odesílání služebních informací, například chybových zpráv pro oznámení, že požadovaná služba není dostupná nebo že potřebný počítač nebo router není dosažitelný.

ICMP se svým účelem liší od TCP a UDP protokolů tím, že obvykle není používán síťovými aplikacemi přímo, nýbrž je vygenerován na základě nějaké události. Výjimkou je např. nástroj ping, který posílá ICMP zprávy „Echo Request“ (a očekává příjem zprávy „Echo Reply“), aby určil, zda je cílový počítač dosažitelný a jak dlouho paketům trvá, než se dostanou k cíli a zpět (tj. měří latenci).

Technické detaily

ICMP je součástí sady internetových protokolů, jak je definováno v RFC 792. Zprávy ICMP se obvykle používají pro diagnostické nebo kontrolní účely nebo jsou generovány v reakci na chyby v operacích IP (jak je uvedeno v RFC 1122). Chyby ICMP jsou směrovány na zdrojovou IP adresu původního paketu.

Například každé zařízení (jako je zprostředkující směrovač), které přeposílá IP datagram, nejprve sníží dobu trvání (TTL) pole v hlavičce IP o jednu. Pokud je výsledné TTL 0, paket je zahozen a na zdrojovou adresu datagramu je odeslána zpráva o překročení času ICMP při přenosu.

Mnoho běžně používaných síťových nástrojů je založeno na zprávách ICMP. Příkaz traceroute (Unixy) nebo tracert (Windowsy) lze implementovat přenosem IP datagramů se speciálně nastavenými poli hlavičky IP TTL (Time to Live) a hledáním překročení doby ICMP při přenosu a zpráv o nedostupnosti cíle generovaných jako odpověď. Související nástroj ping je implementován pomocí ICMP echo request a echo response zpráv.

ICMP využívá základní podporu IP, jako by to byl protokol vyšší úrovně, nicméně ICMP je ve skutečnosti nedílnou součástí IP. Ačkoli jsou zprávy ICMP obsaženy ve standardních IP paketech, zprávy ICMP jsou obvykle zpracovávány jako zvláštní případ, na rozdíl od běžného zpracování IP. V mnoha případech je nutné zkontrolovat obsah zprávy ICMP a doručit příslušnou chybovou zprávu aplikaci odpovědné za přenos paketu IP, který vyvolal odeslání zprávy ICMP.

ICMP je protokol síťové vrstvy, což z něj dělá protokol vrstvy 3 podle modelu 7 vrstvy OSI. ICMP je založen na 4vrstvém modelu TCP/IP a je protokolem internetové vrstvy, což z něj dělá protokol vrstvy 2 (internetový standardní model RFC 1122 TCP/IP se 4 vrstvami).

S pakety ICMP není spojeno žádné číslo portu TCP nebo UDP, protože tato čísla jsou spojena s transportní vrstvou výše.

Struktura datagramu

ICMP paket je zapouzdřen uvnitř IPv4 paketu. Tento paket se skládá z následujících částí:

Hlavička

Hlavička ICMP začíná za hlavičkou IPv4 a je identifikována číslem protokolu IP '1'. Všechny ICMP pakety mají osmibajtovou hlavičku a datovou sekci proměnné velikosti. První 4 bajty hlavičky mají pevný formát, zatímco poslední 4 bajty závisí na typu/kódu daného ICMP paketu.

Tabulka 1. Formát ICMP hlavičky
Offset Oktet → 0 1 2 3

Oktet

Bit

0—​7

8—​15

16—​23

24—​31

0

0

typ

kód

checksum

4

32

zbytek hlavičky

  • typ je typ ICMP paketu viz níže v tabulce řídících zpráv

  • kód je ICMP podtyp viz níže v tabulce řídících zpráv

  • checksum je kontrolní součet podle RFC1071 pro zjišťování chyb. Je počítán z celé hlavičky a datové části, kde místo datové části jsou samé nuly, ale délka je zachována.

  • zbytek hlavičky je čtyřbajtové pole, jehož obsah závisí na ICMP typu a kódu.

Data

Chybové zprávy ICMP obsahují datovou část, která obsahuje kopii celé hlavičky IPv4 plus alespoň prvních osm bajtů dat z paketu IPv4, který chybovou zprávu způsobil. Délka chybových zpráv ICMP by neměla přesáhnout 576 bajtů. Tato data používá hostitel k přiřazení zprávy k příslušnému procesu. Pokud protokol vyšší úrovně používá čísla portů, předpokládá se, že jsou v prvních osmi bytech dat původního datagramu.

Byla využita proměnná velikost datové části ICMP paketů. V "Ping of death" jsou velké nebo fragmentované ICMP pakety používány pro útoky denial-of-service. Data ICMP lze také použít k vytvoření skrytých kanálů pro komunikaci. Tyto kanály jsou známé jako ICMP tunely.

Řídící zprávy

Řídicí zprávy jsou identifikovány hodnotou v poli typ. Pole kód poskytuje další kontextové informace pro zprávu. Některé řídicí zprávy byly od prvního zavedení protokolu zastaralé.

Tabulka 2. Seznam řídících zpráv
typ kód stav popis

0 — Echo Reply

0

odpověď na echo (echo reply) používá program ping

1 a 2

nepřiřazeno

zarezervováno pro budoucí použití

3 — Destination Unreachable

0

cílová síť je nedostupná

1

cílový stroj je nedostupný

2

cílový protokol je nedostupný

3

cílový port je nedostupný

4

je požadována fragmentace a je nastavený příznak nefragmentuj

5

zdrojová routa je chybná

6

cílová síť je neznámá

7

cílový stroj je neznámý

8

zdrojový stroj je izolovaný

9

síť je administrativně zakázaná

10

stroj je administrativně zakázaný

11

síť je nedostupná pro daný typ služby ToS

12

stroj je nedostupný pro daný typ služby ToS

13

komunikace je administrativně zakázaná

14

Host Precedence Violation

15

Precedence cutoff in efect

4 — Source Quench

0

zastaralý

source quench (congestion control)

5 — Redirect

0

přesměrování datagramu pro síť

1

přesměrování datagramu pro stroj

2

přesměrování datagramu kvůli typu služby pro síť

3

přesměrování datagramu kvůli typu služby pro stroj

6

zastaralý

alternativní IP adresa stroje

7

nepřiřazeno

zarezervováno pro budoucí použití

8 — Echo Request

0

výzva k echu (echo request) používá program ping

9 — ohlášení směrovače

0

ohlášení směrovače (router advertisement)

10 — vyjednávání směrovače

0

objevování, výběr a vyjednávání směrovače

11 — čas vypršel Time Exceeded

0

TTL (time to live) vypršelo při přenosu

1

vypršel čas při sestavení fragmentu

12 — problém s parametrem (špatná IP hlavička)

0

ukazatel ukazuje chybu

1

chybí povinná část hlavičky IP paketu

2

špatná délka paketu

13 — časové razítko Timestamp

0

časové razítko (žádost o synchronizaci času)

14 — odpověď na časové razítko Timestamp Reply

0

odpověď na časové razítko

15 — žádost o informaci

0

zastaralé

žádost o informaci

16 — odpověď na informaci

0

zastaralé

odpověď na žádost o informaci

17 — žádost o masku

0

zastaralé

žádost o masku IP adresy

18 — odpověď na žádost o masku

0

zastaralé

odpověď na žádost o masku

19

vyhrazeno

vyhrazeno pro bezpečnost

20 až 29

vyhrazeno

vyhrazeno pro experimenty

30 — Traceroute

0

zastaralé

žádost o informaci

31

zastaralé

Datagram Conversion Error

32

zastaralé

Mobile Host Redirect

33

zastaralé

Where-Are-You (původně pro IPv6)

34

zastaralé

Here-I-Am (původně pro IPv6)

35

zastaralé

Mobile Registration Request

36

zastaralé

Mobile Registration Reply

37

zastaralé

Domain Name Request

38

zastaralé

Domain Name Reply

39

zastaralé

SKIP Algorithm Discovery, Protocol, Simple Key-Management for Internet Protocol

40

Photuris, Security failures

41

experimentální

ICMP pro experimentální mobilní protokoly jako Seamoby [RFC4065]

42 — Extended Echo Request

0

žádost o rozšířené echo (XPing)

43 — Extended Echo Reply

0

bez chyby

1

nepochopený dotaz

2

takové síťové rozhraní neexistuje

3

neexistuje taková tabulka

4

více síťových rozhraní odpovídá dotazu

44 až 252

nepřiřazeno

vyhrazeno

253

experimentální

RFC3692 experiment (RFC 4727)

254

experimentální

RFC3692 experiment (RFC 4727)

255

vyhrazeno

Vyhrazeno.

Nejpoužívanější ICMP datagramy

  • Echo Request — požadavek na odpověď, každý prvek v síti pracující na IP vrstvě by na tuto výzvu měl reagovat. Často to z různých důvodů není dodržováno.

  • Echo Reply — odpověď na požadavek

  • Destination Unreachable — informace o nedostupnosti cíle, obsahuje další upřesňující informaci

    • Net Unreachable — nedostupná cílová síť, reakce směrovače na požadavek komunikovat se sítí, do které nezná cestu

    • Host Unreachable — nedostupný cílový stroj

    • Protocol Unreachable — informace o nemožnosti použít vybraný protokol

    • Port Unreachable — informace o nemožnosti připojit se na vybraný port

  • Redirect — přesměrování, používá se především pokud ze sítě vede k cíli lepší cesta než přes výchozí bránu. Stanice většinou nepoužívají směrovací protokoly a proto jsou informovány touto cestou. Funguje tak, že stanice pošle datagram své, většinou výchozí, bráně, ta jej přepošle správným směrem a zároveň informuje stanici o lepší cestě.

    • Redirect Datagram for the Network — informuje o přesměrování datagramů do celé sítě

    • Redirect Datagram for the Host — informuje o přesměrování datagramů pro jediný stroj

  • Time Exceeded — vypršel časový limit

    • Time to Live exceeded in Transit — během přenosu došlo ke snížení TTL (Time To Live) na 0, aniž byl datagram doručen (aniž by dosálh cíle)

    • Fragment Reassembly Time Exceeded — nepodařilo se sestavit jednotlivé fragmenty v časovém limitu (např. pokud dojde ke ztrátě části datagramů)

Ostatní datagramy jsou používány spíše vzácně, někdy je používání ICMP znemožněno špatným nastavením firewallu.

Přesměrování (Redirect)

Přesměrování požaduje odeslání datových paketů alternativní cestou. ICMP Redirect je mechanismus pro směrovače, který přenáší informace o směrování hostitelům. Zpráva informuje hostitele, aby aktualizoval své směrovací informace (k odeslání paketů alternativní cestou). Pokud se hostitel pokusí odeslat data přes router (R1) a R1 odešle data na jiný router (R2) a je k dispozici přímá cesta z hostitele do R2 (to znamená, že hostitel a R2 jsou ve stejné podsíti), pak R1 odešle přesměrovací zprávu, aby informoval hostitele, že nejlepší cesta k cíli je přes R2. Hostitel by pak měl změnit informace o své trase a odeslat pakety pro tento cíl přímo do R2. Router stále odešle původní datagram do zamýšleného cíle. Pokud však datagram obsahuje informace o směrování, tato zpráva nebude odeslána, i když je k dispozici lepší cesta. RFC 1122 uvádí, že přesměrování by měly být odesílány pouze bránami a neměly by být odesílány strojům v Internetu.

Příklad zaslání zprávy ICMP redirect v síti se dvěma bránami do Internetu

ICMPv4 redirect message example en

Tabulka 3. Zpráva Redirect
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

typ = 5

kód

checksum

IP adresa pro lepší cestu

IP hlavička a prvních 8 bytů původních dat datagramu

Tabulka 4. Kód bude napsán takto:
kód popis

0

přesměruj síť

1

přesměruj hostitele

2

přesměruj kvůli typu služby (ToS) síť

3

přesměruj kvůli typu služby (ToS) hostitle

Čas vypršel (Time exceeded)

Překročení času je generováno bránou, aby informovalo zdroj o vyřazeném datagramu, protože TTL dosáhl nuly. Zprávu o překročení času může také odeslat hostitel, pokud se mu nepodaří znovu sestavit fragmentovaný datagram ve svém časovém limitu.

Zprávy o překročení času používá obslužný program traceroute k identifikaci bran na cestě mezi dvěma hostiteli.

Tabulka 5. Zpráva Time exceeded
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

typ = 11

kód

checksum

nepoužito

IP hlavička a prvních 8 bytů původních dat datagramu

Typ musí být nastaven na 11.

Tabulka 6. Kód určuje důvod, kvůli čemu se posílá ICMP zpráva Time exceeded
kód popis

0

TTL spadlo na 0 při přenosu paketu

1

Nepodařilo se sestavit fragmenty v stanoveném čase

Hlavička IP a prvních 64 bitů původního paketu se použije hostitel, co dostal ICMP zprávu, aby našel u ebe vyřezený datagram. U protokolů vyšší úrovně TCP a UDP tam najde sdrojový a cílový port.

Tabulka 7. Zpráva Time exceeded
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

typ = 11

kód

checksum

nepoužito

IP hlavička a prvních 8 bytů původních dat datagramu

Žádost o čas a odpověď s časem se používá k synchronizaci času na zařízeních, které nemají hodiny reálného času (s baterií), a také nemají požnost použít protokol aplikační vrstvy NTP. Jsou to všelijaké mini krabičky. Krabička pošle ICMP zprávu Timestamp stroji, který má sychronizované hodiny a v odpověď dostane ICMP zprávu Timestmp Reply s aktuálním časem. Tak může nastavit svoje vlastní hodiny na přibližně synchronní čas. Není to tak přesné jeko NTP protokol, ale pro většinu zařízení to dostačuje.

Timestamp (žádost o čas)

Timestamp se používá pro synchronizaci času. Původní časové razítko je nastaveno na čas (v milisekundách od půlnoci), kdy se odesílatel naposledy dotkl paketu. Časová razítka příjmu a vysílání se nepoužívají.

Tabulka 8. Zpráva Timestamp
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

typ = 13

kód

checksum

identifikátor

pořadové číslo

čas vzniku datagramu — Originate Timestamp

čas doručení datagramu — Receive Timestamp

čas vyslání datagramu — Transmit Timestamp

Typ musí byýt nastaven an 13.

Kód musí být nastaven na 0

Identifikátor a sekvenční číslo se používá k porovnání s odpovědí Timestamp Reply.

Timestamp reply (odpověď s časem)

Timestamp reply je odpověď na zprávu Timestamp. Skládá se z původního časového razítka zaslaného odesílatelem časového razítka, jakož i časového razítka příjmu indikujícího, kdy bylo časové razítko přijato, a časového razítka vysílání indikujícího, kdy byla odeslána odpověď časového razítka.

Tabulka 9. Zpráva Timestamp reply
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Typ = 14

kód = 0

checksum

identifikátor

pořadové číslo

čas vzniku datagramu — Originate Timestamp

čas doručení datagramu — Receive Timestamp

čas vyslání datagramu — Transmit Timestamp

  • Typ musí být nastaven na hodnotu 14.

  • Kód musí být nastaven na 0.

  • Identifikátor a pořadové číslo může klient použít k přiřazení odpovědi k požadavku, který odpověď způsobil.

  • Originate timestamp je čas, kdy se odesílatel naposledy dotkl zprávy před jejím odesláním.

  • Receive timestamp — Časové razítko příjmu je čas, kdy se přijímající poprvé dotkl při příjmu.

  • Transmit timestamp — Časové razítko přenosu je čas, kdy se prijímající naposledy dotkl zprávy při jejím odeslání zpět.

Všechna časová razítka jsou v jednotkách milisekund od půlnoci UT. Pokud čas není k dispozici v milisekundách nebo jej nelze poskytnout s ohledem na půlnoční UT, pak lze do časové značky vložit libovolný čas za předpokladu, že bit vysokého řádu časové značky je také nastaven tak, aby indikoval tuto nestandardní hodnotu.

Použití zpráv Timestamp a Timestamp Reply k synchronizaci hodin internetových uzlů bylo z velké části nahrazeno protokolem Network Time Protocol (NTP) a Precision Time Protocol založeným na UDP, které jsou přesnější.

Žádost o masku sítě (Address mask request)

Požadavek na masku adresy je obvykle odesílán hostitelem směrovači, aby získal vhodnou masku podsítě.

Příjemci by měli na tuto zprávu odpovědět zprávou s odpovědí masky adresy.

Tabulka 10. Zpráva Address mask request
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Typ = 17

kód = 0

checksum

identifikátor

pořadové číslo

maska sítě — Address mask

Kde:

  • Typ musí být nastaven na 17

  • Kód musí být nastaven na 0

  • Masku sítě je nutné nastavit na 0

ICMP Address Mask Request může být použit jako součást průzkumného útoku ke shromažďování informací v cílové síti, proto je ICMP Address Mask Reply ve výchozím nastavení na Cisco IOS zakázáno.

Odpověď na žádost o masku sítě (Address mask reply)

Odpověď masky sítě se používá k odpovědi na zprávu s žádostí o masku sítě s příslušnou maskou podsítě.

Tabulka 11. Zpráva Address mask reply
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Typ = 18

kód = 0

checksum

identifikátor

pořadové číslo

maska sítě — Address mask

Kde:

  • Typ musí být nastaven na 18

  • Kód musí být nastaven na 0

  • Maska sítě by měla být nastavena na masku podsítě

Cíl nedostupný (Destination unreachable)

Cíl nedostupný je generován hostitelem nebo jeho příchozí bránou, aby informoval klienta, že cíl je z nějakého důvodu nedosažitelný. Důvody pro tuto zprávu mohou zahrnovat: fyzické připojení k hostiteli neexistuje (vzdálenost je nekonečná); uvedený protokol nebo port není aktivní; data musí být fragmentována, ale je zapnutý příznak „nefragmentovat“. Nedosažitelné porty TCP reagují zejména pomocí TCP RST spíše než nedosažitelný cíl typu 3, jak by se dalo očekávat. Nedosažitelný cíl není nikdy hlášen pro přenosy vícesměrového vysílání (multicast) IP.

Tabulka 12. Zpráva Destination unreachable
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Typ = 3

Kód

checksum

nepoužito

Next hop MTU

IP hlavička a prvních 8 bajtů původního datagramu

Kde:

  • Typ (bity 0—​7) musí být nastaven na 3

  • Kód (bity 8—​15) je použit k upřesnění chyb a může mít hodnotu podle následující tabulky

Tabulka 13. Chybové kódy
kód popis chybové zprávy

0

Síť je nedostupná.

1

Stroj je nedostupný.

2

Protokol je nedostupný (zvolený přenostový protokol není podporovaný).

3

Port je nedostupný (zvolený přenosový protokol nemůže informovat příjemce o příchozí zprávě).

4

Datagram je příliš velký. Je nutné fragmentovat, ale fragmentace je zakázána nastaveným DF flagem.

5

Zdrojová routa je chybná.

6

Neznámá chyba na cílové síti.

7

Neznámá chyba na cílovém stroji.

8

Source host isolated error.

9

Komunikace s cílovou sítí je administrativně zakázána.

10

Komunikace s cílovým strojem je administrativně zakázána.

11

Síť je nedostupná pro daný typ služby (ToS).

12

Stroj je nedostupný pro daný typ služby (ToS).

13

Komunikace je administrativně zakázána (filtrování zabraňuje předávání paketu do sítě).

14

Host precedence violation (indicates the requested precedence is not permitted for the combination of host or network and port).

15

Precedence cutoff in effect (precedence of datagram is below the level set by the network administrators).

  • Pole MTU dalšího skoku (bity 48–63) obsahuje MTU sítě dalšího skoku, pokud dojde k chybě kódu 4.

  • IP hlavička a další data jsou zahrnuty, aby umožnily klientovi porovnat odpověď s požadavkem, který způsobil nedosažitelnou odpověď cíle.

Source Quench (zastaralé)

Source Quench požaduje, aby odesílatel snížil rychlost zpráv odesílaných směrovači nebo hostiteli. Tato zpráva může být generována, pokud směrovač nebo hostitel nemá dostatečný prostor ve vyrovnávací paměti pro zpracování požadavku, nebo se může objevit, pokud se vyrovnávací paměť směrovače nebo hostitele blíží svému limitu.

Data jsou odesílána velmi vysokou rychlostí z hostitele nebo z několika hostitelů současně do konkrétního směrovače v síti. Přestože má směrovač možnosti ukládání do vyrovnávací paměti, ukládání do vyrovnávací paměti je omezeno na specifikovaný rozsah. Router nemůže zařadit do fronty více dat, než je kapacita omezeného vyrovnávací paměti. Pokud se tedy fronta zaplní, příchozí data se zahazují, dokud fronta již není plná. Ale protože v síťové vrstvě není přítomen žádný potvrzovací mechanismus, klient neví, zda data úspěšně dosáhla cíle. Síťová vrstva by proto měla přijmout některá nápravná opatření, aby se těmto situacím vyhnula. Tato opatření se označují jako source quench (zdrojové zhášení).

V mechanismu zdrojového zhášení router zjistí, že rychlost příchozích dat je mnohem vyšší než rychlost odchozích dat, a pošle klientům zprávu ICMP, která je informuje, že by měli zpomalit rychlost přenosu dat nebo počkat určitý čas pokusem o odeslání dalších dat. Když klient obdrží tuto zprávu, automaticky zpomalí rychlost odchozích dat nebo počká dostatečně dlouhou dobu, což routeru umožní vyprázdnit frontu. Zpráva ICMP o zhášení zdroje tedy působí jako řízení toku v síťové vrstvě.

Protože výzkum naznačoval, že „ICMP Source Quench [bylo] neúčinným (a nespravedlivým) lékem na přetížení“, vytváření zdrojových zpráv zhášení pomocí směrovačů bylo v roce 1995 odmítnuto RFC 1812. Kromě toho přeposílání a jakýkoli druh reakce na (akce řízení toku) zprávy o zhášení zdroje byly od roku 2012 podle RFC 6633 zastaralé.

Tabulka 14. Source quench zpráva
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Typ = 4

kód = 0

checksum

nepoužito

IP hlavička a prvních 8 bytů původních dat datagramu