**Interneti kontrollsõnumiprotokoll** (inglise keeles *Internet Control Message Protocol* ehk **ICMP**) on andmesideprotokoll, mille abil võrguseadmed vahetavad oleku- ja veainformatsiooni. ICMP on internetiprotokolli (IP) lahutamatu osa ja kõik IP-d kasutavad seadmed peavad suutma tõlgendada ICMP sõnumeid. Interneti kontrollsõnumiprotokoll kuulub interneti protokollikomplekti (tuntud ka kui TCP/IP) ja asetub OSI mudeli võrgukihti.

Struktuur
---------

ICMP sõnumid kapseldatakse IP paketi sisse. Sõnumite vormingud on erinevad, aga kõik ICMP sõnumid algavad väljadega tüüp, kood ja kontrollsumma. 

**ICMP sõnumi üldformaat**| IP Päis |
| Tüüp | Kood | Kontrollsumma |
| Identifikaator | Järjekorranumber |
| Valikulised andmed |

**Sõnumi andmeväljade lühiseletused**

1. "IP päis" sisaldab lähte- ja sihtaadressi;
2. "Tüüp" määrab sõnumi liigi;
3. "Kood" täpsustab sõnumi sisu ehk määrab alamtüübi. Ühele sõnumile määratav suurim võimalik alamtüüpide arv on 256;
4. "Kontrollsumma" on 16-bitine andmeväli andmevahetuse käigus esinevate võimalike kadude tuvastamiseks. Kontrollsumma arvutamisel teisendatakse ICMP-päis ja andmed kahendarvudeks ning liidetakse need kokku. Andmepaketi vastuvõtja kordab tehet ja kui tulemus erineb kontrollsummast, siis pakett kustutatakse;
5. "Identifikaator" määrab vastussõnumi liigi (näiteks kajataotluse (*echo request*) sõnumile vastuseks oodatava sõnumi (*echo response*));
6. "Järjekorranumber" aitab eristada järjestikku saabuvaid sama tüüpi sõnumeid;
7. "Valikulised andmed" kirjeldavad, kuidas sõnumis määratletud tegevusi täide viia.

### Piirangud

ICMP veateateid ei saadeta vastuseks:

1. Teisele ICMP veateatele. Piirang aitab vältida sõnumite kordussaatmise tsükleid. See tähendab, et olukorras, kus leitakse viga saabunud ICMP veateate sõnumis, ei informeerita allikat esinenud veast. Siiski on võimalik saata ICMP veateadet vastuseks ICMP informatsioonisõnumile;
2. Leviedastuse ja multiedastuse paketile. Vea põhjustava paketi saatmisel suurele hulgale hostidele edastaks iga host allikale sõnumi esinenud veast, mis võib tekitada võrguliikluse ülekoormuse;
3. IP paketi killule. Erandiks on killustatud paketi esimene osa. Juhul kui killustatud paketi esimene kild põhjustab vea, siis enamasti juhtub sama ka järgnevate puhul;
4. Pakettidele, mille lähteaadress ei ole üksikedastuse aadress. Allikale pole võimalik saata veateadet, kui andmepaketi lähteaadressis ei ole kirjeldatud üksikedastuse seadme unikaalset aadressi. Nii kõrvaldatakse võimalus ICMP-sõnumeid multi- ja leviedastada. Võimatuks muutub ka sõnumite saatmine spetsiaalaadressidele, nagu näiteks tagasiedastuse aadress.

Sõnumitüübid
------------

### Veateated

ICMP veateateid kasutavad ruuterid ja hostid andmepaketi lähtestaja teavitamiseks andmete edastamisel tekkivatest probleemidest. Veateate sõnumisse lisatakse probleemi esilekutsunud sõnumiread.

**Kättesaamatu adressaat** (inglise keeles *Destination unreachable*)

Võrguvärav saadab "kättesaamatu adressaadi" sõnumi andmepaketi allikale juhul, kui võrguvärava marsruutimisinfo viitab, et sihtvõrk on kättesaamatu.

Sihtpunkti host saadab andmepaketi allikale "kättesaamatu adressaadi" sõnumi, kui sihtpunkti võrgukaart või protsessi port ei ole aktiivne.

Võrguvärav loobub andmepaketi edastamisest ja tagastab "kättesaamatu adressaadi" sõnumi olukorras, kus nõutakse andmepaketi killustamist, aga killustamine pole lubatud (inglise keeles *no fragmentation flag*). ICMP kuuendas versioonis kannab sõnum nime "liiga suur pakett" (*package too big*).

**Allika summutamise sõnum** (inglise keeles *Source quench message*)

"Allika summutamise sõnum" annab hostile teada, et pakettide väljasaatmise sagedust tuleb vähendada. Puhvriruumi lõppemise korral edastab võrguvärav sõnumi, et andmepakette pole võimalik enam järjekorda lisada ega järgmisele võrgule suunata.
Andmepaketid, mida pole võimalik töödelda, kustutatakse. Võrguvärav võib saata ühe sõnumi iga kustutatud paketi kohta. Kui allikale ei saabu enam summutamise sõnumeid, saab ta suurendada pakettide väljastuse kiirust. ICMP kuuendas versioonis seda sõnumit ei ole.

**Ümbersuunamine** (inglise keeles *Redirect Message*)

Hostile saabub "ümbersuunamise sõnum", kui tema poolt lähtestatud võrguliiklus ei kasuta optimaalset teed. Lühima tee leidmiseks kasutavad ruuterid enda marsruutimistabeleid. Seade teavitab hosti võimalikust võrguliikluse ümbersuunamisest ja edastab ka saabunud andmepaketi.

**Aeg on ületatud** (inglise keeles *Time exceeded*)

Kõigil IP-pakettidel on väli TTL, mille väärtust vähendatakse ühe võrra paketi igal edastamise sammul allikast sihtpunktini.
Juhul kui TTL-väärtus jõuab nullini või killustatud andmepaketi üks osa ei saabu sihtpunkti, saadetakse allikale sõnum "aeg on ületatud".

**Parameetriline probleem** (inglise keeles *Parameter problem*)

Vigaste andmepaketi päiseparameetrite korral ei õnnestu hostil alati paketti töödelda ja pakett tuleb kustutada. "Parameetrilise probleemi" sõnum saadetakse juhtudel, kui töötlemisel tekkinud vea tõttu paketist loobutakse.

### Informatiivsed

Informatiivseid sõnumeid ei genereerita vastuseks IP-pakettides esinenud vigadele, vaid kasutatakse võrguühenduse diagnoosimiseks ja testimiseks. Need sõnumid võimaldavad võrguseadmetel vahetada ühenduse stabiilseks toimimiseks vajalikku olulist infot.

**Ajatempli taotlus ja Ajatempli vastus** (inglise keeles *Timestamp request and Timestamp reply message*)

Kõigil võrguseadmetel on süsteemikell. Ajamõõtmise tehniliste ebatäpsuste tõttu ei pruugi seadmete kellad omavahel sünkroonis olla. Ajatempli sõnumid aitavad ajakriitilistel rakendustel üle võrgu suhelda. Ajatempel kajastab keskööst (GMT põhjal) möödunud aega millisekundites. Sünkroonimiseks saadab andmeedastuse algatav seade ajatempli. Vastusesse lisatakse ajatempel sõnumi saabumise ja tagasi lähtestamise kohta.

**Marsruuteri kuulutus ja marsruuteri leidmise palve** (inglise keeles *Router advertisement and Router solicitation message*)

"Marsruuteri kuulutus" teavitab võrguseadmeid enda olemasolust ja edastab IP-aadressi. Marsruuterid edastavad seda sõnumit regulaarselt sätetes määratud aja tagant. Võrguliikluse vähendamise huvides on sõnumi levituse intervall tavaliselt 7–10 minutit. Võrku lülituv host peaks oma võrgutopoloogia uuendamiseks ootama järgmist "marsruuteri kuulutust". Ooteaja vältimiseks saab host kohtvõrgus levitada "marsruuteri leidmise palvet". Iga sõnumi saanud marsruuter vastab automaatselt "marsruuteri kuulutusega". 

**Aadressmaski taotlus ja Aadressmaski vastus**

IP-aadresside tõlgendamiseks kohtvõrgus peavad hostid teadma alamvõrgumaski. Kui host leviedastab kohtvõrgus "aadressmaski taotluse", siis iga võrguseade peab saatma "aadressmaski vastuse", mis sisaldab alamvõrgumaski. Alternatiivina kirjeldatule kasutatakse hostikonfiguratsiooni protokolli.

Versioonid
----------

IP-võrguaadresside nappuse tõttu avaldati 1990ndate keskpaigas protokolli uus versioon IPv6. Kuna IP ja ICMP on väga lähedalt seotud, ilmus samaaegselt ka ICMP uus versioon nimega ICMPv6. Versioonide eristamiseks kasutatakse tänapäeval ICMP asemel nimetust ICMPv4 (ICMP versioon 4). Tehtud muudatused on väiksemahulised.
ICMPv6-s jagatakse sõnumid kaheks grupiks: veateated ja informatiivsed sõnumid.
Veateadetele omistatud tüübiväärtused on vahemikus 0–127 ja informatsioonisõnumitel 128–255. Tänu grupeerimisele on võrguseadmel võimalik saabuva sõnumi tüüp kohe tuvastada. ICMPv4 sõnumeid ei grupeeri, aga tüübiväärtused on vahemikus 0–255.
ICMPv4 lubab andmepakettide killustamist. ICMPv6 puhul on andmepakettide killustamine keelatud ja suurim saadetav andmeühik on 1280 baiti.

ICMP-põhised utiliidid
----------------------

### Traceroute

*Traceroute* on rakendusprogramm, mis kasutab andmepaketi ühest hostist teiseni liikumise teekonna kindlakstegemiseks ICMP-sõnumeid ja IP-päise TTL-välja. *Traceroute* saadab kõigepealt adressaadile andmepaketi, mille TTL-välja väärtus on üks. Ruuterid on seadistatud mitte edastama saabuvaid andmepakette, mille TTL väärtus on null või üks. Ruuter kustutab paketi ja saadab allikale vastuseks ICMP-sõnumi "aeg on ületatud". Vastuse IP-paketi lähteaadressiks on ruuteri IP-aadress. Sellega on kindlaks tehtud esimene ruuter. Järgmisel sammul suurendatakse TTL-välja väärtust ühe võrra ja seda tegevust jätkatakse, kuni jõutakse soovitud hostini. Sihtpunktis ei kustutata saabunud andmepaketti ja seega ei saadeta ka "aeg on ületatud" sõnumit. Sihtpunkti tuvastamiseks määrab *traceroute* saadetud pakettidele vähekasutatava UDP pordinumbri. Juhul kui ükski sihthosti rakendus ei kasuta määratud pordinumbrit, saadab sihthosti UDP moodul "kättesaamatu pordi" sõnumi. Eristades kahte erinevat veasõnumit, saab *traceroute* kindlaks teha, kas jõuti sihthostini.

### Ping

Pingimisutiliidi abil on võimalik testida hostide vahelist võrguühendust. Selleks tuleb ühel hostil saata testsõnum ja teised hostid vastavad teavitusega, et sõnum jõudis kohale. Kontrollsõnumiprotokollis on nendeks testsõnumiteks "kajataotlus" ja "kajataotluse vastus". Kasutades nimetatud sõnumeid, testib pingimisutiliit ühendust ja esitab ka tulemuste kohta statistika. Kogutud informatsioon sisaldab üldjuhul järgnevat: andmevahetuseks kulunud aeg, saadetud sõnumi maht, vastuvõetud sõnumite arv.

Turvalisuse riskid
------------------

Interneti kontrollprotokoll ei sisalda autentimist ja seetõttu kasutatakse ICMP-d teenusetõkestusrünneteks või andmepakettide pealtkuulamiseks. 
Teenusetõkkerünnakuks võltsitakse "aeg on ületatud" ja "kättesaamatu sihtpunkt" sõnumeid. Need sõnumid sunnivad hosti ühendust katkestama. ICMP "ümbersuunamise sõnumi" abil saab ründaja suunata võrguliikluse läbi oma seadme.

ICMP Smurfi rünnakuks nimetatakse juhtu, kui ründaja saadab võltsitud kajapakette võrgu leviaadressidele. Võrgu kõik seadmed on kohustatud saatma "kajataotluse vastuse" ja sellega kasutatakse ära kogu ohvri süsteemi läbilaskevõime.

Viited
------

1. ↑  Charles M. Kozierok (20. september 2005). "The TCP/IP Guide" (inglise). ICMP: Overview, History, Versions and Standards.
2. ↑  Charles M. Kozierok (20. september 2005). "The TCP/IP Guide" (inglise). ICMP Message Creation and Processing Conventions and Rules.
3. ↑  J. Postel (september 1981). "Internet Control Message Protocol". *RFC 792* (inglise). Network Working Group.
4. ↑  "ICMP Time (To Live) Exceeded / Expired" (inglise). InetDaemon. 10. august 2012.
5. ↑  Charles M. Kozierok (20. september 2005). "The TCP/IP Guide" (inglise). ICMP Common Message Format and Data Encapsulation.
6. ↑  "Arhiivikoopia" (PDF). Originaali (PDF) arhiivikoopia seisuga 12. september 2012. Vaadatud 4. detsembril 2012.`{{netiviide}}`: CS1 hooldus: arhiivikoopia kasutusel pealkirjana (link)
7. ↑  "ICMP Attacks" (inglise). Javvin Company. Originaali arhiivikoopia seisuga 30. november 2012.