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