路由跟蹤

確定數據包停止位置的實用程序

Tracert(跟蹤路由)是路由跟蹤實用程序,用於確定IP數據報訪問目標所採取的路徑。Tracert命令用IP生存時間(TTL)欄位和ICMP錯誤消息來確定從一個主機到網路上其他主機的路由。

工作原理


通過向目標發送信息不同IP生存時間(TTL)值得“Internet控制消息協議(ICMP)”回應數據包,Tracert診斷程序確定到目標所採取的路由。要求路徑上的每個路由器在轉發數據包之前至少將數據包上的TTL遞減1。數據包上的TTL減為0時,路由器應該將“ICMP已超時”地消回了源回了源系統。
Tracert先發送TTL為1的回應數據包,並在隨後的每次發送過程將TTL遞增1,直到目標響應或TTL達到最大值,從而確定路由。通過檢查中間路由器發回的“ICMP已超時”的消息確定路由。某些路由器不經詢問直接丟棄TTL過期的數據包,這在Tracert實用程序中看不到。
Tracert命令按順序列印出返回“ICMP已超時”消息的路徑中的近端路由器介面列表。如果使用-d選項,則Tracert實用程序不在每個IP地址上查詢DNS。

實例


在下例中,數據包必須通過兩個路由器(10.0.0.1和192.168.0.1)才能到達主機172.16.0.99。主機的默認網關是10.0.0.1,192.168.0.0網路上的路由器的IP地址是192.168.0.1。
C:\>tracert172.16.0.99-d
Tracingrouteto172.16.0.99overamaximumof30hops
12s3s2s10,0.0,1
275ms83ms88ms192.168.0.1
373ms79ms93ms172.16.0.99
Tracecomplete.

解決問題


可以使用tracert命令確定數據包在網路上的停止位置。下例中,默認網關確定192.168.10.99主機沒有有效路徑。這可能是路由器配置的問題,或者是192.168.10.0網路不存在(錯誤的IP地址)。
C:\>tracert192.168.10.99
Tracingrouteto192.168.10.99overamaximumof30hops
110.0.0.1reports:Destinationnetunreachable.
Tracecomplete.
Tracert實用程序對於解決大網路問題非常有用,此時可以採取幾條路徑到達同一個點。
Tracert命令行選項
Tracert命令支持多種選項,如下表所示。
tracert[-d][-hmaximum_hops][-jhost-list][-wtimeout]target_name
選項
描述
-d
指定不將IP地址解析到主機名稱。
-hmaximum_hops
指定躍點數以跟蹤到稱為target_name的主機的路由。
-jhost-list
指定Tracert實用程序數據包所採用路徑中的路由器介面列表。
-wtimeout
等待timeout為每次回復所指定的毫秒數。
target_name
目標主機的名稱或IP地址。
當我們不能通過網路訪問目的設備時,網路管理員就需要判斷是哪裡出了問題。問題不僅僅會出現在最終目的設備,也可能出現在轉發數據包的中間路由器。

探測方式


有3種方式用來探測一個數據包從源點到目的地經過了哪些中轉路由器,這3種方式分別是:基於記錄路由選項的路由探測,基於UDP協議的路由探測,基於ICMPEchoRequest的路由探測。三種方式都可以用來探測一個數據包到達目的設備經過了哪些中間路由器,但實現的過程卻截然不同。
注意:理解這些探測方法的關鍵要領是熟悉IP數據報和ICMP數據報的格式。

基於Recordrouteoptions

(記錄路由選項)的路由探測
這種方式是我們最容易理解的探測路由方式。比如,我想知道一封從上海發出,目的地是北京的信,中間經過了多少個郵局轉發。這個過程很簡單,只要中間郵局在轉發的信件扣上他們自己的郵戳,這封信到達目的地北京后,北京再把這封信回郵給我,當我收到回信后,只要看信上的郵戳,便知道中間經過哪些郵局。
ping-R(大寫)www.aorb.org命令便可實現這種記錄中間路由的功能,返回的結果是中間路由器的IP地址。
1)ping命令發出的是類型為8的ICMP數據報,當使用ping-R時,這個類型為8的ICMP數據報被裝在一個IP數據報里,IP數據報的Options(選項)欄位預留出給中間路由器扣戳的地方,這個地方不太大,只能容納9台中轉路由器的IP地址。
2)當這個數據報被發送端送出后,每經過一個中轉路由器,中轉路由器的IP軟體便會在此IP數據報的選項欄位中加入一條這個中轉路由器的IP地址。
3)當這個數據包到達目的地時(如,www.aorb.org),目的設備便會生成一條類型為0的ICMP數據報,這個ICMP數據報被封裝在一個新的IP數據報里,新IP數據報的Options欄位中拷貝了剛才收到的IP數據報中的Options欄位。
4)當這個新IP數據報回送到源發送端時,您便會在屏幕上看見一些中間路由器的IP地址了。

UDP協議

tracert是Windows下常用的命令行工具,UNIX下與之對應的是traceroute。若想知道自己的電腦到www.aorb.org經過了多少個路由器,可在命令行下輸入tracertwww.aorb.org進行探測,返回結果也許會與ping-R相同,但它是以另一種方式實現的。這種方式並沒有像Recordrouteoptions探測技術中使用IP協議包的Options欄位,而是利用了IP協議包中的TTL欄位。
基本思路是這樣的:www.aorb.org這台伺服器即賣茄子(提供HTTP服務),也賣黃瓜(提供FTP服務),但不賣土豆(未監聽的UDP埠)。有位買家,為了知道一封信到達蔬菜供應商www.aorb.org中間需要經過幾個郵局(路由器),於是寫信給www.aorb.org詢問土豆的價格。
第一步,買家在信封的TTL位置寫上數字1,當這封信到達與自己相鄰的第一個郵局時,郵局的人把TTL值減1,於是TTL為0。
第二步,買家在信封的TTL位置寫上數字2,當這封信到達與自己相鄰的第一個郵局時,郵局的人把TTL值減1,現在TTL值為1,郵局章程規定,TTL值不為0的數據報需要繼續轉發給下一個郵局,於是這封信又被轉發到了下一個郵局。當下一個郵局收到這封信時,郵局的人把TTL值減1,於是TTL為0,郵局章程規定,把TTL值為0的信丟到垃圾桶里,然後給買家發一封名曰超時的信,信上寫了丟信郵局的名字,以告訴買家信被誰丟掉了。
通過第一步,買家知道了第一個中轉路由器。通過第二步,買家知道了第二個中轉路由器。那麼買家只需要不斷地把TTL值加1,便可根據如上步驟探測出中間經過了哪些路由器。
第三步,我們假設中間只經過兩個郵局信便到達目的地了。接著第二步,買家選在把TTL值設置為3,當這封信到達與自己相鄰的第一個郵局時,郵局的人把TTL值減1,現在TTL值為2,於是TTL為1,郵局章程規定,TTL值不為0的數據報需要繼續轉發給下一個郵局,於是這封信又被轉發到了下一個郵局,但下一個郵局已經就是最終目的地www.aorb.org了,儘管www.aorb.org把TTL減1的結果為0,但卻不會丟棄它,因為目的地就是www.aorb.org呀!於是www.aorb.org把這個IP層郵遞員送來的信交付給負責賣土豆人,但我們開始說了,www.aorb.org並不賣土豆,於是就回送一個名曰終點不可達(ICMP類型為3,代碼為3)的信給買家。
第四步,當買家收到類型為終點不可達的信時,就不再把那封問土豆價格的信上的TTL加1了,因為他已經知道了到達目的地的全部路由。
具體實現過程可以用下面兩幅圖來理解

ICMPEchoRequest

這種探測方式與基於UDP協議的路由探測的實現步驟一樣,但發送端送出的不是一個UDP數據包,而發送的是一個ICMP類型為8的EchoRequest(回顯請求)數據報文。與基於UDP協議的路由探測技術一樣,每次發送端都會把TTL值加1,每個中轉路由器都對TTL值減1,如果為0,便丟棄后給發送端發送一個超時報文,若不為0,則繼續轉發給下一跳。唯一不同的是,當這個數據報到達最終目的節點時,由於發送端發送的是EchoRequest報文,所以接收端就會相應一個ICMP類型為0的數據報文。這樣,當發送端收到ICMP類型為0的數據報文時,就知道了全部路由已經查詢完畢,終止繼續探測。
其他
pathping
pathping是tracert和ping的混合體。命令行下輸入pathpingwww.aorb.org,返回兩部分內容,第一部分顯示到達目的地經過了哪些路由,第二部分顯示了路徑中每個路由器上數據包丟失方面的信息。

跟蹤IP地址


作為網管員,在我們解決Windows操作系統的DHCP故障時,有時要找出某個地址範圍內有哪些地址沒有被使用。本人以前介紹過一種方法:打開命令提示窗口,在For…in…Do循環中調用ping命令。
例如,為了找出該地址範圍192.168.1.1到192.168.1.100有哪些地址沒有被使用,可以使用這個命令:For/L%fin(1,1,100)DoPing.exe-n2192.168.1.%f
該命令會報告指定範圍內的所有IP地址,不管是在用的還是未用的,用戶都不得不在認證系統命令行窗口中翻看大量的內容。其實,我們完全可以避免這些麻煩,只需建立一個批處理文件,要求它只返回那些未用的IP地址,然後再將命令的結果輸入到一個文本文件中。Windows系統如何跟蹤IP地址,下面介紹方法:打開記事本,在窗口中輸入如下的命令:
@Echooff
date/t>IPList.txt
time/t>>IPList.txt
echo===========>>IPList.txt
For/L%%fin(1,1,100)DoPing.exe-n2192.168.1.%%f|find"Requesttimedout."&&echo192.168.1.%%fTimedOut>>IPList.txt&&echooff:如果是正win7中"requesttimedout"要修改成"請求超時"
cls
EchoFinished!
@Echoon
Notepad.exeIPList.txt
將此文件存為IPTracker.bat,關閉記事本程序。
需要注意的是,在這個批處理文件中,整個的For…In…Do命令由幾個被“&&”連接起來的命令組成。該命令以“For”開始,以“Off”結尾,而且整個命令必須在一行上。當然,如果用戶要使用此方法的話,需要使用用戶自己的IP地址來替換示例中的IP地址。
以後,如果用戶要解決DHCP問題,可以在瀏覽器窗口中定位並雙擊IPTracker.bat文件,然後啟動一個IP地址跟蹤工具,這個批處理只查找那些未用的IP地址,並將結果存到記事本文件中。(在此例中,這個保存的批處理文件成為一個IP地址跟蹤工具,它可以一次創建,反覆使用。