歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> Traceroute的實現與原理

Traceroute的實現與原理

日期:2017/3/6 15:30:14   编辑:關於Unix
traceroute 有使用兩種:使用ICMP的和使用UDP的。Microsoft使用ICMP,所以win95上發出的traceRT應使用的是ICMP,但我沒有用 sniffer查過;其它包括 unix 和cisco router都使用UDP. traceroute 有使用兩種:使用ICMP的和使用UDP的。Microsoft使用ICMP,所以wi traceroute 有使用兩種:使用ICMP的和使用UDP的。Microsoft使用ICMP,所以win95上發出的traceRT應使用的是ICMP,但我沒有用 sniffer查過;其它包括unix和cisco router都使用UDP.

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,而它實現的原理是怎麼樣的呢???294870079?admin@喜歡稀飯版權所有?294870079
1901056138?admin@喜歡稀飯版權所有?1901056138
首先,發送一份ttl為1的數據報文給目的主機,當到第一個路由器的時候,路由器會將它的ttl值減1下去,並且丟掉該包,然後發一個表示超時的包回來.那樣,我們就獲得了經過的第一個路由器的地址和時間(往返時間/2得到單程時間);然後,發一個ttl為2的包,那麼就會停在途中的第2個路由器那裡,同樣也得到第2個路由器的時間...如此一直到到達目的地,那麼,怎麼知道到了目的地呢? traceroute是發的一個udp包,端口在30000以上,一般來說沒有程序在用,所以會由對方返回一個"端口不可達"的icmp消息回來.64644235?admin@喜歡稀飯版權所有?64644235
52356382?admin@喜歡稀飯版權所有?52356382
也就是說,traceroute如果收到的包是icmp的超時包,它就認為這是中間一個路由器,如果收到端口不可達的消息,則認為是達到了目的,由目的主機發出的.253899538?admin@喜歡稀飯版權所有?253899538
1662871523?admin@喜歡稀飯版權所有?1662871523
天緣調試路由的時候,曾經用traceroute跟蹤失敗的消息...就是到了某個路由器就沒有回應了...這說明什麼呢? 以前不明白,這裡知道了,原來是那個路由器的管理員將該路由器設置為禁止發送icmp消息(汗,一般都是禁止接受icmp,或者禁止發送-8 的消息;這個網管居然是禁止所有icmp...看來真的是有夠安全...)1181889106?admin@喜歡稀飯版權所有?1181889106
1122396734?admin@喜歡稀飯版權所有?1122396734
越來越多的攻擊利用,令原來的一些方便工具逐漸下崗了...比如ping命令...哎,正當的技術不被惡意利用,真的是好難~~!

Copyright © Linux教程網 All Rights Reserved