TCP/IP - IP數據報首部校驗和算法詳解

IP數據報首部校驗和算法詳解

簡介

IP/ICMP/IGMP/TCP/UDP等協議的校驗和算法都是相同的,算法以下:算法

在發送數據時,爲了計算數IP據報的校驗和。應該按以下步驟:spa

  1. 把IP數據報的首部都置爲0,包括校驗和字段。
  2. 把首部當作以16位爲單位的數字組成,依次進行二進制反碼求和。
  3. 把獲得的結果存入校驗和字段中。

在接收數據時,計算數據報的校驗和相對簡單,按以下步驟:code

  1. 當接收IP包時,須要對報頭進行確認,檢查IP頭是否有誤,算法同上二、3步,而後判斷取反的結果是否爲0,是則正確,不然有錯。

生成和校驗

發送方(生成)

  1. 將校驗和字段置爲0,而後將IP包頭按16比特分紅多個單元,如包頭長度不是16比特的倍數,則用0比特填充到16比特的倍數;
  2. 對各個單元採用反碼加法運算(即高位溢出位會加到低位,一般的補碼運算是直接丟掉溢出的高位),將獲得的和的反碼填入校驗和字段;
  3. 發送數據包。

接收方(校驗)

  1. 將IP包頭按16比特分紅多個單元,如包頭長度不是16比特的倍數,則用0比特填充到16比特的倍數;
  2. 對各個單元採用反碼加法運算,檢查獲得的和是否符合是全1(有的實現可能對獲得的和會取反碼,而後判斷最終值是否是全0);
  3. 若是是全1則進行下步處理,不然意味着包已變化從而丟棄之。須要強調的是反碼和是採用高位溢出加到低位的,如3比特的反碼和運算:100b+101b=010b(由於100b+101b=1001b,高位溢出1,其應該加到低位,即001b+1b(高位溢出位)=010b)

實例

請看我用ominipeek的抓包blog

圖片描述

發送方(生成)

I.將校驗和字段置爲0,而後將IP包頭按16比特分紅多個圖片

校驗和Header Checksum:0x618D將其重置爲0X0000ip

將IP包頭分段:it

1. 0x4500
2. 0x0029
3. 0x44F1
4. 0x4000
5. 0x8006
6. 0x0000 ------->這個爲Header Checksum的值,咱們前面將其重置爲0了
7. 0xC0A8
8. 0x01AE
9. 0x4A7D
10. 0x477D
\-------------------------------------------------------

將1至10相加求出來的和爲:0x29E70class

II.對各個單元採用反碼加法運算(即高位溢出位會加到低位,一般的補碼運算是直接丟掉溢出的高位),將獲得的和的反碼填入校驗和字段二進制

0x0002+0x9E70=0x9E72im

0x9E72二進制爲:1001 1110 0111 0010

反碼爲:0110 0001 1000 1101

0110 0001 1000 1101的16進製爲:0x618D

看看這個 是否與IP包頭中的Checksum相同

接收方(校驗)

當接收到IP對其進行檢測

I. 對各個單元採用反碼加法運算,檢查獲得的和是否符合是全1(有的實現可能對獲得的和會取反碼,而後判斷最終值是否是全0)

當收到IP數據局包的時候,要驗證IP頭是否正確,則能夠這樣進行

1. 0x4500
2. 0x0029
3. 0x44F1
4. 0x4000
5. 0x8006
6. 0x618D ------->這個爲Header Checksum的值
7. 0xC0A8
8. 0x01AE
9. 0x4A7D
10. 0x477D
\-------------------------------------------------------

將1至10相加求出來的和爲:0x2FFD

II. 對各個單元採用反碼加法運算(即高位溢出位會加到低位,一般的補碼運算是直接丟掉溢出的高位),將獲得的和的反碼填入校驗和字段:

0x0002+0x0FFD=0xFFFF

0xFFFF二進制爲:1111 1111 1111 1111

1111 1111 1111 1111反碼爲:0

====================================================

關於這一部的補充說明,

將IP包頭分段:

1.  0x4500
2.  0x0029        
3.  0x44F1        
4.  0x4000        
5.  0x8006        
6.  0x0000 ------->這個爲Header Checksum的值,咱們前面將其重置爲0了        
7.  0xC0A8        
8.  0x01AE        
9.  0x4A7D       
10.  0x477D

圖片描述

相關文章
相關標籤/搜索