通過(guò)向目標(biāo)發(fā)送不同 IP 生存時(shí)間 (TTL) 值的“Internet 控制消息協(xié)議 (ICMP)”回應(yīng)數(shù)據(jù)包,Tracert 診斷程序確定到目標(biāo)所采取的路由。要求路徑上的每個(gè)路由器在轉(zhuǎn)發(fā)數(shù)據(jù)包之前至少將數(shù)據(jù)包上的 TTL 遞減 1。數(shù)據(jù)包上的 TTL 減為 0 時(shí),路由器應(yīng)該將“ICMP 已超時(shí)”的消息發(fā)回源系統(tǒng)。
Tracert 先發(fā)送 TTL 為 1 的回應(yīng)數(shù)據(jù)包,并在隨后的每次發(fā)送過(guò)程將 TTL 遞增 1,直到目標(biāo)響應(yīng)或 TTL 達(dá)到最大值,從而確定路由。通過(guò)檢查中間路由器發(fā)回的“ICMP 已超時(shí)”的消息確定路由。某些路由器不經(jīng)詢問(wèn)直接丟棄 TTL 過(guò)期的數(shù)據(jù)包,這在 Tracert 實(shí)用程序中看不到。
Tracert 命令按順序打印出返回“ICMP 已超時(shí)”消息的路徑中的近端路由器接口列表。如果使用 -d 選項(xiàng),則 Tracert 實(shí)用程序不在每個(gè) IP 地址上查詢 DNS。
在下例中,數(shù)據(jù)包必須通過(guò)兩個(gè)路由器(10.0.0.1 和 192.168.0.1)才能到達(dá)主機(jī) 172.16.0.99。主機(jī)的默認(rèn)網(wǎng)關(guān)是 10.0.0.1,192.168.0.0 網(wǎng)絡(luò)上的路由器的 IP 地址是 192.168.0.1。
C:>tracert 172.16.0.99 -d
Tracing route to 172.16.0.99 over a maximum of 30 hops
1 2s 3s 2s 10,0.0,1
2 75 ms 83 ms 88 ms 192.168.0.1
3 73 ms 79 ms 93 ms 172.16.0.99
Trace complete.
可以使用 tracert 命令確定數(shù)據(jù)包在網(wǎng)絡(luò)上的停止位置。下例中,默認(rèn)網(wǎng)關(guān)確定 192.168.10.99 主機(jī)沒(méi)有有效路徑。這可能是路由器配置的問(wèn)題,或者是 192.168.10.0 網(wǎng)絡(luò)不存在(錯(cuò)誤的 IP 地址)。
C:>tracert 192.168.10.99
Tracing route to 192.168.10.99 over a maximum of 30 hops
1 10.0.0.1 reports:Destination net unreachable.
Trace complete.
Tracert 實(shí)用程序?qū)τ诮鉀Q大網(wǎng)絡(luò)問(wèn)題非常有用,此時(shí)可以采取幾條路徑到達(dá)同一個(gè)點(diǎn)。
Tracert 命令行選項(xiàng)
Tracert 命令支持多種選項(xiàng),如下表所示。
tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name
選項(xiàng)
描述
-d
指定不將 IP 地址解析到主機(jī)名稱。
-h maximum_hops
指定躍點(diǎn)數(shù)以跟蹤到稱為 target_name 的主機(jī)的路由。
-j host-list
指定 Tracert 實(shí)用程序數(shù)據(jù)包所采用路徑中的路由器接口列表。
-w timeout
等待 timeout 為每次回復(fù)所指定的毫秒數(shù)。
target_name
目標(biāo)主機(jī)的名稱或 IP 地址。
當(dāng)我們不能通過(guò)網(wǎng)絡(luò)訪問(wèn)目的設(shè)備時(shí),網(wǎng)絡(luò)管理員就需要判斷是哪里出了問(wèn)題。問(wèn)題不僅僅會(huì)出現(xiàn)在最終目的設(shè)備,也可能出現(xiàn)在轉(zhuǎn)發(fā)數(shù)據(jù)包的中間路由器。
有3種方式用來(lái)探測(cè)一個(gè)數(shù)據(jù)包從源點(diǎn)到目的地經(jīng)過(guò)了哪些中轉(zhuǎn)路由器,這3種方式分別是:基于記錄路由選項(xiàng)的路由探測(cè),基于UDP協(xié)議的路由探測(cè),基于ICMP Echo Request的路由探測(cè)。三種方式都可以用來(lái)探測(cè)一個(gè)數(shù)據(jù)包到達(dá)目的設(shè)備經(jīng)過(guò)了哪些中間路由器,但實(shí)現(xiàn)的過(guò)程卻截然不同。
注意:理解這些探測(cè)方法的關(guān)鍵要領(lǐng)是熟悉IP數(shù)據(jù)報(bào)和ICMP數(shù)據(jù)報(bào)的格式。
(記錄路由選項(xiàng))的路由探測(cè)
這種方式是我們最容易理解的探測(cè)路由方式。比如,我想知道一封從上海發(fā)出,目的地是北京的信,中間經(jīng)過(guò)了多少個(gè)郵局轉(zhuǎn)發(fā)。這個(gè)過(guò)程很簡(jiǎn)單,只要中間郵局在轉(zhuǎn)發(fā)的信件扣上他們自己的郵戳,這封信到達(dá)目的地北京后,北京再把這封信回郵給我,當(dāng)我收到回信后,只要看信上的郵戳,便知道中間經(jīng)過(guò)哪些郵局。
ping -R(大寫) www.aorb .org命令便可實(shí)現(xiàn)這種記錄中間路由的功能,返回的結(jié)果是中間路由器的IP地址。
1) ping命令發(fā)出的是類型為8的ICMP數(shù)據(jù)報(bào),當(dāng)使用ping -R時(shí),這個(gè)類型為8的ICMP數(shù)據(jù)報(bào)被裝在一個(gè)IP數(shù)據(jù)報(bào)里,IP數(shù)據(jù)報(bào)的Options(選項(xiàng))字段預(yù)留出給中間路由器扣戳的地方,這個(gè)地方不太大,只能容納9臺(tái)中轉(zhuǎn)路由器的IP地址。
2) 當(dāng)這個(gè)數(shù)據(jù)報(bào)被發(fā)送端送出后,每經(jīng)過(guò)一個(gè)中轉(zhuǎn)路由器,中轉(zhuǎn)路由器的IP軟件便會(huì)在此IP數(shù)據(jù)報(bào)的選項(xiàng)字段中加入一條這個(gè)中轉(zhuǎn)路由器的IP地址。
3) 當(dāng)這個(gè)數(shù)據(jù)包到達(dá)目的地時(shí)(如,www.aorb. org),目的設(shè)備便會(huì)生成一條類型為0的ICMP數(shù)據(jù)報(bào),這個(gè)ICMP數(shù)據(jù)報(bào)被封裝在一個(gè)新的IP數(shù)據(jù)報(bào)里,新IP數(shù)據(jù)報(bào)的Options字段中拷貝了剛才收到的IP數(shù)據(jù)報(bào)中的Options字段。
4) 當(dāng)這個(gè)新IP數(shù)據(jù)報(bào)回送到源發(fā)送端時(shí),您便會(huì)在屏幕上看見(jiàn)一些中間路由器的IP地址了。
tracert是Windows下常用的命令行工具,UNIX下與之對(duì)應(yīng)的是traceroute。若想知道自己的電腦到www.aorb. org 經(jīng)過(guò)了多少個(gè)路由器,可在命令行下輸入tracert www.aorb. org進(jìn)行探測(cè),返回結(jié)果也許會(huì)與ping -R相同,但它是以另一種方式實(shí)現(xiàn)的。這種方式并沒(méi)有像Record route options探測(cè)技術(shù)中使用IP協(xié)議包的Options字段,而是利用了IP協(xié)議包中的TTL字段。
基本思路是這樣的:www.aorb. org這臺(tái)服務(wù)器即賣茄子(提供HTTP服務(wù)),也賣黃瓜(提供FTP服務(wù)),但不賣土豆(未監(jiān)聽的UDP端口)。有位買家,為了知道一封信到達(dá)蔬菜供應(yīng)商www.aorb. org中間需要經(jīng)過(guò)幾個(gè)郵局(路由器),于是寫信給www.aorb. org詢問(wèn)土豆的價(jià)格。
第一步,買家在信封的TTL位置寫上數(shù)字1,當(dāng)這封信到達(dá)與自己相鄰的第一個(gè)郵局時(shí),郵局的人把TTL值減1,于是TTL為0,郵局章程規(guī)定,把TTL值為0的信丟到垃圾桶里,然后給買家發(fā)一封名曰超時(shí)的信,信上寫了丟信郵局的名字,以告訴買家信被誰(shuí)丟掉了。
第二步,買家在信封的TTL位置寫上數(shù)字2,當(dāng)這封信到達(dá)與自己相鄰的第一個(gè)郵局時(shí),郵局的人把TTL值減1,現(xiàn)在TTL值為1,郵局章程規(guī)定, TTL值不為0的數(shù)據(jù)報(bào)需要繼續(xù)轉(zhuǎn)發(fā)給下一個(gè)郵局,于是這封信又被轉(zhuǎn)發(fā)到了下一個(gè)郵局。當(dāng)下一個(gè)郵局收到這封信時(shí),郵局的人把TTL值減1,于是TTL為 0,郵局章程規(guī)定,把TTL值為0的信丟到垃圾桶里,然后給買家發(fā)一封名曰超時(shí)的信,信上寫了丟信郵局的名字,以告訴買家信被誰(shuí)丟掉了。
通過(guò)第一步,買家知道了第一個(gè)中轉(zhuǎn)路由器。通過(guò)第二步,買家知道了第二個(gè)中轉(zhuǎn)路由器。那么買家只需要不斷的把TTL值加1,便可根據(jù)如上步驟探測(cè)出中間經(jīng)過(guò)了哪些路由器。
第三步,我們假設(shè)中間只經(jīng)過(guò)兩個(gè)郵局信便到達(dá)目的地了。接著第二步,買家選在把TTL值設(shè)置為3,當(dāng)這封信到達(dá)與自己相鄰的第一個(gè)郵局時(shí),郵局的人把TTL值減1,現(xiàn)在TTL值為2,郵局章程規(guī)定,TTL值不為0的數(shù)據(jù)報(bào)需要繼續(xù)轉(zhuǎn)發(fā)給下一個(gè)郵局,于是這封信又被轉(zhuǎn)發(fā)到了下一個(gè)郵局。當(dāng)下一個(gè)郵局收到這封信時(shí),郵局的人把TTL值減1,于是TTL為1,郵局章程規(guī)定,TTL值不為0的數(shù)據(jù)報(bào)需要繼續(xù)轉(zhuǎn)發(fā)給下一個(gè)郵局,于是這封信又被轉(zhuǎn)發(fā)到了下一個(gè)郵局,但下一個(gè)郵局已經(jīng)就是最終目的地www.aorb .org了,盡管www.aorb .org把TTL減1的結(jié)果為0,但卻不會(huì)丟棄它,因?yàn)槟康牡鼐褪?www.aorb. org呀!于是www.aorb .org把這個(gè)IP層郵遞員送來(lái)的信交付給負(fù)責(zé)賣土豆人,但我們開始說(shuō)了,www.aorb .org并不賣土豆,于是就回送一個(gè)名曰終點(diǎn)不可達(dá)(ICMP類型為3,代碼為3)的信給買家。
第四步,當(dāng)買家收到類型為終點(diǎn)不可達(dá)的信時(shí),就不再把那封問(wèn)土豆價(jià)格的信上的TTL加1了,因?yàn)樗呀?jīng)知道了到達(dá)目的地的全部路由。
具體實(shí)現(xiàn)過(guò)程可以用下面兩幅圖來(lái)理解
這種探測(cè)方式與基于UDP協(xié)議的路由探測(cè)的實(shí)現(xiàn)步驟一樣,但發(fā)送端送出的不是一個(gè)UDP數(shù)據(jù)包,而發(fā)送的是一個(gè)ICMP類型為8的Echo Request(回顯請(qǐng)求)數(shù)據(jù)報(bào)文。與基于UDP協(xié)議的路由探測(cè)技術(shù)一樣,每次發(fā)送端都會(huì)把TTL值加1,每個(gè)中轉(zhuǎn)路由器都對(duì)TTL值減1,如果為0,便丟棄后給發(fā)送端發(fā)送一個(gè)超時(shí)報(bào)文,若不為0,則繼續(xù)轉(zhuǎn)發(fā)給下一跳。唯一不同的是,當(dāng)這個(gè)數(shù)據(jù)報(bào)到達(dá)最終目的節(jié)點(diǎn)時(shí),由于發(fā)送端發(fā)送的是Echo Request報(bào)文,所以接收端就會(huì)相應(yīng)一個(gè)ICMP類型為0的數(shù)據(jù)報(bào)文。這樣,當(dāng)發(fā)送端收到ICMP類型為0的數(shù)據(jù)報(bào)文時(shí),就知道了全部路由已經(jīng)查詢完畢,終止繼續(xù)探測(cè)。
其他
pathping
pathping是tracert和ping的混合體。命令行下輸入pathping www.aorb. org,返回兩部分內(nèi)容,第一部分顯示到達(dá)目的地經(jīng)過(guò)了哪些路由,第二部分顯示了路徑中每個(gè)路由器上數(shù)據(jù)包丟失方面的信息。