網路第二課(3)---ip協議中的校驗和。
阿新 • • 發佈:2019-01-07
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;//取反