TCP頭校驗和計算演算法詳解

2021-06-07 11:31:59 字數 2154 閱讀 7485

我就不管是按「位」(bit)取反相加,還是 按「1的補碼」相加了,總之

就是把需要進行校驗的「字串」加(+)起來,把這相加的 結果取反當做

校驗和」 (checksum), 比如,相加的結果是0101,那麼「校驗和」就

1010,驗證的時候呢,就是0101+1010 = 1111,取反後, 就是0

——如果驗證得「零」(0),就是正確的!

先將checksum欄位置零,然後按16位分組,計算2進製反碼和,最後再求和的反碼!

為了計算乙份資料報的ip檢驗和,首先把檢驗和字段置為0。然後,對首部中每個16bit進行二進位制反碼求和(整個首部看成是由一串16bit的字組成),結果存在檢驗和字段中。當收到乙份ip資料報後,同樣對首部中每個16bit進行二進位制反碼的求和。由於接收方在計算過程中包含了傳送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那麼接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那麼ip就丟棄收到的資料報。但是不生成差錯報文,由上層去發現丟失的資料報並進行重傳。

當傳送ip包時,需要計算ip報頭的校驗和:

1、  把校驗和字段置為0;

2、  對ip頭部中的每16bit進行二進位制求和;

3、  如果和的高16bit不為0,則將和的高16bit和低16bit反覆相加,直到和的高16bit為0,從而獲得乙個16bit的值;

4、  將該16bit的值取反,存入校驗和字段。

◆當接收ip包時,需要對報頭進行確認,檢查ip頭是否有誤,演算法同上2、3步,然後判斷取反 的結果是否為0,是則正確,否則有錯。

演算法:short checksum(ushort* buffer, int size)

if(size)

cksum = (cksum>>16) + (cksum&0xffff);  //將高16bit與低16bit相加

cksum += (cksum>>16);             //將進製到高位的16bit與低16bit 再相加

return (ushort)(~cksum);

}例項:

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

~ffff = 00000     ->正確

tcp首部檢驗和與ip首部校驗和的計算方法相同,在程式中使用同乙個函式來計算。

需要注意的是,由於tcp首部中不包含源位址與目標位址等資訊,為了保證tcp校驗的有效性,在進行tcp校驗和的計算時,需要增加乙個tcp偽首部的校驗和,定義如下:

struct

psd_header;

然後我們將這兩個字段複製到同乙個緩衝區sendbuf中並計算tcp校驗和:

memcpy(sendbuf,&psd_header,sizeof(psd_header));

memcpy(sendbuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));

tcp_header.th_sum=checksum((ushort *)sendbuf,sizeof(psd_header)+sizeof(tcp_header));

TCP頭校驗和計算演算法詳解

當傳送ip包時,需要計算ip報頭的校驗和 1 把校驗和字段置為0 2 對ip頭部中的每16bit進行二進位制求和 3 如果和的高16bit不為0,則將和的高16bit和低16bit反覆相加,直到和的高16bit為0,從而獲得乙個16bit的值 4 將該16bit的值取反,存入校驗和字段。當接收ip包...

C 計算ICMP頭的校驗和例項

複製 如下 ushort checksum ushort buff,int nsize 程式設計客棧 如果為奇數,將最後乙個字擴充套件到雙字,再累加 www.cppcns.comnbsp if nsize nbs 將cksum的高16位與低16位相加,取反後得到校驗和 cksum cksum 16 ...

IP和TCP包頭校驗和計算方法

出處 校驗和的演算法 將資料以字為單位累加到乙個雙字中,如果資料長度為奇數,最後乙個位元組要先變成字,然後在加到原來的雙字中,最後得到的結果是乙個雙字,最後將這個雙字的高16位和低16位反覆相加,直到高16位為0,從而就獲得乙個16位的值,再將這個16位的值取反就得到校驗和的值了。在接收端接收到ip...