IP包的校驗和

2021-05-10 19:29:43 字數 2835 閱讀 7302

ip頭結構

ipv4首部一般是20位元組長。在乙太網幀中,ipv4包首部緊跟著乙太網幀首部,同時乙太網幀首部中的協議型別值設定為0800

16 。 ipv4提供不同,大部分是很少用的選項,使得ipv4包首部最長可擴充套件到60位元組(總是4個位元組4個位元組的擴充套件) 04

8121619

2431

版本首部長度

服務型別

長度認證

標誌段偏移量

ttl協議

校驗和源ip位址

目的ip位址

選項 ...

版本:4位,指定ip協議的版本號。

包頭長度(ihl):4位,ip協議包頭的長度,指明ipv4協議包頭長度的位元組數包含多少個32位。由於ipv4的包頭可能包含可變數量的可選 項,所以這個字段可以用來確定ipv4資料報中資料部分的偏移位置。ipv4包頭的最小長度是20個位元組,因此ihl這個欄位的最小值用十進位制表示就是5 (5x4 = 20位元組)。就是說,它表示的是包頭的總位元組數是4位元組的倍數。

服務型別:定義ip協議包的處理方法,它包含如下子欄位

過程字段:3位,設定了資料報的重要性,取值越大資料越重要,取值範圍為:0(正常)~ 7(網路控制)

延遲字段:1位,取值:0(正常)、1(期特低的延遲)

流量字段:1位,取值:0(正常)、1(期特高的流量)

可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)

成本字段:1位,取值:0(正常)、1(期特最小成本)

未使用:1位

長度:ip包的總長

認證:標誌:是乙個3位的控制字段,包含:

保留位:1位

不分段位:1位,取值:0(允許資料報分段)、1(資料報不能分段)

ttl:表示資料報在網路上生存多久,每通過乙個路由器該值減一,為0時將被路由器丟棄。

協議:8位,這個字段定義了ip資料報的資料部分使用的協議型別。常用的協議及其十進位制數值包括icmp(1)、tcp(6)、udp(17)。

校驗和:16位,是ipv4資料報包頭的校驗和。

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));

IP的頭部校驗和

ip的頭部校驗和是用來 檢測ip頭部的完整性和正確性 傳送方在資料封裝過程中會通過一套 奇偶校驗和演算法對ip頭部進行計算,之後得出乙個校驗值,將其置入ip頭部中 當接收方收到此資料報時,又會通過校驗算 法對ip頭部 包括傳送方的校驗和 進行計算 此時將得出的校驗和與傳送方的校驗值對比,如果發現不是...

IP校驗和詳解

校驗和演算法 之前一直只知道ip校驗和演算法反碼求和相關的,但具體細節不清楚,今天了解了下。ip校驗和主要是用來保證資料 ip包頭 的完整性的.它用的演算法非常簡單,就是反碼求和校驗.需要注意的是反碼求和又叫1的補碼 one s complement 而2的補碼就是我們通常說的補碼求和了.校驗演算法...

IP校驗和詳解

原文見my blog url align center color magenta font 宋體 size 15pt ip size font font 宋體 size 15pt 校驗和詳解 size font color align align left font 宋體 size 14pt 一 ...