traceroute

一、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: 使用ICMP TTL-expired(type 11), ICMP port unreachable(type 3, code 3),UDP port >30000.
二、实例

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 从33435开始每送个probe依此递增,直至33435+29,同时TTL从1开始依此递增,直至1+29=30(最多送30个probe)。如上图前三个UDP包其中的TTL均是1。

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,为保证其它工作的正常进行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值