ip首部校驗和計算

2021-06-07 22:34:29 字數 1507 閱讀 9397

ip首部校驗和的計算方法:

1.把校驗和字段清零。

2.然後對每16位(2位元組)進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。

接下來詳細描述反碼求和的步驟:看下面的**

演算法:short checksum(ushort* buffer,

int size)

if(size)

cksum =

(cksum>

>16)

+(cksum&0xffff)

;cksum +

=(cksum>

>16)

;return

(ushort)

(~cksum);}

引數buffer是指向16位整數的指標,剛開始指向的是ip首部的起始位址,引數size是ip首部的大小。while迴圈是將ip首部的內容以16位為單元加在一起,如果沒有整除(即size還有餘下的不足16位的部分),則加上餘下的部分,此時的cksum就是相加後的結果,這個結果往往超出了16位,因為校驗和是16位的,所以要將高16位和計算得到的cksum再加工。

再加工第一步:cksum = (cksum>>16) + (cksum&0xffff); sum>>16是將高16位移位到低16位,sum&0xffff是取出低16位,相加得到新的cksum。

再加工第二步:cksum += (cksum>>16); 第一步相加時很可能會產生進製,因此要再次把進製移到低16位進行相加。  

這樣就加工好了,接下來就是取反,並強制轉換為16位,這樣就得到了最終的校驗和。

校驗和計算出來了,接下來就是該如何校驗:

接收方進行校驗時,也是對每16位進行二進位制反碼求和。接收方計算校驗和時的首部與傳送方計算校驗和時的首部相比,多了乙個傳送方計算出來的校驗和。因此,如果首部在傳輸過程中沒有發生差錯,那麼接收方計算的結果應該為全一,因為接收方計算除校驗和以外的部分得到值是校驗和的反碼,再加多出來的校驗和當然是全一了。

最後對上述過程舉個例子:

ip頭:

45 00    00 31

89 f5    00 00

6e 06    00 00(校驗字段)

de b7   45 5d       ->    222.183.69.93

c0 a8   00 dc     ->    192.168.0.220

計算:  

4500 + 0031 +89f5 + 0000 + 6e06+ 0000 + deb7 + 455d + c0a8 + 00dc =3 22c4

0003 + 22c4 = 22c7

~22c7 = dd38      ->即為應填充的校驗和

當接受到ip資料報時,要檢查ip頭是否正確,則對ip頭進行檢驗,方法同上:

計算:4500 + 0031 +89f5 + 0000 + 6e06+ dd38 + deb7 + 455d + c0a8 + 00dc =3 fffc

0003 + fffc = ffff

得到的結果是全一,正確。

ip首部校驗和計算

ip首部校驗和的計算方法 1.把校驗和字段清零。2.然後對每16位 2位元組 進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。接下來詳細描述反碼求和的步驟 看下面的 演算法 short checksum ushort buffer,int size if size ck...

IP首部校驗和字段計算方法

ip首部有16bit的校驗和,因此,ip首部以16bit為單位計算校驗和,ip首部的長度一定是16bit的整倍數,這是由於首部長欄位是以32bit為單位計算的,不足的補0。傳送方計算方法 1.首先把校驗和的16bit置0。2.將首部以16bit為單位異或 或模2加,結果相同 3.將異或結果取反,並填...

IP首部校驗和的演算法

ip icmp igmp tcp udp 等協議的校驗和演算法是相同的,採用的都是將資料流視為16位整數流進行重複的疊加計算。計算校驗和的步驟 1 把校驗和字段置為0。2 對ip頭部的每16bit進行二進位制求和。3 如果和的高16位不位0,則將和的高16位和低16位反覆的相加,直到和的16位為0,...