Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357009
  • 博文数量: 71
  • 博客积分: 1656
  • 博客等级: 上尉
  • 技术积分: 931
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-17 10:42
文章分类

全部博文(71)

文章存档

2012年(6)

2011年(9)

2010年(4)

2009年(9)

2008年(43)

我的朋友

分类: 系统运维

2008-11-05 13:22:43

traceroute 有使用两种:使用ICMP的和使用UDP的。Microsoft使用ICMP,所以win95上发出的traceRT应使用的是ICMP,但我没有用 sniffer查过;其它包括unix和cisco router都使用UDP.


ICMP traceroute:
===========
使用ICMP Echo Request, Echo Reply and TTL-expired.

源 发出 ICMP Equest,第一个request的TTL为1,第二个request的TTL为2,以后依此递增直至第30个;中间的router送回ICMP TTL-expired ( ICMP type 11) 通知source,(packet同时因TTL超时而被drop),由此source知晓一路上经过的每一个router;最后的destination 送回ICMP Echo Reply。

所以中间任何一个router上如果封了ICMP Echo Request, traceroute就不能工作;如果封了type 11 (TTL-expired), 中间的router全看不到,但能看到packet 到达了最后的destination;如果封了ICMP Echo Reply,中间的全能看到,最后的destination看不到。

UDP traceroute:
==========
使用ICMP TTL-expired(type 11), ICMP port unreachable(type 3, code 3), UDP port >32768.

source 发出UDP packet, source port使用随机的任何大于32768的高段port#, destination port # 从33434开始每送个probe依此递增,直至33434+29,(cisco router上使用extended-traceroute命令可以修改这个起始的33434 port #), 同时TTL从1开始依此递增,直至1+29=30(最多送30个probe)。中间的router送回 ICMP TTL-expired,使得source得知了中间的每一个router,最后的destination送回TTL-expired 和ICMP port unreachable (因为任何主机上都没有应用使用UDP port# >32768这样的高段port#)。

所以中间某处封掉UDP port>32768回导致traceroute不工作;封掉TTL超时会使source看不到中间的router(有的router根本不支持回送TTL超时);封掉type3, code3可能看不到destination.

另 外需要知道的是,由于回送TTL-expired的信息需要CPU生成一个packet,必须打断 CPU,为保证其它工作的正常进行,cisco router每隔一秒才处理traceroute,所以在source 上你可能看到中间一路 * * *,但却看得到最后的destination. 这时你应知道这是中间的router CPU太忙或者中间路由器不回送TTL-expired包的原因,不必大惊小怪的。

上次看ping 命令的时候,有提到过,当ping -R的时候,可以将前9个途经的路由器都记录在内...但对于多过9个的就无法记录了,这时候就需要用到traceroute,而它实现的原理是怎么样的呢???


首 先,发送一份ttl为1的数据报文给目的主机,当到第一个路由器的时候,路由器会将它的ttl值减1下去,并且丢掉该包,然后发一个表示超时的包回来.那 样,我们就获得了经过的第一个路由器的地址和时间(往返时间/2得到单程时间);然后,发一个ttl为2的包,那么就会停在途中的第2个路由器那里,同样 也得到第2个路由器的时间...如此一直到到达目的地,那么,怎么知道到了目的地呢? traceroute是发的一个udp包,端口在30000以上,一般来说没有程序在用,所以会由对方返回一个"端口不可达"的icmp消息回来.

也就是说,traceroute如果收到的包是icmp的超时包,它就认为这是中间一个路由器,如果收到端口不可达的消息,则认为是达到了目的,由目的主机发出的.


天缘调试路由的时候,曾经用traceroute跟踪失败的消息...就是到了某个路由器就没有回应了...这说明什么呢? 以前不明白,这里知道了,原来是那个路由器的管理员将该路由器设置为禁止发送icmp消息(汗,一般都是禁止接受icmp,或者禁止发送-8 的消息;这个网管居然是禁止所有icmp...看来真的是有够安全...)

阅读(1521) | 评论(0) | 转发(0) |
0

上一篇:CD-KEY收集

下一篇:linux内核编译步骤

给主人留下些什么吧!~~