ip首部有16bit的校驗和,因此,ip首部以16bit為單位計算校驗和,ip首部的長度一定是16bit的整倍數,這是由於首部長欄位是以32bit為單位計算的,不足的補0。
傳送方計算方法:
1.首先把校驗和的16bit置0。
2.將首部以16bit為單位異或(或模2加,結果相同)。
3.將異或結果取反,並填入校驗和字段。
接收方計算方法:
1.將首部以16bit為單位異或(或模2加,結果相同)。
2.異或結果如果所有位全為1,則無差錯。
例子:為計算方便,簡化為以5位為單位計算校驗和,校驗和放在最後5位:
1.傳送方
(1)首先把校驗和的5bit置0:
(2)將首部以16bit為單位異或(或模2加,結果相同):11010
10111
00000
①如果是異或:
②如果是模2加,模2加為不帶進製的二進位制加法:11010
10111
00000
----
--01101
// 結果
可見兩種方法的結果相同。11010
10111
00000
----
--01101
// 結果
(3)將異或結果取反,並填入校驗和字段:
2.接收方11010
10111
10010
(1)將首部以5bit為單位異或(或模2加,結果相同):
(2)可見結果位全為1,傳輸未出錯。11010
10111
10010
----
-11111
// 結果
計算原理:
乙個二進位制位與另乙個二進位制位的異或結果取反後的結果再和這兩個二進位制位異或,結果為1:
0 xor 0=0
;~0=
1;0 xor 0 xor 1=1
;
1 xor 1=0
;~0=
1;1 xor 1 xor 1=1
;
0 xor 1=1
;~1=
0;0 xor 1 xor 0=1
;
而計算開始時,把首部校驗和字段全置為0,而0與任何數異或都等於這個數本身,因此,傳送端相當於把除首部校驗和字段之外的值異或後取反並放在校驗和字段,之後接收方計算時,相當於把求反後的值與原值計算校驗和,每一位必定是1,否則就是出錯(但全為1時不一定是正確的,false positive機率可忽略不計,但仍存在)。1 xor 0=1
;~1=
0;1 xor 0 xor 0=1
;
ip首部校驗和計算
ip首部校驗和的計算方法 1.把校驗和字段清零。2.然後對每16位 2位元組 進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。接下來詳細描述反碼求和的步驟 看下面的 演算法 short checksum ushort buffer,int size if size ck...
ip首部校驗和計算
ip首部校驗和的計算方法 1.把校驗和字段清零。2.然後對每16位 2位元組 進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。接下來詳細描述反碼求和的步驟 看下面的 演算法 short checksum ushort buffer,int size if size ck...
ip首部校驗和的計算方法(c語言實現)
關聯部落格 關於ip報文校驗和一些思考 把校驗和字段清零。然後對每16位 2位元組 進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。實現如下 short checksum ushort buffer,int size if size cksum cksum 16 cks...