在網路傳送的資料報為了保證傳送正確都含有效驗字段,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...