07.22 ICMP 協議、ping 和 Traceroute套餐

前戲

我們上篇文章 講到了IP協議並不是一個可靠的協議。它並不保證數據能夠傳送到對端。那麼,這個保證數據送達的工作應該由其他的協議來實現了。其中ICMP協議就是來幹這個事情的。

當傳送IP數據包失敗,例如主機不可達等等,ICMP協議將會把錯誤信息傳回到主機。ICMP 數據包由8bit 的錯誤類型和8bit 的代 碼和16bit 的校驗和組成。而前 16bit 就組成了 ICMP 所要傳遞的信息。書上的圖6-3清楚的給出了錯誤類型和代碼的組合代表的意思。

當傳送 IP 數據包發生錯誤--比如主機不可達,路由不可達等等,ICMP 協議將會把錯誤信息封包,然後傳送回給主機。給主機 一個處理錯誤的機會,這 也就是為什麼說建立在 IP 層以上的協議是可能做到安全的原因。ICMP 數據包由8bit 的錯誤類型和8bit 的代 碼和16bit 的校驗和組成。而前 16bit 就組成了 ICMP 所要傳遞的信息。我們的教科書中清楚的給出了錯誤類型和代碼的組合代表的意思。我不具體說了。我還是貼一張圖片吧。

ICMP 協議、ping 和 Traceroute套餐

真的找不到高清的,教科書上是高清,請腦補

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

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

2,目的地址是廣播地址或多播地址的IP數據報。

3,作為鏈路層廣播的數據報。

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

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

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

7,ping 查詢(我覺得應該程序員都知道ping吧,不要告訴我你不知道 ping 程序)

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

9,時間戳查詢(可以用來同步時間)

ICMP的用途應用程序-ping

ping 可以說是 ICMP 的最著名的應用,應該程序員都知道的,只要需要測試網絡鏈路是否正常,都是ping下,能夠看到一些信息

ICMP 協議、ping 和 Traceroute套餐

本人在Windows系統上的結果

ping 這個單詞源自聲納定位,而這個程序的作用也確實如此,它利用 ICMP 協議包來偵測另一個主機是否可達。原理是用類型碼 為0的 ICMP 發請 求,受到請求的主機則用類型碼為8的 ICMP 回應。ping 程序來計算間隔時間,並計算有多少個包被送達。用戶就可 以判斷網絡大致的情況。我們可以看到, ping 給出來了傳送的時間和 TTL 的數據。

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 文檔來了解這些,這裡就不贅述了。

如果你想看網絡編程方面,可以查看以下幾篇文章

喜歡我的文章的話,就關注我吧!不要只收藏和轉發哦,每天至少兩篇編程知識給大家,都是本人多年的經驗總結!


分享到:


相關文章: