End2End-Ping

Ein PING ist nicht wirklich eine sinnvoll messbare Größe, das die ICMP-Pakete sehr klein sind und man eine aktive Gegenstelle braucht. Man kann aber anhand der Laufzeit schon erkennen, ob es "Aussetzer" gibt, d.h. Pakete verloren gehen oder Engpässe einer WAN-Leitung ein Problem darstellen können. End2End-Ping hat mir auch bei Clustern schon öfter geholfen, wenn ich damit z.B. einen Ping zwischen den Heartbeat-Karten aktiviert habe, um hier speziell bei Clusterknoten mit etwas "Entfernung" Aussagen über die Zuverlässigkeit machen zu können.

Funktionsweise

Das Skript sendet kontinuierlich (jede Sekunde) ein ICMP-Ping-Paket mit konfigurierbarer Paketgröße (Default 160 Bytes) und an eine bekannte Gegenstelle und wertet die Ergebnisse aus. Dazu fasst es eine Gruppe von Pings (Default: 15 Stück) zusammen und ermittelt Min, Max, Average, Anzahl und Loss.

Achtung
ICMP ist nur ein bedingt gültiger Test für VoIP-Qualität. Zum einen ist ICMP kein UDP und das Skript hier wartet auf die Antwort, ehe es das nächste Paket sendet. Insofern kann es keinen Dauerstrom mit 20ms Abstand senden. Die Paketrate ist niedriger und von der Roundtrip-Zeit abhängig.

Umsetzung

Das Skript testet erst mal genau ein Ziel und erwartet die Zwischenstationen im Fehlerfall als auch die Ausgabeziele als Parameter. Folgende Parameter sind verfügbar

  • hostname = internetbeacon.msedge.net
    Eine IP-Adresse oder der DNS-Name des Zielsystems. Die Adresse internetbeacon.msedge.net ist ein Standardservice von Microsoft, über den Clients prüfen, ob sie Verbindung zum Internet haben. Test-NetConnection nutzt diese Adresse auch als Default
  • Pingcount = 15
    Ich pinge im Abstand von 1 Sekunde insgesamt 15 Mal um die Ergebnisse dann zusammen zu sammeln.
  • PingTimeout = 200
    Nach 200ms wird ein Paket als "loss" gezählt. Ich denke, dass ein Ping in der Regel nicht länger dauern sollte
  • Buffersize(default 160)
    Größe des Buffers, der übertragen wird. Ich nutze hier 160 Byte als Default. Auch ein VoIP ist z.B. 160 Bytes groß.
  • csvfilename .(\end2end-ping.csv)
    Erlaubt die Angabe einer CSV-Datei, in der die Ergebnisse gespeichert werden. So können Sie diese auch später einmal auswerten.

Das Skript initialisiert das ICMP-Objekt und den Sendepuffer und versendet über eine Endlosschleife die ICMP-Pakete und sammelt die Ergebnisse ein. Die Laufzeit wird hinsichtlich Maximum und Minimum bewertet und über alle Pakete einer Gruppe wird ein Mittelwert (AVG) gebildet und die als "loss" definierten Pakete aufaddiert.

Ausgabe

Natürlich wollten wie ja noch wissen, wie die Ausgabe aussieht. In der PowerShell Box ist die Arbeit des Skripts zu sehen. Ich habe die Ausgabe etwas farbig gemacht. Hier eine schlechte Verbindung in einem Gäste-WLAN eines Kunden.

Im Gegenzug dazu eine recht ordentliche Verbindung an einem DSL100-Anschluss

Hier noch ein Ausschnitt bei mir zuhause am DSL-Anschluss, wenn ein Anwender sich das erste Mal an einem PC anmelden und OneDrive mit der Synchronisierung startet:

Interessanter ist natürlich, später die Ausgabe in der CSV-Datei auszuwerten. Auch hier erst mal nur die Textanzeige:

Eventuell ändere ich den Zeitstempel noch mal, um die Ausgabe "schöner" zu machen. Die Spalten zeigen an, welcher Wert welche Bedeutung hat. Einfacher ist natürlich der Import per PowerShell.

PS C:\> Import-Csv end2end-ping.csv

statusavg2min    : 0
Total            : 15
Lost             : 5
Avg              : 19
RemoteIP         : 13.107.4.52
timestamp        : 20181115041959
Min              : 27
Max              : 29
statuspacketloss : 1
statusmax2avg    : 0

Ihnen stehen alle Wege offen, z.B., nach Feldern wie "statuspacketloss" zu filtern oder auch die Auswertungen grafisch mit Excel oder Power Bi o.ä. aufzubereiten.

Download

Für die Ausführung sind keinerlei privilegierte Rechte erforderlich. Das Skript kann auf jedem PC mit PowerShell 2.0 ausgeführt werden.

end2end-ping.20181119.ps1.txt
Bitte nach dem Download die Erweiterung nach ps1 umstellen.

Achtung
Wenn Sie sinnvolle Ergebnisse erhalten wollen, dann müssen Sie die Parameter an ihre Umgebung anpassen !!!

Hinweis:
Das Skript sendet die Ausgaben auch als Objekte in die Pipeline für eine weitere Verarbeitung, z.B. den Versand an PRTG o.ä. Damit diese Ausgaben nicht die Bildschirmausgabe stören, können Sie ein " | out-null" anhängen

Offen

Aktuell ist End2End-Ping ein "Single Threaded" Script, welches immer nur genau eine Gegenstelle anpingt. Sicher können Sie das Skript einfach mehrfach starten aber das kostet schon mehr Ressourcen. Interessanter könnte es sein, wenn ich parallel mehrere Systeme und auch sehr häufig anpingen könnte. Aktuell habe ich aber noch kein Skript, welches dies macht. Irgendwann müsste ich auch mal IPv6 integrieren.

Weitere Links