解讀路由器實用程序Tracert命令之數據報解析
數據報(被捕獲的)中,我們可以看到Tracert命令是如何使用IP生存時間(TTL)字段和ICMP錯誤消息,確定一個主機到網絡上其他主機的路由。IP包頭的TTL(Time to Live)字段,是由發送端初始設置的一個8bit字段,它指出數據包的有效時間,即生存周期。每個處理數據報的路由器都需要把TTL值減1或減去數據報在路由器中的停留秒數。
由于大多數的路由器轉發數據報的時延都小于1秒鐘,因此TTL最終成為一個跳站的計數器,按照ICMP協議的有關規定,當路由器收到一份數據報,如果其TTL字段是0或1,則路由器丟棄該數據報,并給源主機發送一份ICMP“超時”信息。Tracert命令正是據此發現路由器、確定路由的。
下面我們來對數據包逐幀解析,體會Tracert命令的工作過程。
幀1:主機A(10.4.152.16)向主機B(10.4.153.165)發送一個信息類型為8,代碼為0的ECHO請求包。IP包頭的TTL值為1,如圖5所示。

圖5
幀2:由于目的主機在另一個網段,因此數據包被發往本地網關路由器A(10.4.152.254),路由器A收到主機A發來的的ECHO請求包后,返回了一個一個類型為11,代碼為0的ICMP包。回復“超時”(Time to live exceeded in transit),如圖6所示。

圖6
從這兩幀我們可以看到, 主機A首先發送TTL為1的回顯數據包,路徑上第一個路由器A(10.4.152.254)在轉發數據包之前將數據包上的TTL遞減 1,當數據包上的TTL減為0時,路由器丟棄該數據包,并將“ICMP Time Exceeded”(超時)的消息發回源主機A,由此,發現路徑上的第一個路由器。
主機A為了獲得往返延遲時間的信息,在這一跳發送了三個TTL都為1、長度、目標地址相同的報文(幀1、幀3、幀5),路由器A依次丟棄這三個報文,并向主機A發送“超時”消息(幀2、幀4、幀6)。
幀7:主機A(10.4.152.16)向目標主機B(10.4.153.165)發送TTL值為2的回顯數據包。
幀8:路由器B(10.4.147.82)路由器B向源主機(主機A)發送一個“ICMP Time Exceeded(超時)”數據包。
我們看到,Tracert命令將 TTL 遞增1,主機A發送TTL值為2的回顯數據包,數據報由路由器A轉發至路由器B,由于該數據報的TTL值在第一跳時被減去了1,因此在到達路由器B后,TTL值為0。路由器B丟棄該數據包,并向主機A返回“ICMP Time Exceeded(超時)”的報文,從而獲得路徑上的第二個路由器信息。同樣主機A在這里也發送了相同TTL值的3個報文,以獲得平均往返的延遲時間信息。
幀13 、幀15、幀17:主機A(10.4.152.16) 發送TTL值為3的3個回顯數據包。
幀14 、幀16、幀18:主機B(10.4.153.165)回復類型為0,代碼為0的3個ECHO包。
至此,由于主機A發出的數據包TTL值為3,發出的數據包經過兩次轉發后,到達目的主機B,主機B返回ECHO應答包,至此實現主機A至主機B的路由跟蹤。
通過以上對數據報的解析,我們看到Tracert命令通過控制IP報文的生存期(TTL),實現路由跟蹤提供路由器到目的地址的每一跳的信息。TTL等于1的ICMP回顯請求報文被首先發送,路徑上的第一個路由器將會丟棄該報文并且發送回ICMP超時錯誤消息的報文。隨后,Tracert命令的每次發送過程都將 TTL遞增1,通過檢查中間路由器發送回的“ICMP Time Exceeded”消息來確定路由。這個過程將持續到目標響應或TTL達到最大值,從而最終確定故障點或完整的路由路徑。
路由器實用程序Tracert命令的數據包的捕獲的模塊就為大家介紹完了,希望大家通過以上的闡述能夠有所收獲,更多精彩的內容請看:解讀路由器實用程序Tracert命令之數據包的捕獲
【編輯推薦】