Lokale Netze (LAN) — ARP, ICMP und PING
Good, Fast, Cheap: Pick any two (you can't have all three).
R. Callon, The Twelve Networking Truths, April 1996
Address Resolution Protocol (ARP)
Um einem Endsystem/Host ein Datenpaket zuzusenden, reicht die Kenntnis der Netzwerkadresse allein nicht aus. Dem sendenden System muss auch die physikalische Adresse des Zielsystems bekannt sein. Endsysteme brauchen also eine Möglichkeit, Netzwerkadressen in physikalische Adressen umsetzen zu können bzw. zu Netzwerkadressen die zugehörigen physikalischen Adressen herausfinden zu können.
ARP-Datagramm
In der Internet-Protokollwelt gibt es für die Adressumsetzung ein eigenes Protokoll, das Address Resolution Protocol (ARP). Die folgende Abbildung zeigt den Aufbau eines ARP-Datagramms.
| Hardware Address Space | 2 Byte |
|---|---|
| Protocol Address Space | 2 Byte |
| Length of Hardware Address (n) | 1 Byte |
| Length of Protocol Address (m) | 1 Byte |
| Operation Code | 2 Byte |
| Hardware Address of Sender | n Byte |
| Protocol Address of Sender | m Byte |
| Hardware Address of Target | n Byte |
| Protocol Address of Target | m Byte |
- Hardware Address Space:
- Netzwerk-Typ, in dem das Datagramm generiert wurde (z.B. Ethernet: 1, IEEE 802 Networks: 6).
- Protocol Address Space:
- Protokoll-Typ, von dem die Operation angefordert wurde (identisch mit dem Ethernet-Typenfeld).
- Length of Hardware Address:
- Länge der physikalischen Adresse in Byte (z.B. MAC-Adresse: 6).
- Length of Protocol Address:
- Länge der Netzwerk-Adresse (z.B. IP-Adresse: 4).
- Operation Code:
- Art der Operation (1 = ARP-Anforderung, 2 = ARP-Antwort, 3 = RARP-Anforderung, 4 = RARP-Antwort).
- Hardware Address of Sender:
- Physikalische Adresse des Absenders (z.B. MAC-Adresse).
- Protocol Address of Sender:
- Netzwerk-Adresse des Absenders (z.B. IP-Adresse).
- Hardware Address of Target
- Physikalische Adresse des Empfängers (falls bekannt).
- Protocol Address of Target:
- Netzwerk-Adresse des Empfängers.
Arbeitsweise von ARP
Eine ARP-Operation läuft folgendermaßen ab:
- System A will ein IP-Datagramm an System B senden, kennt aber nur dessen IP-Adresse, nicht jedoch dessen MAC-Adresse. System A sieht in der eigenen Adresstabelle (ARP-Cache) nach, ob dort die Zuordnung MAC-Adresse/IP-Adresse für System B eingetragen ist. Wenn nicht, bildet System A ein ARP-Anforderungs-Datagramm und sendet dieses als MAC-Broadcast an alle erreichbaren Systeme.
- Sobald das gesuchte Datenendgerät B das ARP-Anforderungs-Datagramm erhält und die eigene IP-Adresse erkennt, sendet sie ein ARP-Antwort-Diagramm zurück an System A und teilt dieser damit ihre MAC-Adresse mit. Gleichzeitig trägt System B in seine Adresstabelle die Zuordnung MAC-Adresse/IP-Adresse für System A ein, sofern diese Zuordnung noch nicht im ARP-Cache von B ist.
- System A trägt nach Erhalt des ARP-Antwort-Datagramms von B die Zuordnung MAC-Adresse/IP-Adresse für System B in seine Adresstabelle ein und kennt damit die MAC-Adresse von System B. Anschließend kann A dann das anstehende IP-Datagramm mit der richtigen MAC-Zieladresse versehen und abschicken.
Ergänzt wird ARP durch ein weiteres Protokoll, das Reverse Address Resolution Protocol (RARP). Dieses Protokoll stellt das Gegenstück zu ARP dar und ermöglicht es, zu einer bekannten physikalischen Adresse (MAC-Adresse) die zugehörige Netzwerkadresse (IP-Adresse) zu finden. Hierbei benötigt man allerdings einen entsprechenden Server, der die gesuchten Adressinformationen bereithält.
ARP als Kommando
Basierend auf dem Protokoll ARP gibt es bei allen bekannten Betriebssystemen ein Zeilenkommando, das ebenfalls ARP heißt. Unter Windows 2000 sieht die Syntax folgendermaßen aus:
ARP -s IP_Adr Eth_Adr [Schnittst]
ARP -d IP_Adr [Schnittst]
ARP -a [IP_Adr] [-N Schnittst]
-a Zeigt aktuelle ARP-Einträge durch Abfrage der Protokoll-
daten an. Falls IP_Adr angegeben wurde, werden die IP- und
physikalische Adresse für den angegebenen Computer ange-
zeigt. Wenn mehr als eine Netzwerkschnittstelle ARP
verwendet, werden die Einträge für jede ARP-Tabelle
angezeigt.
-g Gleiche Funktion wie -a.
IP_Adr Gibt eine Internet-Adresse an.
-N Schnittst Zeigt die ARP-Einträge für die angegebene Netzwerk-
schnittstelle an.
-d Löscht den durch IP_Adr angegebenen Hosteintrag. IP_Adr
kann mit dem '*'-Platzhalter versehen werden, um alle Hosts
zu löschen.
-s Fügt einen Hosteintrag hinzu und ordnet die Internetadresse
der physikalischen Adresse zu. Die physikalische Adresse wird
durch 6 hexadezimale, durch Bindestrich getrennte Bytes
angegeben. Der Eintrag ist permanent.
Eth_Adr Gibt eine physikalische Adresse (Ethernetadresse) an.
Schnittst Gibt, falls vorhanden, die Internetadresse der Schnittstelle
an, deren Übersetzungstabelle geändert werden soll.
Sonst wird die erste geeignete Schnittstelle verwendet.
Internet Control Message Protocol (ICMP)
Da IP einen (verbindungslosen) Datagramm-Dienst darstellt und somit die korrekte Zustellung von IP-Datagrammen nicht garantiert werden kann, gibt es ein zusätzliches Protokoll, das Internet Control Message Protocol (ICMP), das in gewissem Umfang Fehlersituationen behandeln kann und darüberhinaus Diagnoseinformationen über den Netzbetrieb liefert. ICMP setzt zwar direkt auf IP auf und benötigt somit keines der üblichen Transportprotokolle UDP oder TCP. Da es jedoch den höheren Kommunikationsschichten nicht zur Verfügung steht, wird es wie IP in der Netzwerkschicht angesiedelt.
Im Header eines IP-Datagramms, das eine ICMP-Nachricht enthält, steht im Feld Protocol der Wert 1 für ICMP und im Feld Type of Service (TOS) der Wert 0. Ein ICMP-Datagramm hat folgenden Aufbau:
| Type | 1 Byte |
|---|---|
| Code | 1 Byte |
| Checksum | 2 Byte |
| Data |
- Type:
- Typ der ICMP-Nachricht.
- Code:
- Zusatzinformationen für den betreffenden Nachrichtentyp.
- Checksum:
- Prüfsumme.
- Data:
- Kontextabhängige Informationen.
Die folgende Tabelle gibt einen Überblick über die möglichen ICMP-Nachrichtentypen.
| Wert (dez) | ICMP-Nachrichtentyp |
|---|---|
| 0 | Echo reply (Echo Antwort) |
| 3 | Destination unreachable (Ziel nicht erreichbar) |
| 4 | Source quench (Aussenderate drosseln) |
| 5 | Redirect (Umleitung) |
| 8 | Echo (Echo Anforderung) |
| 11 | Time exceeded (Zeitüberschreitung) |
| 12 | Parameter problem (Parameterprobleme) |
| 13 | Timestamp (Uhrzeit anfordern) |
| 14 | Timestamp reply (Antwort auf Uhrzeitanforderung) |
| 15 | Information request (Anforderung von Netzwerk-Informationen) |
| 16 | Information reply (Antwort auf Informationsanforderung) |
| 17 | Address mask request (Anforderung von Adressmasken) |
| 18 | Address mask response (Antwort auf Maskenanforderung) |
Echo / Echo reply
Wenn ICMP zu Diagnose-Zwecken eingesetzt wird, kommen am häufigsten die Nachrichtentypen 0 und 8 vor. Das bekannte Programm PING stellt eine Implementierung dieser beiden Nachrichtentypen dar.
| Type 0 (Echo reply) / Type 8 (Echo) | 1 Byte |
|---|---|
| Code 0 | 1 Byte |
| Checksum | 2 Byte |
| Identifier | 2 Byte |
| Sequence Number | 2 Byte |
| Data |
- Identifier:
- Hilfe zur eindeutigen Kennzeichnung von ICMP-Datagrammen.
- Sequence Number:
- Hilfe zur eindeutigen Kennzeichnung von ICMP-Datagrammen.
- Data:
- Lasterzeugung durch optionales Mitführen von Daten.
Destination unreachable
Wenn ein IP-Datagramm nicht zugestellt werden kann, kann der Grund für die Unzustellbarkeit mit Hilfe eine ICMP-Datagramms des Typs 3 dem Absender mitgeteilt werden.
| Type 3 (Destination unreachable) | 1 Byte |
|---|---|
| Code | 1 Byte |
| Checksum | 2 Byte |
| Unused | 4 Byte |
| Data |
- Code:
- Fehlerursache für die Unzustellbarkeit:
- 0: Net unreachable (das mit der IP-Zieladresse angegebene Netz wurde von einem Router nicht gefunden),
- 1: Host unreachable (der mit der IP-Zieladresse angegebene Host wurde vom Standard-Router (Standard-Gateway) nicht gefunden),
- 2: Protocol unreachable (das im IP-Datagramm transportierte Protokoll ist im Ziel-Host nicht verfügbar),
- 3: Port unreachable (der im IP-Datagramm angegebene Anwendungsdienst ist im Ziel-Host nicht verfügbar),
- 4: Fragmentation needed and Don't Fragment Bit set (Router müsste, darf aber nicht fragmentieren),
- 5: Source Route failed (Router kann IP-Datagramm auf vorgeschriebener Route nicht weiterschicken).
- Unused:
- Wert muss auf 0 gesetzt sein.
- Data:
- Kompletter IP-Header und die ersten 64 bit der im IP-Datagramm transportierten Daten.
ICMP-Datagramme mit den Codes 0, 1, 4 und 5 werden von einem Router oder Gateway erzeugt, ICMP-Datagramme mit den Codes 2 und 3 vom Ziel-Host.
Time exceeded
Kann ein IP-Datagramm wegen einer Zeitüberschreitung sein Ziel nicht erreichen, kann dies dem Absender mit Hilfe eines ICMP-Datagramms des Typs 11 angezeigt werden.
| Type 11 (Time exceeded) | 1 Byte |
|---|---|
| Code | 1 Byte |
| Checksum | 2 Byte |
| Unused | 4 Byte |
| Data |
- Code:
-
- 0: TTL-Wert (Time to live) des IP-Datagramms hat den Wert 0 erreicht und wird verworfen,
- 1: Beim Zusammensetzen von Fragmenten wurde Zeitlimit überschritten.
- Unused:
- Wert muss auf 0 gesetzt sein.
- Data:
- Kompletter IP-Header und die ersten 64 bit der im IP-Datagramm transportierten Daten.
ICMP-Datagramme mit dem Code 0 werden von einem Router oder Gateway erzeugt, ICMP-Datagramme mit dem Code 1 vom Ziel-Host.
Das Kommando PING
Das Zeilenkommando PING (Packet Internet Groper) ist ein Programm, mit der die Erreichbarkeit unter IP getestet werden kann. Ein System, das ein PING abschickt, sendet ICMP-Datagramme des Typs 8 (Echo) und erwartet ein ICMP-Datagramm des Typs 0 (Echo reply) vom Empfänger, falls dieser erreichbar ist. Unter Windows 2000 sieht die Syntax folgendermaßen aus:
ping [-t] [-a] [-n Anzahl] [-l Größe] [-f] [-i Gültigkeitsdauer]
[-v Diensttyp] [-r Anzahl] [-s Anzahl] [[-j Hostliste] |
[-k Hostliste]] [-w Zeitlimit] Zielliste
-t Sendet fortlaufend Ping-Signale zum angegebenen Host.
Geben Sie STRG-UNTRBR ein, um die Statistik anzuzeigen.
Geben Sie STRG-C ein, um den Vorgang abzubrechen.
-a Löst Adressen in Hostnamen auf.
-n n Anzahl Anzahl zu sendender Echoanforderungen
-l Länge Pufferlänge senden
-f Setzt Flag für "Don't Fragment".
-i TTL Gültigkeitsdauer (Time To Live)
-v TOS Diensttyp (Type Of Service)
-r Anzahl Route für Anzahl der Abschnitte aufzeichnen
-s Anzahl Zeiteintrag für Anzahl Abschnitte
-j Hostliste "Loose Source Route" gemäß Hostliste
-k Hostliste "Strict Source Route" gemäß Hostliste
-w Zeitlimit Zeitlimit in Millisekunden für eine Rückmeldung
Zielliste Adresse oder Name des Zielhosts
Die Reichweite von PING endet in der Netzwerkschicht. Arbeitet PING einwandfrei, bedeutet dies somit lediglich, dass die unteren 3 Protokoll-Schichten (z.B. Ethernet und IP) funktionsfähig sind. Ob z.B. eine TCP-Verbindung möglich ist oder ob eine auf TCP aufbauende Kommunikationsanwendung funktioniert, kann mit PING nicht verifiziert werden.
Manuelle MTU-Bestimmung
Im Abschnitt Fragmentierung und MTU des Kapitels Internet-Protokoll und IP-Adressen wird der Begriff der Maximum Transmission Unit (MTU) vorgestellt und erläutert. Diese MTU kann mit Hilfe des PING-Kommandos manuell auf folgende Weise bestimmt werden:
- Zunächst ermittelt man die MTU des lokalen Netzes, an das der sendende Host angeschlossen ist.
- Dann schickt man eine
ICMP-Nachricht
Echo mit einer dieser
MTU
entsprechenden Gesamtlänge und mit gesetztem
Don't-Fragment-Bit an den Ziel-Host.
Dies erreicht man durch folgendes Kommando:
ping -f -l Puffer Zielhost, wobei Puffer = MTU - 28 die Größe des Datenfeldes des ICMP-Echo-Paketes festlegt. Bekanntlich beträgt die Länge des IP-Headers 20 Byte. Die Länge des ICMP-Echo-Paketes beträgt 8 Byte. Dies ergibt zusammen 28 Byte, die man von der MTU abziehen muss. - Wenn das PING ungehindert durchkommt, hat man die optimale MTU bereits gefunden. Ansonsten erhält man eine ICMP-Nachricht Destination Unreachable mit dem Fehlercode 4 (Fragmentation needed and Don't Fragment Bit set) zurück und man wiederholt den vorigen Schritt mit einer kleineren Puffergröße.
- Diese Prozedur wird so lange wiederholt, bis man den größtmöglichen Puffer gefunden hat, mit dem das PING zum Ziel-Host durchkommt. Schließlich ist MTU = Puffer + 28 der gesuchte optimale Wert, der in der Systemsoftware des sendenden Hosts eingestellt werden muss, um bei der Bildung von IP-Datagrammen entsprechend berücksichtigt zu werden.
Sowohl das automatische, als auch das manuelle Ermitteln der optimalen MTU scheitert, wenn auf dem Übertragungsweg ein Router oder ein Gateway so konfiguriert ist, dass die benötigten ICMP-Nachrichten unterdrückt oder herausgefiltert werden.
Das Kommando TRACERT / TRACEROUTE
Das Zeilenkommando TRACERT bzw. TRACEROUTE ist ein Programm, mit dem der Weg von IP-Datagrammen verfolgt werden kann. Das Programm sendet IP-Datagramme mit ständig wachsendem TTL-Wert (Time to live) aus. Der TTL-Wert eines IP-Datagramms wird von jedem Router, der das Paket weiterleitet, um 1 erniedrigt. Derjenige Router, der ein IP-Datagramm mit dem TTL-Wert 1 empfängt und diesen Wert dann auf 0 setzt, verwirft das IP-Datagramm und zeigt dies dem Absender über eine ICMP-Nachricht des Typs 11 an. Durch ein IP-Datagramm mit einem TTL-Wert von 1 kann so eine Fehlermeldung durch den ersten Router erzwungen werden, durch ein IP-Datagramm mit einem TTL-Wert von 2 eine Fehlermeldung durch den zweiten Router, durch ein IP-Datagramm mit einem TTL-Wert von 3 eine Fehlermeldung durch den dritten Router usw., so dass letztendlich die gesamte Routerstrecke bis zum Ziel ermittelt werden kann. Unter Windows 2000 sieht die Syntax folgendermaßen aus:
tracert [-d] [-h Abschnitte max] [-j Hostliste] [-w Zeitlimit]
Zielname
-d Adressen nicht in Hostnamen auflösen
-h Abschnitte max Max. Anzahl an Abschnitten bei Zielsuche
-j Hostliste "Loose Source Route" gemäß Hostliste
-w Zeitlimit Zeitlimit in Millisekunden für eine Antwort
Dieses Programm ist insbesondere beim Aufspüren von Engpässen hilfreich. Das Programm kann ermitteln, wieviel Router auf dem Weg zum Empfänger zu passieren sind, welche Netz-Provider involviert sind (über den Domänen-Namen) und welche Netzsegmente hohe Verzögerungsraten aufweisen.