Weder IPv4 noch IPv6 stellen eine Möglichkeit zur Verfügung, dem Sender eines IP-Pakets neben den Nutzdaten noch eine Nachricht zukommen zu lassen. Dabei könnte es sich beispielsweise um Hinweise über Fehler handeln, die bei einer Übertragung oder bei dem Versuch einer Übertragung aufgetreten sind. Angenommen, auf dem Zielrechner existiert die Zielanwendung für ein bestimmtes IP-Paket gar nicht, dann scheitert der Kommunikationsversuch. Über diesen Sachverhalt muss der Sender informiert werden. Aber es sind nicht nur Fehlerhinweise, die zu kommunizieren sind. Man denke an den Fall, dass ein Router durch Herunterzählen des TTL-Feldes bei IPv4 bzw. des Hop-Limit-Feldes bei IPv6 im IP-Header den Wert 0 erreicht und das Paket verworfen hat. Er muss jetzt den Absender dieses Pakets über diesen Sachverhalt verständigen.
Für die Übermittlung solcher Nachrichten ist ein eigenes DoD-2- (bzw. OSI-3-) Protokoll mit dem Namen Internet Control Message Protocol (ICMP) entwickelt worden. Es wird mit den Bezeichnungen ICMPv4 bzw. ICMPv6 bei beiden IP-Versionen eingesetzt. ICMP benutzt IP als Transportmittel, indem es sich selbst als Protokoll einer höheren Protokollschicht interpretiert. Das heißt, dass ICMP-Nachrichten in IP-Paketen gekapselt werden. Tritt zum Beispiel der gerade beschriebene Fall auf, dass eine Anwendung auf dem Zielrechner für ein IP-Paket nicht erreichbar ist, dann sendet die IP-Station auf dem Zielrechner der IP-Station auf dem Quellrechner ein ICMP-Paket mit der Nachricht Ziel nicht erreichbar. Hat ein Router ein IP-Paket verworfen, weil dessen Lebensdauer abgelaufen ist, dann sendet er dem Sender des verworfenen Pakets ein ICMP-Paket mit der Nachricht Zeitüberschreitung. Welche Nachrichten es gibt und wie sie kodiert werden, wird im nächsten Absatz erläutert.
ICMP-Pakete sind klassisch aufgebaut und beginnen mit einem Protokollkopf, dem ein Datenteil folgt. Es soll hier genügen, den Aufbau eines ICMP-Pakets am Beispiel von ICMPv4 zu erläutern. Der Protokollkopf beginnt immer mit einer Folge von drei Feldern, die zusammen vier Bytes belegen und folgende Bedeutungen haben:
Das erste Feld, also der Typ, kodiert die Nachricht, während das zweite Feld (der Code) diese Nachricht gegebenenfalls verfeinert. Das Protokoll weist über 200 Typen aus, von denen die meisten allerdings nicht belegt sind. Oft benutzt werden:
Als Beispiel für eine Nachrichtenverfeinerung kann der Typ 3 herangezogen werden:
Das dritte und letzte Feld des ICMP-Protokollkopfs enthält eine zwei Bytes große Prüfsumme, die sich über das gesamte ICMP-Paket erstreckt. Die folgende Grafik veranschaulicht den Aufbau eines ICMP-Pakets und weist einige typische Werte der Felder Typ und Code aus:
Die beiden Nachrichten vom Typ 8 und 0 zeigen, dass ICMP benutzt werden kann, um die Erreichbarkeit einer IP-Station mit darin enthaltener ICMP-Station auf einem Zielrechner per Echo-Anfrage zu ermitteln. Wie ein ICMP-Paket nach seinem Protokollkopf weiter aufgebaut ist, hängt von der jeweiligen Meldung ab, die transportiert werden soll. Ist es eine Fehlermeldung, dann wird der IP-Protokollkopf des fehlerverursachenden Pakets samt seiner ersten 64 Datenbits angefügt. Bei einer Echo-Anfrage wird in die auf die ersten vier Bytes folgenden zwei Bytes eine Kennung für die sendende Anwendung eingetragen, denn Ports stehen für ICMP nicht zur Verfügung.
Zu dem ICMP-Echo-Verfahren gibt es eine Kommandoschnittstelle. Das Kommando wird in Anlehnung an das Geräusch eines Sonars bei einem Treffer ping genannt. Es sendet je nach Parametrisierung mindestens eine Echo-Anforderung an einen Zielhost und setzt einen Timeout. Ist dieser abgelaufen ohne dass eine Antwort vorliegt, wird der Zielhost als nicht erreichbar bezeichnet. Mit dem ping-Kommando steht ein sehr einfaches Werkzeug für eine Netzwerkdiagnose zur Verfügung. Allerdings ist zu beachten, dass ein ungünstiges zeitliches Verhalten im Netzwerk oder Sicherheitssoftware auf dem Zielrechner die Diagnosefähigkeit einschränken.
Das ping-Kommando gibt es in mehreren Ausprägungen. Es ist deshalb angebracht, auf dem lokalen System zunächst die lokale Dokumentation zu studieren. Es folgt ein Beispiel, das im Herbst 2018 auf meinem Rechner an unserer Hochschule gestartet worden ist:
Angesprochen wurde der Rechner hrz.bht-berlin.de. Seine im IP-System enthaltene ICMP-Station hat die Echo-Anfrage meiner ICMP-Station beantwortet. Ist die Echo-Anfrage nach einer voreingestellten aber parametrisierbaren Zeitspanne, im vorliegenden Fall nach 20 Sekunden, noch nicht beantwortet, dann meldet das ping-Kommando:
Manchmal ist es nützlich, das ICMP-Echo-Verfahren eingebettet in eine Programmiersprache zu benutzen. Am Beispiel Java sieht das folgendermaßen aus:
Mit dem Programm wird mit Hilfe der Methode boolean isReachable(int timeout) aus der Klasse InetAddress im Paket java.net ein ICMP-Echo-Request gesendet und 60 Millisekunden auf eine Antwort gewartet.
Ein weiteres elementares Netzwerk-Diagnose-Werkzeug auf der Basis von ICMP ist ein Shellkommando, das in der Unix/Linux-Welt traceroute und in der Windows-Welt tracert heißt. Es verwendet das TTL-Feld aus dem IPv4-Header bzw. das Hop-Limit-Feld aus dem IPv6-Header und nutzt aus, dass jeder Router, den ein IP-Paket erreicht, den Wert dieses Felds um 1 verringert, beim Erreichen des Wertes 0 das zugehörige Paket verwirft und darüber per ICMP-Nachricht (Typ=11) den Absender verständigt.
Das Kommando bildet IP-Pakete, die nur aus einem Protokollkopf bestehen, und verändert den Wert des TTL- bzw. des Hop-Limit-Felds systematisch. Es beginnt mit dem Wert 1, erzeugt drei Pakete mit diesem Wert und sendet sie an eine bestimmte Adresse. Die Folge ist, dass der erste Router, den diese Pakete erreichen, den Wert auf 0 setzt, die Pakete verwirft und den Absender verständigt. Dann erhöht das Kommando den Wert des TTL- bzw. Hop-Limit-Feldes auf 2, bildet wieder drei Pakete und schickt diese an die gleiche Adresse wie vorher. Jetzt wird der zweite Router die Pakete verwerfen und dies melden, usw. Damit auch der Zielrechner selbst zu einer Fehlermeldung provoziert wird, wird durch das Paket eine Anwendung mit einem unmöglichen Port adressiert. Benutzt wird dafür eine extrem hohe Portnummer, zu der es mit großer Wahrscheinlichkeit keine Anwendung gibt. Der Empfänger reagiert dann mit einem ICMP-Paket mit der Meldung Port nicht erreichbar (Typ=3; Code=3).
Durch dieses Vorgehen entsteht durch die Folge der ICMP-Antworten eine Fährte (ein Trace) der Pakete durch das Netzwerk bis hin zum Empfänger. Sie ist etwas verwaschen, weil unterschiedliche Pakete unterschiedliche Wege nehmen können. Wie schon das ping-Kommando liegt auch das traceroute- bzw. tracert-Kommando in verschiedenen Ausprägungen vor, so dass auch hier vor einer Verwendung die lokale Dokumentation herangezogen werden sollte. Der folgende Kommandoaufruf wurde im Herbst 2018 auf meinem Rechner an der Hochschule gestartet. Er zeigt eine Fährte vom Wedding in Berlin zu dem Webserver des World-Wide-Web-Konsortiums: (In der folgenden Kommandoausgabe sind lediglich die waagrechten Trennstriche aus optischen Gründen im Nachhinein hinzugefügt worden.)
Ein Sternchen in der Ausgabe bedeutet, dass es auf das zugehörige IP-Paket in der vorgegeben Wartezeit keine Antwort gegeben hat. Die sichtbar gewordene Fährte führt über die TU-Berlin nach Frankfurt/Main, von dort ohne Zwischenstopp (per Satellit) nach Chicago und endet schließlich in New York City.