End2End-ARP
Mit Ping-Paketen ist es sehr einfach, die Laufzeit zu einem System im gleichen Netzwerk oder auch entfernten Systemen zu messen. Voraussetzung ist dabei natürlich, dass die Gegenseite auf ein ICMP-ECHO-Request auch reagiert. Das ist oft aber nicht immer der Fall und selbst in Windows wird das ICMP-Verhalten über die Firewall granular gesteuert.
ARP-Tabelle
Wenn ich in einem Ethernet mit einem Rechner im gleichen Subnetz kommunizieren möchte, dann geht das nur auf den ersten Blick über die IP-Adresse. Im Unterbau erfolgt die Adressierung aber über die MAC-Adresse des Geräts. Der IP-Stack pflegt daher eine Liste der IP-Adressen zu MAC-Adressen in einem ARP-Cache. Den Cache können Sie mit dem Befehl "arp -a" unter Windows anzeigen lassen:
PS C:\> arp -a Schnittstelle: 192.168.178.50 --- 0x2 Internetadresse Physische Adresse Typ 192.168.178.1 2c-91-ab-49-d7-c9 dynamisch 192.168.178.2 70-4f-57-23-1a-19 dynamisch 192.168.178.4 ac-e2-d3-c5-85-2d dynamisch 192.168.178.5 24-0b-b1-1a-26-f6 dynamisch 192.168.178.6 a0-63-91-a8-06-41 dynamisch 192.168.178.7 40-9b-cd-89-1f-43 dynamisch
Auch per PowerShell erhalten Sie mit "Get-NetNeighour" eine Liste:
PS C:\> Get-NetNeighbor -AddressFamily ipv4 ifIndex IPAddress LinkLayerAddress State Policy Store ------- --------- ---------------- ----- ------ 103 255.255.255.255 FF-FF-FF-FF-FF-FF Permanent Activ… 103 239.255.255.250 01-00-5E-7F-FF-FA Permanent Activ… 103 224.0.0.252 01-00-5E-00-00-FC Permanent Activ… 103 224.0.0.251 01-00-5E-00-00-FB Permanent Activ… 103 224.0.0.22 01-00-5E-00-00-16 Permanent Activ… 103 172.20.223.255 FF-FF-FF-FF-FF-FF Permanent Activ… 103 172.20.210.251 00-15-5D-66-94-21 Permanent Activ… 103 172.20.208.1 00-00-00-00-00-00 Unreachable Activ… 102 239.255.255.250 01-00-5E-7F-FF-FA Permanent Activ… ....
- Get-NetNeighour
https://learn.microsoft.com/en-us/powershell/module/nettcpip/get-netneighbor?view=windowsserver2022-ps - PowerShell: Finding neighbors with Get-NetNeighbor
https://sid-500.com/2017/06/28/powershell-finding-neighbors-with-get-netneighbor/
ARP-Tabelle füllen
Als Benutzer können Sie die ARP-Tabelle nicht verändern oder löschen. Ein Administrator kann statische Einträge addieren oder auch Einträge oder die komplette Liste löschen. Allerdings ist das in der Regel zumindest auf Clients nicht erforderlich und eher störend. Dafür sorgt schon der der IP-Stack, der einen Verbindungswunsch zu einer neuen IP-Adresse erkennt und sich dann um die Ermittlung der dazugehörigen MAC-Adresse kümmert.
Der IP-Stack sendet dazu einen "ARP-Broadcast" in das Netzwerk, der bei allen Computern im gleichen Subnetz bzw. VLAN ankommt. Der fragliche Computer muss darauf mit einer Antwort an den anfragenden Client reagieren. Diese Anfragen können Sie in Wireshark auch recht einfach ermitteln. Hier mal eine Anfrage an ein Synology-NAS und die Antwort.
Wenn ich einen Rechner in einem anderen Subnetz erreichen möchte, dann wird allerdings keine ARP-Anfrage erstellt, denn mein Client muss über das Gateway gehen und im ARP-Cache liegt dann nur die IP-Adresse und damit auch die MAC-Adresse des nächsten Routers. Jeder Teilnehmer im LAN kann über das ARP-Protokoll die Gegenstellen auflösen und dynamisch lernen.
ARP für Latenzzeitmessung?
Was sie aber in dem Wireshark-Mitschnitt noch sehen können, ist die Latenzzeit zwischen den beiden Systemen. Bei meinem Skript End2End-Ping habe ich es immer wieder erlebt, dass ich diverse Systeme in meinem Subnetz nicht per ICMP erreichen kann. Das können WLAN-Router/Access-Points aber auch das Default Gateway sein. Aber ein "Dauerping" zum ersten Hop ist bei einer Fehleranalyse eine wertevolle Datenquelle. Es ist schon häufiger passiert, dass der erste Hop z.B. ein schlechtes WLAN war oder auch einfach nur das Kabel oder der Switch-Port gesponnen hat. Extremer sind dann die Beispiele, wenn ein WLAN-Accesspoint die Daten über eine Layer2-Tunnelverbindung aus dem Homeoffice in die Firma geroutet hat. Es ist dann schon irreführend, wen ein PING zum Default Gateway nicht 0-2ms sondern 15-20ms Laufzeit hat. Dazu muss das Gateway auf einen PING aber auch reagieren, was nicht garantiert ist. Aber auf eine ARP-Anfrage reagiert (fast) jedes IP-Endgerät im gleichen Subnetz, denn sonst könnte es nicht an der an sich dynamischen Kommunikation teilnehmen.
Leider habe ich dann doch schnell erkannt, dass es doch nicht so einfach die ARP-Funktion einer Gegenstelle für eine Latenzzeit zu missbrauchen. Ich habe zumindest keine .NET-Klasse gefunden, mit der ich einen ARP-Request starten und die Antwort einfangen kann. Natürlich kann man am IP-Stack vorbei mir RAW-Sockets oder direkt per WINPCAP/NPCAP auch Pakete senden und empfangen aber dazu benötigen wir administrativen Berechtigungen.
Auch der Weg den ARP-Cache für einen Eintrag zu löschen und dann ein ICMP/UDP-Paket zu initiieren und danach im ARP-Cache nachzuschauen ist möglich, aber liefert keine verlässlichen Werte. Ich habe nämlich keinen Trigger oder Event gefunden, der einen neuen Eintrag meldet. Also müsste ich den Status immer wieder wieder abpollen.
Zwischenstand
Als meine ersten End2End-Ping bei Kunden aufgrund von ICMP-Blockaden versagt haben, wollte ich ganz schnell einfach die ARP-Antworten als Messwerte heranziehen. Allerdings wäre das nur mit einer sehr netzwerknahen Programmierung quasi neben dem IP-Stack zu schaffen gewesen. Sicher könnte ich den ARP-Cache leeren und einen ARP-Request per ICMP oder UDP auslösen und sowohl den Request als auch den Response per WinPCap, NCAP o.ä. erfassen. Praktikabel ist das aber nicht.
Dann frage ich lieber höflich, ob ein ICMP-Ping oder ein UDP-Echo möglich ist.
Weitere Links
- End2End-Ping
- Mit der Windows PowerShell sämtliche erkannten MAC-Adresse auslesen –
ARP-Cache
https://it-learner.de/mit-der-windows-powershell-saemtliche-erkannten-mac-adresse-auslesen-arp-cache/ - NetNeighbor Watch: The PowerShell Alternative To Arpwatch
https://spiderzebra.com/2020/08/31/netneighbor-watch-the-powershell-alternative-to-arpwatch/