Meine Implementierung von traceroute

Das Programm traceroute hat mich schon immer fasziniert. Technisch gesehen ist es simpel: es sendet UDP-Datagramme mit steigenden TTL-Werten raus, und wertet die eintreffenden ICMP-Datagramme aus. Der TTL-Wert gibt an, wie viele Hops das Datagramm noch zurücklegen kann, bis es verworfen wird. Der Host, der das Datagramm wegen abgelaufener TTL verwirft, sendet eine ICMP-Meldung an den Sender zurück. Was so einfach klingt, erzeugt in der Praxis faszinierende Ausgaben:

traceroute to www.freebsd.org (69.147.83.33), 30 hops max, 28 byte packets
 1 192.168.0.1 (192.168.0.1)  1 ms
 2 217.0.119.219 (217.0.119.219)  19 ms
 3 217.0.90.194 (217.0.90.194)  22 ms
 4 f-ea5-i.F.DE.NET.DTAG.DE (62.154.16.161)  19 ms
 5 te-4-4.car2.Frankfurt1.Level3.net (4.68.110.253)  23 ms
 6 vlan69.csw1.Frankfurt1.Level3.net (4.68.23.62)  24 ms
 7 ae-62-62.ebr2.Frankfurt1.Level3.net (4.69.140.17)  23 ms
 8 ae-44-44.ebr2.Washington1.Level3.net (4.69.137.62)  111 ms
 9 ae-92-92.csw4.Washington1.Level3.net (4.69.134.158)  113 ms
 10 ae-94-94.ebr4.Washington1.Level3.net (4.69.134.189)  117 ms
 11 ae-3-3.ebr1.NewYork1.Level3.net (4.69.132.94)  114 ms
 12 ae-91-91.csw4.NewYork1.Level3.net (4.69.134.78)  126 ms
 13 ae-94-94.ebr4.NewYork1.Level3.net (4.69.134.125)  116 ms
 14 ae-2-2.ebr4.SanJose1.Level3.net (4.69.135.185)  187 ms
 15 ae-64-64.csw1.SanJose1.Level3.net (4.69.134.242)  187 ms
 16 ae-13-69.car3.SanJose1.Level3.net (4.68.18.5)  180 ms
 17 4.71.112.14 (4.71.112.14)  219 ms
 18 ae-0-d161.msr1.sp1.yahoo.com (216.115.107.59)  180 ms
 19 gi-1-43.bas-b1.sp1.yahoo.com (209.131.32.29)  180 ms
 20 www.freebsd.org (69.147.83.33)  180 ms

Man kann förmlich sehen, welchen Weg die Datagramme nehmen. Es gibt sogar Implementierungen, die zu den einzelnen Hops geographische Daten ermitteln, und diese darstellen (Xtraceroute). Meine Implementierung beschränkt sich auf das Ausgeben der einzelnen Hops in Textform.

Das Programm verwendet einen gewöhnlichen UDP-Socket und setzt die TTL über die Socket-Option IP_TTL. Um die ICMP-Antworten zu empfangen, wird ein Raw Socket für ICMP eingesetzt. Aus diesem Grund ist es auch notwendig, das Programm mit root-Rechten zu starten. Es ist erstaunlich simpel und kurz, weshalb ich auch bisher widerstehen konnte, es wie die meisten anderen Programme einer Überarbeitung zu unterziehen. Allerdings sehe ich ein potenzielles Problem in der Genauigkeit der Timeouts, wenn zwischendrin andere ICMP-Pakete empfangen werden.

Downloads

Version Datum Änderungen Datei Beschreibung
1.0 2003-08-31 Quellcode reorganisiert, Lizenz von GPL auf BSD geändert traceroute-1.0.tar.gz Quellcode
0.8 2002-05-05 Ursprüngliche Implementierung traceroute-0.8.tar.gz Quellcode