Meine Implementierung von ping

Das Hilfsprogramm ping ist aus dem Werkzeugkasten des TCP/IP-Netzwerkers nicht wegzudenken. Es versendet ICMP-"Echo-Request"-Pakete und wertet die Antworten aus, um Aussagen über die Beschaffenheit der Netzwerkverbindung treffen zu können. Die Bezeichnung "ping" ist eine Anlehnung an die Geräusche eines Sonar-Systems, wie es zur Unterwasser-Ortung genutzt wird. Dazu gibt es eine interessante Seite: The Story of the PING Program von Mike Muuss, dem Erfinder und Autor des ersten Ping-Programms.

Auch meine Implementierung nutzt einen Raw Socket zum Versenden von ICMP-Echo-Requests. In der ersten Version von 2002 habe ich den Sendezeitpunkt in den Datagrammen übertragen, sodaß er beim Empfang zur Berechnung der Laufzeit genutzt werden kann. Dies hat den Nachteil, daß nicht beliebig kleine Ping-Pakete möglich sind (die Nutzdaten müssen groß genug sein, um einen Timestamp aufzunehmen). In meiner überarbeiteten Version wird diese Information in einer Liste vermerkt und ist nicht mehr Teil des Datagramms. Damit kann ich Aussagen über die Laufzeit von Ping-Paketen mit weniger als 16 Byte Nutzdaten machen, was das ping auf meinem Linux-System (64-Bit) beispielsweise nicht kann. Weiterhin wurde in der alten Version das Senden der Datagramme im Kontext eines SIGALRM-Handlers erledigt, was in der neuen Version durch eine Sendesteuerung mit select(2) im Hauptkontext erledigt wird. (Die Idee, im Signal-Handler Datagramme zu senden, hatte ich damals wohl aus dem Beispiel von Richard Stevens; trotzdem halte ich es für unschön.)

Die Ausgabe ähnelt sehr dem ping, das ich auf meinem Linux-System vorgefunden habe:

$ ./ping -c 4 www.zotteljedi.de
PING www.zotteljedi.de (82.165.104.242) 56(84) bytes of data.
64 bytes from kundenserver.de (82.165.104.242): icmp_seq=1 ttl=57 time=24.3 ms
64 bytes from kundenserver.de (82.165.104.242): icmp_seq=2 ttl=57 time=24.1 ms
64 bytes from kundenserver.de (82.165.104.242): icmp_seq=3 ttl=57 time=24.2 ms
64 bytes from kundenserver.de (82.165.104.242): icmp_seq=4 ttl=57 time=24.5 ms

--- www.zotteljedi.de ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max = 24.136/24.278/24.471 ms

Die möglichen Optionen sind hingegen etwas magerer:

Usage: ping [-n] [-c count] [-i interval] [-s packetsize]
            [-W timeout] destination

Der Quellcode compiliert unter Linux (getestet mit Debian und Ubuntu) und FreeBSD (getestet mit FreeBSD 8.0). Das Programm muß entweder als root gestartet werden, oder root gehören und mit dem SUID-Bit versehen worden sein. Diese root-Rechte werden direkt nach dem Anlegen des Raw Sockets abgelegt (effektive User-ID wird auf reale User-ID gesetzt).

Downloads

Version Datum Änderungen Datei Beschreibung
2.1 2010-05-30 Kleine Anpassungen an NetBSD ping-2.1.tar.gz Quellcode
2.0 2010-05-23 Neuimplementierung mit besserer Sendesteuerung, Statusführung und weiteren Optionen ping-2.0.tar.gz Quellcode
1.1 2002-05-11 Berechnung der Checksumme korrigiert ping-1.1.tar.gz Quellcode
1.0 2000-??-?? Ursprüngliche Implementierung ping-1.0.tar.gz Quellcode