TraceRoute的工作原理
1.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), 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包的原因,不必大驚小怪的。:-)
Linux下traceroute使用心得
問題:在命令行下輸入:
traceroute www.google.com
屏幕打印是這樣的:
traceroute to www.google.com (66.249.89.104), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
沒有得到任何中間路由器的信息。
分析:
traceroute的基本原理就是發出TTL字段為1-n的ip包,然后等待路由器的ICMP超時回復,進而記錄
下來經過的路由器。通過man traceroute 可以看到,traceroute可以在ip包中放三種數據:
1) 使用UDP包(默認選項是-U)
2)使用TCP包 選項是-T
3)使用ICMP包 選項是-I
而且每個包traceroute都發3次。
分別用-T,-I選項試試。
發現TCP包時候也不行,但是-I選項是有效果的:
1 10.10.20.1 (10.10.20.1) 3.611 ms * *
2 * * *
3 10.10.10.1 (10.10.10.1) 3.590 ms * *
4 * * *
5 * * *
6 * * 61.130.125.25 (61.130.125.25) 10.914 ms
但貌似不是全部的中間路由ip,有些包丟失了。
進一步查看traceroute的選項,有一個-z項,基本意思是設置探測包的發送間隔,默認是0,就是連續發送。設置這個的目的
是因為有些路由器設置了icmp rate limit. 繼續研究為什么路由器要設置icmp的發送速率。
google之:原來是為了應付DOS攻擊,進而限制端口發出的icmp的速率。
既然清楚了,那就嘗試下:
sudo traceroute -I www.google.com -z 0.005 -q 1
traceroute to www.google.com (66.249.89.104), 30 hops max, 60 byte packets
1 10.10.20.1 (10.10.20.1) 1.914 ms
2 10.10.20.1 (10.10.20.1) 2.109 ms
3 10.10.10.1 (10.10.10.1) 1.081 ms
4 115.238.62.113 (115.238.62.113) 2.468 ms
5 220.191.158.213 (220.191.158.213) 2.177 ms
6 61.130.125.25 (61.130.125.25) 2.016 ms
7 220.191.158.241 (220.191.158.241) 2.419 ms
8 202.97.55.5 (202.97.55.5) 4.757 ms
9 202.97.33.14 (202.97.33.14) 5.293 ms
10 202.97.33.2 (202.97.33.2) 5.161 ms
11 202.97.33.5 (202.97.33.5) 4.972 ms
12 202.97.5.138 (202.97.5.138) 41.524 ms
13 209.85.255.80 (209.85.255.80) 53.241 ms
14 209.85.249.195 (209.85.249.195) 68.928 ms
15 72.14.236.126 (72.14.236.126) 52.108 ms
16 66.249.89.104 (66.249.89.104) 48.105 ms
果真可以了。
如果想看具體traceroute發了什么包,路由器返回了什么包,可以用wireshark抓包看看.