2009年1月11日 星期日

[TCP/IP Illustrated] Traceroute

運作原理簡介

基本上 traceroute 是使用 ICMP 協定,並透過 IP header 中的 TTL 的值每經過一個 router 會遞減的特性,來取得封包傳遞的路徑。

詳細的運作原理說明如下:(以下 client 為執行 traceroute 的主機,server 則為目的地)
  1. client 發送 TTL 為 1 的封包,destination 指定為 server。

  2. 當第一個 router 收到後會將 TTL 減一,此時 TTL 為 0,因此 router 回送 ICMP time exceeded 訊息,如此一來,client 就可以知道封包傳遞路徑中的第一個 router 是哪一個。

  3. 接著發送 TTL 為 2 的封包,同樣的可以接收到來自第二個 router 所回傳的 ICMP time exceeded 訊息。

  4. 一直到封包真正到達 server 時,此時 server 會回應 ICMP port unreachable 訊息,為什麼呢? 原因是因為 client 所發送的封包為 UDP datagram,並指定一個很大的數字(> 30000),通常不會有 server 會在這麼大的 port number 上提供服務,因此會回傳 ICMP port unreachable 的訊息。

  5. client 收到來自 server 的 ICMP port unreachable 訊息,就完整拼湊出封包傳遞路徑了!


tracertroute 實測

在 Windows 中的程式名稱為 tracert,在 Linux 則為 tracepath (也有 tracertroute,不過要另外裝套件),以下是在 Windows 使用的範例圖:

若用 tcpdump 偵測封包往來情況,結果如下:

從上面的實測可以得知,在封包傳遞路徑上的節點,都是由 ICMP time exceeded 與 udp port unreachable 來決定的,以下為 ICMP time exceeded 封包的格式:
從圖中可以看出,ICMP time exceed 封包的 type 值為 11,而 time exceeded error 又會在兩種情況下發生,分別是在傳送(trasmit,code = 0)以及封包重組(reassembly,code = 1)時。


IP Source Routing Option

這個功能剛好跟 ping 的 record route option 相反,是將 router 的 IP 清單填到封包中,讓封包可以按照清單上的路徑傳遞,有分為 strict/loose source routing,封包格式如下:

不過這功能似乎不常用,可能高階的網管有可能用到吧......以後學到高階的時候再來研究這個好了。


參考資料

沒有留言:

張貼留言