1. 程式人生 > >TCP/IP學習筆記(4)-ICMP,ping,traceroute

TCP/IP學習筆記(4)-ICMP,ping,traceroute

IMCP協議介紹

當傳送IP資料包發生錯誤--比如主機不可達,路由不可達等等,ICMP協議將會把錯誤資訊封包,然後傳送回給主機。給主機一個處理錯誤的機會,這 也就是為什麼說建立在IP層以上的協議是可能做到安全的原因。ICMP資料包由8bit的錯誤型別和8bit的程式碼和16bit的校驗和組成。而前 16bit就組成了ICMP所要傳遞的資訊。書上的圖6-3清楚的給出了錯誤型別和程式碼的組合代表的意思。

儘管在大多數情況下,錯誤的包傳送應該給出ICMP報文,但是在特殊情況下,是不產生ICMP錯誤報文的。如下:

  1. ICMP差錯報文不會產生ICMP差錯報文(出IMCP查詢報文)(防止IMCP的無限產生和傳送)

  2. 目的地址是廣播地址或多播地址的IP資料報。

  3. 作為鏈路層廣播的資料報。

  4. 不是IP分片的第一片。

  5. 源地址不是單個主機的資料報。這就是說,源地址不能為零地址、環回地址、廣播地 址或多播地址。 雖然裡面的一些規定現在還不是很明白,但是所有的這一切規定,都是為了防止產生ICMP報文的無限傳播而定義的。

ICMP協議大致分為兩類,一種是查詢報文,一種是差錯報文。其中查詢報文有以下幾種用途:

  1. ping查詢(不要告訴我你不知道ping程式)

  2. 子網掩碼查詢(用於無盤工作站在初始化自身的時候初始化子網掩碼)

  3. 時間戳查詢(可以用來同步時間)

而差錯報文則產生在資料傳送發生錯誤的時候。就不贅述了。

ICMP的應用--ping

ping可以說是ICMP的最著名的應用,當我們某一個網站上不去的時候。通常會ping一下這個網站。ping會回顯出一些有用的資訊。一般的資訊如下:

Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255

Ping statistics for 10.4.24.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

ping這個單詞源自聲納定位,而這個程式的作用也確實如此,它利用ICMP協議包來偵測另一個主機是否可達。原理是用型別碼為0的ICMP發請 求,受到請求的主機則用型別碼為8的ICMP迴應。ping程式來計算間隔時間,並計算有多少個包被送達。使用者就可以判斷網路大致的情況。我們可以看到, ping給出來了傳送的時間和TTL的資料。我給的例子不太好,因為走的路由少,有興趣地可以ping一下國外的網站比如sf.net,就可以觀察到一些 丟包的現象,而程式執行的時間也會更加的長。

ping還給我們一個看主機到目的主機的路由的機會。這是因為,ICMP的ping請求資料報在每經過一個路由器的時候,路由器都會把自己的ip放到該數 據報中。而目的主機則會把這個ip列表複製到迴應icmp資料包中發回給主機。但是,無論如何,ip頭所能紀錄的路由列表是非常的有限。如果要觀察路由, 我們還是需要使用更好的工具,就是要講到的Traceroute(windows下面的名字叫做tracert)。

ICMP的應用--Traceroute

Traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。前面說到,儘管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器。所以Traceroute正好就填補了這個缺憾。

Traceroute的原理是非常非常的有意思,它受到目的主機的IP後,首先給目的主機發送一個TTL=1(還記得TTL是什麼嗎?)的UDP(後面就 知道UDP是什麼了)資料包,而經過的第一個路由器收到這個資料包以後,就自動把TTL減1,而TTL變為0以後,路由器就把這個包給拋棄了,並同時產生 一個主機不可達的ICMP資料報給主機。主機收到這個資料報以後再發一個TTL=2的UDP資料報給目的主機,然後刺激第二個路由器給主機發ICMP資料 報。如此往復直到到達目的主機這樣,traceroute就拿到了所有的路由器ip。從而避開了ip頭只能記錄有限路由IP的問題。

有人要問,我怎麼知道UDP到沒到達目的主機呢?這就涉及一個技巧的問題,TCP和UDP協議有一個埠號定義,而普通的網路程式只監控少數的幾個號碼較 小的埠,比如說80,比如說23,等等。而traceroute傳送的是埠號>30000(真變態)的UDP報,所以到達目的主機的時候,目的 主機只能傳送一個埠不可達的ICMP資料報給主機。主機接到這個報告以後就知道,主機到了,所以,說Traceroute是一個騙子一點也不為過:)

Traceroute程式裡面提供了一些很有用的選項,甚至包含了IP選路的選項,請察看man文件來了解這些,這裡就不贅述了。