orm@doc-tcpip.org

Erstellt: Mai 2001 - Letzte Modifikation: Februar 2003

[ Main | Local ]


Address Resolution Protocol

Es gibt dazu einen IP-Trace - In Tracing

Die RFCs zum Thema

Alle RFC gibt es beim RFC-Editor (www.rfc-editor.org)

RFC 826 * STD 37 * Ethernet Address Resolution Protocol
RFC 903 * STD 38 * Reverse Address Resolution Protocol
RFC 2390 * Inverse Address Resolution Protocol

Das ARP Protokoll

Das ARP Protokoll ist eigentlich sehr einfach:
Eine Maschine, die die Link Layer Adresse, also die MAC Adresse, einer anderen Maschine haben möchte, stellt diese Anfrage als Broadcast ins Netz. Das muss so sein, denn von der fremden Maschine ist ja "nur" die IP bekannt und mit der kann man auf dem lokalen Link nichts machen: IP braucht eine Adapter Adresse, eine physikaliche Adresse.
In der Anfrage steht die eigene MAC, die eigene IP, die fremde, gewünschte MAC (nur Nullen, ist ja noch nicht bekannt) und die IP der fremden Maschine. Alle Maschinen, die es nicht betrifft die also nicht die angefragte IP-Adresse haben, ignorieren diese Anfragen (da es Broadcasts sind, sieht man sie natürlich im IpTrace; wofür es den Schalter "-a" gibt...). Die betroffene Maschine, also die, welche diese IP-Adresse konfiguriert hat, antwortet darauf. Sie wiederholt die Anfrage und füllt die fehlende MAC ein. Die Antwort geht direkt an den Fragesteller - jeder Rechner hat in seinem ARP-Cache also immer nur die Maschinen, mit denen er wirklich kommuniziert.

Das ist eigentlich alles. Die so gewonnene Information wird nur für kurze Zeit (Default: 20 Minuten) gespeichert und im Bedarfsfall läuft der Mechanismus nochmal an.

ARP Paket Format

Auf einem Ethernet sieht das ARP-Paket so aus:

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Ethernet Destination Address (6 Byte)                     |
+---------------+---------------+---------------+---------------+
|                               |      Ethernet Source          |
+-------------------------------+-------------------------------+
| Frame Type (ARP, 0x0806)      | HW Address Format (Ether 0x1) |
+-------------------------------+-------------------------------+
| Prot-Addr Format(IP 0x0800)   |  HW Länge: 6  | Prot-Länge: 4 |
+-------------------------------+-------------------------------+
| Op-Code: Req. 1, Rep. 2       |          HW Adresse des       |
+-------------------------------+-------------------------------+
|            Senders (Ethernetadresse) (6 Byte)                 |
+---------------------------------------------------------------+
|      Protokoll Adresse des Senders (IP Adresse) (4 Byte)      |
+---------------------------------------------------------------+
|                 HW Adresse des Zieles                         |
+---------------------------------------------------------------+
|  (Ethernetadresse) (6 Byte)   |      Protokoll Adresse des    |
+---------------------------------------------------------------+
| Zieles (IP Adresse)  (4 Byte) |
+-------------------------------+

Bei einem ARP-Request ist die gesuchte Ziel-Adresse leer (Null). Im ARP-Reply wird die Ziel-Adresse eingetragen, beide Blöcke werden vertauscht und der Op-Code wird angepasst. Dann kommt das Paket auf den Draht.

In der ARP-Table wird den lokalen IP-Adressen eine MAC-Adresse zugeordnet. Über das ARP Protokoll wird die Tabelle gefüllt und aktuell gehalten. Das Senden eines Paketes an einen lokalen Rechner ist nur unter Kenntniss der MAC-Adresse möglich.

Die ARP-Table kann man manipulieren:
Der Befehl arp -a zeigt alle Einträge an:

#arp -a
bosteam4.ncs.xyz.com (6.39.4.63) at 0:20:35:79:5:68 [token ring]
dcesp6.ncs.xyz.com (6.39.7.146) at 8:0:5a:81:e6:97 [token ring]
dcehd2.lbg.xyz.com (6.228.8.12) at (incomplete)
obelixn.ncs.xyz.com (6.39.0.195) at 0:20:35:7a:cb:69 [token ring]
cristina.ncs.xyz.com (6.39.0.74) at 0:6:29:b9:50:3f [token ring]

Mit dem Befehl arp -an kann man die Namensauflösung unterdrücken - die kann oft viel Zeit kosten. Es wird die IP und die MAC angegeben, sowie das benutzte Protokoll (hier Token Ring).

"Incomplete" bedeutet, das diese Maschine auf ARP Requests nicht antwortet.

Man kann ARP Einträge löschen (mit dem Befehl arp -d hostname) und man kann sie anlegen:
arp -s ether HostName ether_address [temp] [pub]
Man muß dabei das Protokoll angeben (ether, token ring etc). Man kann den Eintrag als "temp" oder "pub" definieren. Standard ist, das der Eintrag bis zum Reboot in der Table bleibt - mit "temp" unterliegt er dem arpkillc Intervall, wird also aus der ARP-Table nach einer eingestellten Zeit gelöscht - wenn er nicht benutzt wird. Mit "pub" sagt man dem System, das dieser Eintrag im Netz auf ARP Requests hin ausgegeben werden soll - obwohl es nicht die eigene Adresse des Hosts ist (proxy ARP).

Die ARP Table des Kernels ist eine Hash-Table. Das heisst, sie ist nach verschiedenen Suchkriterien geordnet, um einen schnelleren Zugriff zu haben. Bei den meisten Unixen (und bei AIX) funktioniert der Algorithmus optimal, wenn man die Anzahl der Buckets auf eine Primzahl setzt.

Die ARP Table ist aus einigen "Buckets" mit einer bestimmten Größe zusammengesetzt. Das kann man definieren.

Die insgesamt möglichen Einträge sind dann :
Anzahl der Buckets * Größe des Bucket = Gesamtanzahl ARP Einträge

Dabei sind pro Bucket nur 3 statische ARP Einträge möglich. Unter normalen Bedingungen wird der älteste Eintrag gelöscht, wenn Platz fehlt. Trotzdem ist es eine gute Administrationspraxis, die Anzahl der möglichen Einträge den Gegebenheiten anzupassen - plus eine Sicherheitsmarge.
Die Tabelle sollte also mindestens so groß sein wie die Anzahl aller IP-Adressen auf dem lokalen Subnetz. Besser ist es jedoch, etwa 2-3 mal soviel Platz vorzusehen, da es vorkommen kann, das der Algorithmus eine Adresse in einen schon vollen Bucket legt - obwohl woanders vielleicht noch Platzwäre.

Unter AIX ist das durch einige no-Parameter konfigurierbar:

arptab_bsiz = 7
arptab_nb = 25
arpqsize = 1
arpt_killc = 20
arptab_bsiz ist die Größe der Buckets (jeder einzelne), Standard ist 7.
arptab_nb ist die Anzahl dieser Buckets, Standard ist 25.
Das heisst, das in die ARP-Table 7*25 Einträge passen. Man sollte dann ab und an mit arp -a prüfen, wie voll die Tabelle im Schnitt ist. 175 Einträge sind möglich, ab 80-100 ist es sicher eine gute Sache, sie zu vergrößern.
arpqsize ist die Anzahl an offenen ARP Requests, die zur Bearbeitung anstehen. Bei sehr aktiven Web-Servern kann man das etwas vergrößern.
arpt_killc ist die Zeit, die die Einträge in der ARP-Table bleiben. Standard ist 20 Minuten. Sollte auf einen Eintrag 20 Minuten lang nicht zugegriffen worden sein, so wird er gelöscht.

arptab_bsiz und arptab_nb sind keine Runtime-Attribute, sondern Loadtime-Attribute. Sie werden nur durch einen Reboot wirksam und müssen in der /etc/rc.net vor dem Aufruf von der Methode defif stehen. (/usr/lib/methods/defif >>$LOGFILE 2>&1) Mit dieser Methode wird in AIX die netinet-Kernel Extension geladen, und die muß die neuen Settings natürlich kennen.

Neuigkeiten in AIX 5

Mit AIX 5 ist die Ausgabe des arp-Kommandos deutlich Nutzer-freundlicher geworden. Man kann jetzt alle Buckets und ihren Inhalt sehen - und sogar zuordnen, welcher Eintrag in welchem Bucket sitzt. Hier ein Beispiel:

 

  nd-3.orm.org (10.10.10.200) at 0:4:ac:97:76:d [ethernet] stored in bucket 5

  nd-2.orm.org (10.10.10.1) at 8:0:20:be:4c:6f [ethernet] stored in bucket 6

  nd-2aq1.orm.org (10.10.10.2) at 8:0:20:be:4c:6f [ethernet] stored in bucket 7

  nd-2bq1.orm.org (10.10.10.3) at 8:0:20:be:4c:6f [ethernet] stored in bucket 8

  nd-4a.orm.org (10.10.10.4) at 0:20:35:8d:97:a3 [ethernet] stored in bucket 9

  nd-4b.orm.org (10.10.10.5) at 0:20:35:8d:e7:fd [ethernet] stored in bucket 10

  nd-8.orm.org (10.10.10.80) at 0:20:35:8d:e7:fd [ethernet] stored in bucket 10

  nd-80b.orm.org (10.10.10.82) at 0:6:29:c3:45:2e [ethernet] stored in bucket 12

  dns.orm.org (10.10.10.60) at 0:4:ac:97:76:68 [ethernet] stored in bucket 15

  dnscache.orm.org (10.10.10.61) at 0:4:ac:97:76:68 [ethernet] stored in bucket 16

bucket:    0     contains:    0 entries
bucket:    1     contains:    0 entries
bucket:    2     contains:    0 entries
bucket:    3     contains:    0 entries
bucket:    4     contains:    0 entries
bucket:    5     contains:    1 entries
bucket:    6     contains:    1 entries
bucket:    7     contains:    1 entries
bucket:    8     contains:    1 entries
bucket:    9     contains:    1 entries
bucket:   10     contains:    2 entries
bucket:   11     contains:    0 entries
bucket:   12     contains:    1 entries
bucket:   13     contains:    0 entries
bucket:   14     contains:    0 entries
bucket:   15     contains:    1 entries
bucket:   16     contains:    1 entries
bucket:   17     contains:    0 entries
bucket:   18     contains:    0 entries
bucket:   19     contains:    0 entries
bucket:   20     contains:    0 entries
bucket:   21     contains:    0 entries
bucket:   22     contains:    0 entries
bucket:   23     contains:    0 entries
bucket:   24     contains:    0 entries

There are 10 entries in the arp table.

[ Main | Local ]

[ Allgemein | UNIX | AIX | TCP-IP | TCP | ROUTING | DNS | NTP | NFS | FreeBSD | Linux | RPi | SMTP | Tracing | GPS | LW ]

Copyright 2001-2021 by Orm Hager - Es gilt die GPL
Feedback bitte an: Orm Hager (orm@doc-tcpip.org )