網路資料報效驗和(checksum)的計算

2021-04-20 18:03:15 字數 2182 閱讀 2744

在網路傳送的資料報為了保證傳送正確都含有效驗字段,ip、arp、tcp等每

個資料段都有自己的效驗和。

效驗的計算並不複雜。把相應資料報段的所有資料看成乙個位元組陣列

,把他們分成16bit一組

計算其和:

[ab]

[cd]

[e0]

--------

[xy]

計算採用迴圈進製,最高位的進製加到最低位,

如果計算出的[xy]所有位都為1(即為1111 1111)則效驗通過。

如果[cd]為效驗和的話,已經填好其他各個位元組,如何計算出[cd]

(checksum)的值呢?我們首先用0填充[cd],然後算出[xy],則正確的[cd]應該為計

算出的[xy]按位求反的結果。這樣才能保證整個資料報段通過效驗。

byte 0/1:    00   01        0001      0100

byte 2/3:    f2   03        f203      03f2

byte 4/5:    f4   f5        f4f5      f5f4

byte 6/7:    f6   f7        f6f7      f7f6

---  ---       -----     -----

sum1:       2dc  1f0       2ddf0     1f2dc

dc   f0        ddf0      f2dc

carrys:       1    2           2         1

--   --        ----      ----

sum2:        dd   f2        ddf2      f2dd

final swap:  dd   f2        ddf2      ddf2

------------------------------

byte 0/1/2/3:  0001f203     010003f2       03f20100

byte 4/5/6/7:  f4f5f6f7     f5f4f7f6       f7f6f5f4

--------     --------       --------

sum1:         0f4f7e8fa    0f6f4fbe8      0fbe8f6f4

carries:              0            0              0

top half:          f4f7         f6f4           fbe8

bottom half:       e8fa         fbe8           f6f4

-----        -----          -----

sum2:             1ddf1        1f2dc          1f2dc

ddf1         f2dc           f2dc

carrys:               1            1              1

----         ----           ----

sum3:              ddf2         f2dd           f2dd

final swap:        ddf2         ddf2           ddf2

可以看到先求32位的checksum,然後將高8位與低八位相加,最終求出的

checksum是相同的。

給出一段c++實現的演算法:

in 6

/*  add left-over byte, if any */

if( count > 0 )

sum += * (unsigned char *) addr;

/*  fold 32-bit sum to 16 bits */

while (sum>>16)

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

checksum = ~sum;

}參考文獻:rfc1071 **:http://www.faqs.org/rfcs/rfc1071.html

本文**

網路資料報

我們知道網路是通過分組交換進行通訊,是將使用者傳送的資訊資料劃分成一定的長度,每個部分叫做乙個分組。每個分組的前面有乙個分組頭,用以指明該分組發往何位址,然後由 交換機根據每個分組的位址標誌,將他們 至目的地,這一過程稱為 分組交換 osi open system interconnection,開...

資料報網路

主機到主機通訊就是所謂的網路服務模型。有兩類 1 面向連線服務 傳送方向接收方傳送控制分組進行握手,握手提醒傳送方傳送資料分組前,彼此通過傳送控制分組進行握手,握手過程結束,兩個端系統之間會建立連線,可以不再收發資料分組,資料傳輸完成後要拆除這種連線,也就是所謂的揮手。2 面向無連線服務 直接傳送分...

抓取網路資料報

當使用者在區域網內傳遞資料時,處於同一網段的所有計算機的網絡卡都會收到這些資料,儘管它不是傳遞資料的目的地。利用這一特點,我們就可以截獲區域網中傳遞的資料。為了能夠獲取通過網絡卡上的資料,需要建立原始套接字。使用者可以將socket函式的第二個引數設定為sock raw來建立原始套接字。例如 m s...