前面講到了,IP協議並非一個可靠的協議,它不保證數據被送達,那麼,天然的,保證數據送達的工做應該由其餘的模塊來完成。其中一個重要的模塊就是ICMP(網絡控制報文)協議。windows
當傳送IP數據包發生錯誤--好比主機不可達,路由不可達等等,ICMP協議將會把錯誤信息封包,而後傳送回給主機。給主機一個處理錯誤的機會,這 也就是爲何說創建在IP層以上的協議是可能作到安全的緣由。ICMP數據包由8bit的錯誤類型和8bit的代碼和16bit的校驗和組成。而前 16bit就組成了ICMP所要傳遞的信息。書上的圖6-3清楚的給出了錯誤類型和代碼的組合表明的意思。安全
儘管在大多數狀況下,錯誤的包傳送應該給出ICMP報文,可是在特殊狀況下,是不產生ICMP錯誤報文的。以下網絡
雖然裏面的一些規定如今還不是很明白,可是全部的這一切規定,都是爲了防止產生ICMP報文的無限傳播而定義的。工具
ICMP協議大體分爲兩類,一種是查詢報文,一種是差錯報文。其中查詢報文有如下幾種用途:網站
而差錯報文則產生在數據傳送發生錯誤的時候。就不贅述了。spa
ping能夠說是ICMP的最著名的應用,當咱們某一個網站上不去的時候。一般會ping一下這個網站。ping會回顯出一些有用的信息。通常的信息以下:.net
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)。code
Traceroute是用來偵測主機到目的主機之間所經路由狀況的重要工具,也是最便利的工具。前面說到,儘管ping工具也能夠進行偵測,可是,由於ip頭的限制,ping不能徹底的記錄下所通過的路由器。因此Traceroute正好就填補了這個缺憾。ip
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文檔來了解這些,這裏就不贅述了。