前面講到了,IP協定并不是一個可靠的協定,它不保證資料被送達,那麼,自然的,保證資料送達的工作應該由其他的子產品來完成。其中一個重要的子產品就是ICMP(網絡控制封包)協定。
當傳送IP資料包發生錯誤--比如主機不可達,路由不可達等等,ICMP協定将會把錯誤資訊封包,然後傳送回給主機。給主機一個處理錯誤的機會,這 也就是為什麼說建立在IP層以上的協定是可能做到安全的原因。ICMP資料包由8bit的錯誤類型和8bit的代碼和16bit的校驗群組成。而前 16bit就組成了ICMP所要傳遞的資訊。書上的圖6-3清楚的給出了錯誤類型和代碼的組合代表的意思。
盡管在大多數情況下,錯誤的包傳送應該給出ICMP封包,但是在特殊情況下,是不産生ICMP錯誤封包的。如下
ICMP差錯封包不會産生ICMP差錯封包(出IMCP查詢封包)(防止IMCP的無限産生和傳送)
目的位址是廣播位址或多點傳播位址的IP資料報。
作為鍊路層廣播的資料報。
不是IP分片的第一片。
源位址不是單個主機的資料報。這就是說,源位址不能為零位址、環回位址、廣播地 址或多點傳播位址。
雖然裡面的一些規定現在還不是很明白,但是所有的這一切規定,都是為了防止産生ICMP封包的無限傳播而定義的。
ICMP協定大緻分為兩類,一種是查詢封包,一種是差錯封包。其中查詢封包有以下幾種用途:
ping查詢(不要告訴我你不知道ping程式)
子網路遮罩查詢(用于無盤工作站在初始化自身的時候初始化子網路遮罩)
時間戳查詢(可以用來同步時間)
而差錯封包則産生在資料傳送發生錯誤的時候。就不贅述了。
ping可以說是ICMP的最著名的應用,當我們某一個網站上不去的時候。通常會ping一下這個網站。ping會回顯出一些有用的資訊。一般的資訊如下:
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)。
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文檔來了解這些,這裡就不贅述了。