一、Traceroute
Traceroute最简单的基本用法是:traceroute hostname
TraceRoute程序的实现主要涉及IP头部生存时间(time to live, TTL)字段的使用。
设置TTL字段的目的是为了防止数据报由于选路错误或其他软硬件原因从而导致在网络中无休止的流动,TTL字段指定了数据报的生存时间。TTL的初始值由源主机设置,当一份数据报经过路由器时,处理该数据报的路由器都需要把TTL值减去数据报在路由器中停留的秒数。但事实上大多数路由器只是简单地将TTL值减1,因此TTL字段最终被实现为一个跳站计数器。当TTL字段的值被减为0时,路由器就不会转发该数据报,而是将其丢弃,并产生一份ICMP超时差错报文发往源主机以通知错误的发生。TraceRoute程序的关键就在于返回的这份ICMP超时差错报文的源地址就是途经路由器的IP地址。由此,通过依次递增TTL字段的值,就可以得到一份数据报在其传输路径上所经过的路由信息。
Traceroute程序的设计是利用ICMP及IP路由过程中对数据包TTL(Time to Live ,存活时间)的处理。首先,traceroute送出一个TTL是1的IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,一般发送的是小UDP数据包,首3个UDP包的TTl值为1,之后三个为2,如此类推,直至递增到30,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。
此时,TTL变为0了,所以该路由器会将此datagram丢掉,并为每个UDP包送回一个「ICMP time-to-live exceeded(type:11,code:0)」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的IP datagram,发现第2 个路由器......, traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time-to-live exceeded消息,因为它已是目的地了,它会返回一个[ICMP destination unreachable (type:3,code:3)」 。
那么traceroute如何得知目的地到达了呢?
Traceroute在送出UDP datagrams到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。
Traceroute提取发 ICMP TTL到期消息设备的IP地址并作域名解析。每次 ,Traceroute都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间。
Traceroute 有一个固定的时间等待响应(ICMP TTL到期消息)。如果这个时间过了,它将打印出一系列的*号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP TTL到期消息的响应。然后,Traceroute给TTL记数器加1,继续进行。
traceroute 有使用两种:使用ICMP的和使用UDP的。Microsoft使用ICMP,所以win95上发出的traceRT应使用的是ICMP,其它包括unix和cisco router都使用UDP.
UDP traceroute:
二、实例
root:~# traceroute www.google.com
traceroute to www.google.com (216.58.197.100), 30 hops max, 40 byte packets
1 bogon (10.0.20.25) 0 ms 0 ms 0 ms
2 100.99.0.1 (100.99.0.1) 1 ms 1 ms 1 ms
3 10.139.111.254 (10.139.111.254) 4 ms 1 ms 1 ms
4 bogon (192.168.101.2) 1 ms 1 ms 1 ms
5 125.35.62.65 (125.35.62.65) 106 ms 102 ms 107 ms
6 61.49.247.86 (61.49.247.86) 111 ms 61.49.247.82 (61.49.247.82) 104 ms 61.49.247.86 (61.49.247.86) 98 ms
7 61.49.247.85 (61.49.247.85) 93 ms 104 ms 106 ms
8 202.96.12.85 (202.96.12.85) 107 ms 82 ms 96 ms
9 218.105.8.49 (218.105.8.49) 93 ms 82 ms 88 ms
10 218.105.5.74 (218.105.5.74) 151 ms 132 ms 132 ms
11 219.158.32.181 (219.158.32.181) 140 ms 143 ms 142 ms
12 219.158.10.97 (219.158.10.97) 139 ms 130 ms 127 ms
13 219.158.23.2 (219.158.23.2) 205 ms 219.158.23.6 (219.158.23.6) 214 ms 217 ms
14 219.158.96.198 (219.158.96.198) 175 ms 197 ms 219.158.96.206 (219.158.96.206) 152 ms
15 219.158.29.50 (219.158.29.50) 214 ms 196 ms 221 ms
16 72.14.215.130 (72.14.215.130) 142 ms 158 ms 166 ms
17 209.85.248.62 (209.85.248.62) 298 ms 290 ms 287 ms
18 216.239.58.121 (216.239.58.121) 293 ms 285 ms 291 ms
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
root:~#
1、循环发送3个UDP(每3个UDP的TTL从1到30)
source发出UDP packet, source port使用随机的任何大于30000的高段port,source port 是一样的额, destination port
2、中间router送货ICMP Time-to-live type
中间的router送回 ICMP Time-to-live type:11,code=0,使得source得知了中间的每一个router,如下:
3、UDP包到达目的主机
最后的destination送回Destination unreachable (因为任何主机上都没有应用使用UDP port >32768这样的高段port)。
所以中间某处封掉UDP port>30000会导致traceroute不工作;封掉TTL超时会使source看不到中间的router(有的router根本不支持回送TTL超时);封掉type3 code3可能看不到destination.另外需要知道的是,由于回送TTL-expired的信息需要CPU生成一个packet,必须打断 CPU,为保证其它工作的正常进行。