ip檢驗和演算法分析與實現

2021-05-10 11:07:39 字數 1169 閱讀 7557

為了計算乙份資料報的ip檢驗和,首先把檢驗和字段置為0。然後,對首部中每個16bit進

行二進位制反碼求和(整個首部看成是由一串16bit的字組成),結果存在檢驗和字段中。

當收到乙份ip資料報後,同樣首部中每個16bit進行反碼求和。由於接收方在計算過程中

包含了傳送方存在首部中的檢驗和,因為如果首部在傳輸過程中沒有發生任何差錯,那麼

接收方計算的結果應該為全1。如果結果不是1(即檢驗和錯誤),那麼ip就丟棄收到的數

據報。這是tcp/ip中的原文,開始接觸時有點難理解,現在說說我的理解:

定理1:原碼+反碼=value1    則value1的二進位製全為1

定理2:相加後取反=取反後相加

在傳送前,先把檢驗和置0,再把首部看成是16bit字,並分別把這些字取反相加,再把結

果value1置入檢驗和中。傳送在接收後,把首部看成是16bit字,並分別把這些字相加(包

括檢驗和)

令:除檢驗和的首部相加得的值為value2

而檢驗和的值為value1(直接傳送過來的,即value2的反碼),所以value1+value2=value3,

其中value3的二進位制值全為1

演算法實現:

傳送方: 應該返回檢驗和值

接收方: 應該返回0(表明傳送過程沒有出現任何差錯)

/* 注意: ip報頭檢驗和域只有16bit */

ushort   checksum(ushort   *buffer,   int   size)  

if   (size)  

cksum   =   (cksum   >>   16)   +   (cksum   &   0xffff);  

cksum   +=   (cksum   >>16);    

return   (ushort)(~cksum);    

}1011 1001 0000

1011 1001 1010 --> 1011 + 1001 + 1010 = 1 1110 -->(取高低位相加) 1111

( 1 0100 + 1010 = 1 1110 --> 1111  <===>  1 0100 --> 0101 + 1010 = 1111 )

參考資料: http://blog.csdn.net/kubete/archive/2007/10/30/1856374.aspx

IP報頭檢驗和演算法的python實現

ip校驗和字段是用來檢驗資料傳輸正確性的。在傳送資料時,為了計算 ip資料報的校驗和,按如下步驟 1 把ip 資料報的校驗和字段置為0 2 把首部看成以 16位為單位的數字組成,依次進行二進位制反碼求和 3 把得到的結果存入校驗和字段中。在接收方,要驗證資料的正確性,按如下步驟 1 把首部看成以 1...

Ip 首部檢驗和字段

ip icmp igmp tcp udp等協議的校驗和演算法都是相同的,演算法如下 在傳送資料時,為了計算數ip據報的校驗和。應該按如下步驟 1 把ip資料報的首部都置為0,包括校驗和字段。2 把首部看成以16位為單位的數字組成,依次進行二進位制反碼求和。3 把得到的結果存入校驗和字段中。在接收資料...

IP首部檢驗和計算

計算ip首部檢驗和 如上圖,計算?是多少?計算 從08 00之後開始計算到後面的08 00即 兩個位元組的相加 45 00 00 20 d5 56 00 00 80 01 de b7 45 5d c0 a8 00 dc 等於 3800f 然後溢位的再次加到後面即 800f 3 等於 8012 最後用...