Connected: An Internet Encyclopedia
TraceRoute

Up: Connected: An Internet Encyclopedia
Up: Topics
Up: Software
Up: Testing
Prev: TCPdump(1)

TraceRoute

TraceRoute

``Traceroute'' is a network debugging utility that attempts to trace the path a packet takes through the network - its route. A key word here is ``attempts'' - by no means does traceroute work in all cases.

If you've been paying attention, you already know that the only facilities TCP/IP provide for tracing packet routes are IP packet options (record route and its variants) that are poorly specified, rarely implemented in a useful way, and often disabled for security reasons. Traceroute does not depend on any of these facilities. Traceroute, to put it simply, is a hack.

How Traceroute Works

Traceroute transmits packets with small TTL values. Recall that the TTL (Time To Live) is an IP header field that is designed to prevent packets from running in loops. Every router that handles a packet subtracts one from the packet's TTL. If the TTL reaches zero, the packet has expired and is discarded. Traceroute depends on the common router practice of sending an ICMP Time Exceeded message, documented in RFC 792, back to the sender when this occurs. By using small TTL values which quickly expire, traceroute causes routers along a packet's normal delivery path to generate these ICMP messages which identify the router. A TTL value of one should produce a message from the first router; a TTL value of two generates a message from the second; etc.

                                                                       
      +--------+                                          +--------+   
      | SENDER |                                          | TARGET |   
      +--------+                                          +--------+   
          |                                                   ^|     
       [============( Router )=====( Router )=====( Router )==|====]
                   ^              ^              ^            |  
                   | TTL=1        | TTL=2        | TTL=3      | TTL=4  
  Traceroute       |              |              |            |        
  shows these -----+--------------+--------------+------------/       
  IP addresses                                                         
                                                                       

In a typical traceroute session, a group of packets with TTL=1 are sent. A single router should respond, using the IP address of the interface it transmits the ICMP Timeout messages on, which should be the same as the interface it received the original packets on. The user is told this IP address, and DNS is used to convert this into a symbolic domain address. Also, round trip times are reported for each packet in the group. Traceroute reports any additional ICMP messages (such as destination unreachables) using a rather cryptic syntax - !N means network unreachable, !H means host unreachable, etc. Once this first group of packets has been processed (this can take 10 seconds or no time at all), the second group (TTL=2) begins transmitting, and the whole process repeats.

Problems you might encounter

Since TCP/IP was not designed to support traceroute, several kinds of problems might arise.

Changing paths
Always remember - you are not tracing the path of one packet, but of many. Hopefully, all those packets will follow the same route, but this is by no means assured. What if a link fails during the traceroute? Your packets may be rerouted, and traceroute's output becomes a confused combination of two separate routes.

No sending addresses
You only see one IP address from each router - the address closest to you. To put it another way, traceroute can't tell you which interfaces routers are sending the packets on. It only shows the interfaces packets are being received on. The sending interfaces can often be deduced by matching each router with the next one in line - typically only one interface could be used between them.

Routing problems
TCP/IP's sinister and ubiquitous routing problems may cause the router not to have a route back to the sender, or to have a route through some interface other than the one it received the packet on. In these cases, you will either receive no reply at all (no route), or a reply showing an IP address that never handled the original packet (it was handled by some other interface on the same router). In short, don't completely trust traceroute.

Buggy TCP/IP implementations
Traceroute depends on a rather obscure feature that often doesn't work correctly. Some of the problems people have found: code that fails to decrement TTL, code that incorrectly forwards packets with zero TTL, code that does not generate ICMP Timeouts, and code that sends ICMPs with the same TTL as the original packet. This last problem, of course, results in our ICMP Timeouts being sent with zero TTL - guaranteed not to make it back to us.

Traceroute options

Here's a list of common traceroute options:

-m max-ttl
At some TTL value, traceroute expects to get a reply from the target host. Of course, if the host is unreachable for some reason, this may never happen, so max-ttl (default 30) sets a limit on how long traceroute keeps trying. If the target host is farther than 30 hops away, you'll need to increase this value.

-n
Numerical output only. Use this if you're having nameserver problems and traceroute hangs trying to do inverse DNS lookups.

-p port
Base UDP port. The packets traceroute sends are UDP packets targeted at strange port numbers that nothing will be listening on (we hope). The target host should therefore ignore the packets after generating port unreachable messages. Port is the UDP port number that traceroute uses on its first packet, and increments by one for each subsequent packet. My traceroute uses 33434 (yours probably does too). Change this if a program on the target host might be using ports in roughly the 33434-33534 range.

-q queries
How many packets should be sent for each TTL value. The default is 3, which is fine for finding out the route. If you're more interested in seeing RTT values from each hop, I'd suggest increasing this number to 10.

-w wait
Wait is the number of seconds packets have to generate replies before traceroute assumes they never will and moves on. The default is 3. Increase this if pings to the target host show round trip times longer than this.

Sample Traceroute Session

All of the sites along this path can be converted to symbolic names using inverse DNS lookups. Although the details don't all make sense, we can get the general picture. We start on our local net and quickly move to SprintLink. At San Francisco, we switch to MCI for the transcontinental jump to Washington, where we move to SURA, the Southeastern University Research Association, which provides service to the University of Maryland. The wild fluctuations in round trip time are interesting (compare hop 2 with hop 8). Why should an 8-hop trip be faster than a 2-hop trip? Remember that every time measurement corresponds to a different packet. The fluctuations are probably the result of changing network load.

access$ traceroute terp.umd.edu
traceroute to terp.umd.edu (128.8.10.90), 30 hops max, 40 byte packets
 1  cisco (199.2.50.1)
      3.08 ms  2.391 ms  2.653 ms
 2  sl-stk-3-S17-128k.sprintlink.net (144.228.202.1)
      232.955 ms  195.828 ms  309.079 ms
 3  sl-stk-5-F0/0.sprintlink.net (144.228.40.5)
      187.623 ms  24.72 ms  24.545 ms
 4  icm-fix-w-H2/0-T3.icp.net (144.228.10.22)
      28.927 ms  27.511 ms  34.684 ms
 5  fix-west-cpe.SanFrancisco.mci.net (192.203.230.18)
      124.641 ms  225.516 ms  192.667 ms
 6  border3-hssi2-0.SanFrancisco.mci.net (204.70.34.9)
      127.727 ms  29.322 ms  30.108 ms
 7  core-fddi-0.SanFrancisco.mci.net (204.70.2.161)
      227.059 ms  112.441 ms  29.868 ms
 8  core-hssi-2.Denver.mci.net (204.70.1.37)
      52.881 ms  53.632 ms  53.18 ms
 9  core-hssi-3.Washington.mci.net (204.70.1.13)
      93.393 ms  120.491 ms  92.691 ms
10  border1-fddi0-0.Washington.mci.net (204.70.2.2)
      242.042 ms  94.312 ms  265.366 ms
11  suranet-cpe.Washington.mci.net (204.70.56.6)
      193.482 ms  224.183 ms  93.427 ms
12  wtn8-wtn-cf.sura.net (128.167.7.8)
      105.636 ms  92.919 ms  93.663 ms
13  sura9-wtn8-c3.sura.net (128.167.212.1)
      92.88 ms  92.708 ms  98.033 ms
14  sura2-sura-ce.sura.net (128.167.1.2)
      105.182 ms  115.759 ms  130.195 ms
15  umd-sura2-c1.sura.net (192.221.61.2)
      132.248 ms  145.699 ms  182.908 ms
16  csc1hub-gw.umd.edu (128.8.1.224)
      168.827 ms  192.669 ms  191.198 ms
17  terp.umd.edu (128.8.10.90)
      118.98 ms  156.011 ms  160.125 ms
access$


Connected: An Internet Encyclopedia
TraceRoute