IP/ICMP/IGMP/TCP/UDP等協議的校驗和算法都是相同的,算法以下:算法
在發送數據時,爲了計算數IP據報的校驗和。應該按以下步驟:spa
在接收數據時,計算數據報的校驗和相對簡單,按以下步驟:code
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