1. 程式人生 > >網路第二課(3)---ip協議中的校驗和。

網路第二課(3)---ip協議中的校驗和。

check_sum計算:

1.校驗和置0;

2.ip頭部中(20位元組),以兩個位元組為一組(short型),相加。

3.判斷這個和是否超出了short型 的範圍,如果超出了把超出部分與,下面的16位數相加;

4.最後對這個結果取反。

#include <stdio.h>

unsigned short check_sum(unsigned char *data, int len);
int main()
{
//0xb88f
unsigned char data[1024] = {//下面這段資料是我們通過抓包程式,抓下來的(ip協議頭)
0x45, 0x00,
0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0x00, 0x00, 0xc0, 0xa8, 0x00, 0x0f, 0xc0, 0xa8,
0x00, 0xde
};unsigned short sum = check_sum(data, 20);//首地址與長度。
printf("sum is %x\n", sum);
}


unsigned short check_sum(unsigned char *data, int len)
{
unsigned short sum = 0;
unsigned int tmp = 0;
int i= 0;
for(i=0;i<len-1;i=i+2)//求和大笑
{
tmp = tmp + ((data[i]<<8) + (data[i+1]));
}
while(tmp > 0x10000)//檢視是否超出short型資料的範圍。 大笑
{
tmp = ((tmp & 0xffff0000)>>16) + (tmp & 0xffff);
}
return 0xffff-tmp;//取反大笑
}