Traceroute是我们经常用到的一个路由跟踪命令。
它的实现原理如下:
它发送一份 TTL字段为1的IP数据报给目的主机。处理这份数据报的第一个路由器将 T T L值减 1,丢弃该数据报,并发回一份超时I C M P报文。这样就得到了该路径中的第一个路由器的地址。然后 Tr a c e r o u t e程序发送一份T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到 T T L值为1的I P数据报,也不会丢弃该数据报并产生一份超时 I C M P报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经到达目的主机了呢?
Traceroute程序发送一份 U D P数据报给目的主机,但它选择一个不可能的值作为 U D P端口号(大于 30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的 U D P模块产生一份“端口不可达”错误(见 6 . 5节)的 I C M P报文。这样, Tr a c e r o u t e程序所要做的就是区分接收到的 I C M P报文是超时还是端口不可达,以判断什么时候结束。
我们使用ping命令的R选项也可以打印出源主机到目的主机所经过的路由。但是它和traceroute有些不同,至于区别在哪里?大家可以思考一下
----------------------------------------------------------------------------------------------------------------------------------------------------
TraceRoute的工作原理
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), I CMP 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包的原因,不必大惊小怪的。:-)
traceroute to 10.61.0.154 (10.61.0.154), 30 hops max, 38 byte packets
1 10.61.37.1 (10.61.37.1) 0.774 ms 0.707 ms 0.812 ms
2 10.61.0.154 (10.61.0.154) 0.567 ms 0.574 ms 0.811 ms
11:08:39.936585 10.61.37.1 > 10.61.37.18: icmp: time exceeded in-transit [tos 0xc0]
11:08:39.937294 10.61.37.18.32771 > 10.61.0.154.33436: udp 10 [ttl 1]
11:08:39.937738 10.61.37.1 > 10.61.37.18: icmp: time exceeded in-transit [tos 0xc0]
11:08:39.938010 10.61.37.18.32771 > 10.61.0.154.33437: udp 10 [ttl 1]
11:08:39.938572 10.61.37.1 > 10.61.37.18: icmp: time exceeded in-transit [tos 0xc0]
11:08:39.938836 10.61.37.18.32771 > 10.61.0.154.33438: udp 10
11:08:39.939151 10.61.0.154 > 10.61.37.18: icmp: 10.61.0.154 udp port 33438 unreachable
11:08:39.939521 10.61.37.18.32771 > 10.61.0.154.33439: udp 10
11:08:39.939841 10.61.0.154 > 10.61.37.18: icmp: 10.61.0.154 udp port 33439 unreachable
11:08:39.940102 10.61.37.18.32771 > 10.61.0.154.33440: udp 10
11:08:39.940661 10.61.0.154 > 10.61.37.18: icmp: 10.61.0.154 udp port 33440 unreachable
---------------------------------------------------------------------------------------------------------------------------------------------------