TCP/IP協議---ICMP協議及ping、traceroute


  ICMP Internet控制報文協議
通常被認為是IP層的組成部分,一般被IP層或更高層(TCP、UDP)使用。
ICMP報文是在IP數據報內部被傳輸的。如圖:

 

ICMP報文的格式如下:


報文的前4個字節都一樣: 8bit類型,8bit代碼,16bit檢驗和。

16bit檢驗和,算法和計算IP首部檢驗和一樣,ICMP檢驗和要覆蓋整個報文,包括首部和數據。
ICMP報文有不同的報文類型,不同類型由這個8bit的類型和8bit的代碼共同決定。一個類型下可能有多個代碼。
比如: 類型0表示回顯應答(ping應答);類型1表示目的不可達,其中代碼0表示網絡不可達,代碼1表示主機不可達,代碼2表示協議不可達,代碼3表示端口不可達等等...

報文也分為查詢類型還是差錯類型。因為有時要對差錯報文進行特殊處理,比如對ICMP差錯報文進行響應時就不會再生成一個ICMP差錯報文...
當發生的是差錯報文時,報文始終包含導致產生ICMP差錯報文的原IP首部和數據部分的前8個字節(比如傳輸層的UDP或者TCP,這包含了端口號)。這里的原IP首部中的協議字段和前8個字節的端口號,可以判斷出是哪個協議和哪個用戶進程。
除了上述的ICMP差錯報文不會再產生ICMP差錯報文,一般目的地址是廣播的數據報不會再產生ICMP差錯報文了,這樣防止廣播風暴...

ICMP地址掩碼請求與應答
ICMP時間戳請求與應答
ICMP端口不可達差錯:
如果說報文發送到目的主機的未監聽的端口,那么目的主機就會返回一個端口不可達的ICMP差錯報文。traceroute就利用了這一點。

 

可以看出ICMP報文的數據部分,包含了原IP的首部和IP數據部分的前8個字節(這里就是UDP首部)。

 

============Ping============== 

   ping程序是由Mike Muuss編寫,目的是為了測試一個主機是否能到達。
該程序的原理就是向目的主機發送一個請求回顯類型(ICMP眾多類型的一個,類型是8,代碼是0)的ICMP報文,並等待返回ICMP回顯應答(ICMP眾多類型的一個,類型是0,代碼是0)。
一般來說,如果ping不通主機,就表示不能訪問那台機器。不過隨着Internet安全意識提高,比如現在的路由器和防火牆已經可以提供訪問控制列表了,ping不通也不一定是訪問不了主機了...

ping程序ICMP回顯請求和回顯應答的報文格式如下:

Unix系統在實現ping程序時,標識符字段置成發送進程的ID號,這樣一台機器啟用多個ping的時候,當本機接到應答報文時,就能識別出是哪個ping實例發出的。
ping返回每個序列號,ttl,time...序列號是每發送一個新的回顯請求就加1,起始是0。ttl就是過了幾個路由(ping局域網內的機器發現ttl就不會減少)。time就是計算的往返時間,發送的時候在數據部分記錄下發送時間,收到的時間減去這個發送時間。
ping的時候,往往會發現第一個回來的報文比別的要用的往返時間長,這個多出去的時候就可能是arp尋找mac地址...

ping程序也提供了查看IP記錄路由選項的.在IP首部中,還記得有個選項的字段吧~這些個ip記錄就放在這個字段里。每經過一個路由,就把這個路由出口的ip(注意這里規范是出口地址),回顯應答報文回到源端時仍然會記錄下每個路由的出口地址。
IP首部最長是60個字節,減去固定的20字節長度,剩下40個字節。記錄路由IP的這個類型項、長度項、記錄ip位置的指針各占1個字節,這樣存放各個路由ip就只剩下37個字節,一個ip4個字節,因此最多只能記錄9個路由...
IP首部的選項還可以記錄IP時間戳。這個類似於IP記錄路由選項。

 

============Traceroute==============

  traceroute程序--可以讓我們看到IP數據報從一台主機傳到另一台主機所經過的路由情況。

ping程序中也提供了查看IP記錄路由選項,為啥還要再搞一個traceroute咧?主要原因還是因為IP首部選項能存儲的ip數量太少了,最多9個。如果只考慮去和回的一個方向,那么最多只能存儲4-5個路由,這在現在的互聯網規模來看顯然是不太滿足的。
traceroute幾個核心知識:利用TTL通過路由減1,直到變為1或者0時(路由不會傳送TTL為0的包),路由就會發送超時類型的ICMP報文通知源端主機。利用UDP發送一般不常見的端口號給目的主機,當真正到達目的主機時,目的主機會發送一個端口不可達錯誤的ICMP報文(在未到達時,是路由返回的超時類型的ICMP報文,需要辨識開)。源端主機根據這個確認是否到達。TTL開始是1,逐漸遞增。

一個細節:對於每個TTL值,都會發送三個包。每接到一個報文,就計算並打印出來往返時間。如果5秒鍾內一個包沒收到,就打印一個*號,並發送下一份數據報。

ICMP超時報文格式如下:

 

IP源站選路選項:
通常IP路由是動態的,每個路由都要判斷下一站轉發給誰。源站選路:就是由發送者指定路由。采用類似Traceroute程序的工具來發現實際的路由。
一般分為嚴格和寬松的兩種。嚴格的源站,是由發送端確切指明每個路由,如果發現指定的路由不在這個連接的路由上,那么就會發送“源站路由失敗”的ICMP報文。
寬松的:發送端指明一個路由的IP地址清單,每兩個IP路由之間可以通過其他路由器。
這里指定的路由和IP記錄路由選項是一樣的,都是利用IP首部的選項字段,格式也很類似。

 

 

 

--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM