ICMP協議

leikj發表於2024-03-22

微信公眾號:鄭爾多斯
關注可瞭解更多的Nginx知識。任何問題或建議,請公眾號留言;
關注公眾號,有趣有內涵的文章第一時間送達!

校驗和演算法

這裡介紹的校驗和演算法被IP收不,ICMP首部,TCP,UDP首部所使用。
下面摘自《TCP/IP協議簇》的IP頭校驗和演算法:
傳送時:

  1. 將校驗和欄位置為0;
  2. 將整個首部分為16bit的部分,求和;
  3. 取反碼,填入到校驗和欄位中;

接收時:

  1. 直接將整個首部分為16bit的部分,求和;
  2. 取反碼,若結果為0,取合法;否則丟棄;

這上面有兩個細節沒有描述清楚:

  1. 計算時的位元組順序(litter endian和big endian)問題;
  2. 取和溢位時的改進計算方法;

根據實驗結果,及參考網路上的資料,實際上幾乎現有所有的系統對校驗和演算法已經有點小小的補充,也許《TCP/IP協議簇》這裡沒有更新罷了,自我安慰吧,如下:
當傳送IP包時,需要計算IP報頭的校驗和:

1、 把校驗和欄位置為0;
2、 對IP頭部中的每16bit進行二進位制求和;
3、 如果和的高16bit不為0,則將和的高16bit和低16bit反覆相加,直到和的高16bit為0,從而獲得一個16bit的值;
4、 將該16bit的值取反,存入校驗和欄位。

當接收IP包時,需要對報頭進行確認,檢查IP頭是否有誤,演算法同上2、3步,然後判斷取反的結果是否為0,是則正確,否則有錯。

ICMP報文的格式

ICMP報文是在IP資料包內部被傳輸的。ICMP報文的種類有兩種,即ICMP差錯報告報文和ICMP詢問報文。

ICMP通過IP協議傳送
ICMP通過IP協議傳送
ICMP報文格式
ICMP報文格式

說明:

(1)所有報文的前4個位元組都是一樣的,剩下的其他位元組則互不相同。
(2)型別欄位可以有15個不同的值,以描述特定型別的ICMP報文。某些ICMP報文還使用程式碼欄位的值來進一步描述不同的條件。
(3)檢驗和欄位覆蓋整個ICMP報文。使用的演算法與IP首部檢驗和演算法相同。ICMP的檢驗和是必需的。

差錯報文

差錯報文共56個位元組。

所有的ICMP差錯報告報文中的資料欄位都具有同樣的格式。將收到的需要進行差錯報告IP資料包的首部和資料欄位的前8個位元組提取出來,作為ICMP報文的資料欄位。再加上響應的ICMP差錯報告報文的前8個位元組,就構成了ICMP差錯報告報文。提取收到的資料包的資料欄位的前8個位元組是為了得到運輸層的埠號(對於TCP和UDP)以及運輸層報文的傳送序號(對於TCP)。

差錯報文
差錯報文

查詢報文
查詢報文共40個位元組

查詢報文格式
查詢報文格式

ICMP詢問報文有四種,分別為回送請求和回答,時間戳請求和回答,掩碼地址請求和回答,以及路由器詢問和通過。

ICMP回送請求報文是由主機或路由器向一個特定的目的主機發出的詢問。收到此報文的機器必須給源主機傳送ICMP回送應答報文。這種詢問報文用來測試目的站是否可達以及瞭解其有關狀態。比如ping命令

ICMP時間戳請求允許系統向另一個系統查詢當前的時間。該ICMP報文的好處是它提供了毫秒級的解析度,而利用其他方法從別的主機獲取的時間只能提供秒級的解析度。請求端填寫發起時間,然後傳送報文。應答系統收到請求報文時填寫接收時間戳,在傳送應答時填寫傳送時間戳。大多數的實現是把後面兩個欄位都設成相同的值。

主機使用ICMP地址掩碼請求報文可向子網掩碼伺服器得到某個介面的地址掩碼。系統廣播它的ICMP請求報文。ICMP報文中的識別符號和序列號欄位由傳送端任意選擇設定,這些值在應答中將被返回,這樣,傳送端就可以把應答與請求進行匹配。

主機使用ICMP路由器詢問和通過報文可瞭解連線在本網路上的路由器是否正常工作。主機將路由器詢問報文進行廣播(或多播)。收到詢問報文的一個或幾個路由器就使用路由器通過報文廣播其路由選擇資訊

ICMP最相關的程式就是pingtraceroute了,下篇文章介紹這兩個指令和ICMP的關係


喜歡本文的朋友們,歡迎長按下圖關注訂閱號鄭爾多斯,更多精彩內容第一時間送達

鄭爾多斯
鄭爾多斯

相關文章