首页 > 代码库 > IP头结构中的checksum

IP头结构中的checksum

转载请注明原文链接,http://www.cnblogs.com/flyingcloude/p/6992326.html

对于IP头结构中checksum,一开始以为是通过CRC计算出来的,在TCP/IP协议中没有谈到有关这方面的知识。查资料之后,发现在RFC791里有说明。

技术分享

 

计算45 00 00 1c 00 0b 00 00 80 01 (b7 53这个不要) c0 a8 01 17 c0 a8 01 1b

 

#include <stdio.h>

/*
 *函数名称:check_sum
 *    传入参数:unsigned char *ptr,指向需要计算checksum的unsigned char数组;
 *              int size,数组的长度,传入的数组的长度必须为偶数
 *    返回:返回一个unsigned short的值 
 */
unsigned short check_sum(unsigned char *ptr, int size)
{
    if(size % 2 != 0)
    {
        return 0;
    }
    int cksum = 0;
    
    int index = 0;
    while(index < size)
    {        
        cksum += *(ptr + index + 1);
        cksum += *(ptr + index) << 8; 
        
        index += 2;
    }
     
    while(cksum > 0xffff)
    {
        cksum = (cksum >> 16) + (cksum & 0xffff);
    }
    return ~cksum;
}


int main()
{
    unsigned char ptr[] = {0x45, 0x00, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x00, 0x80, 0x01,
                           0xc0, 0xa8, 0x01, 0x17, 0xc0, 0xa8, 0x01, 0x1b};
    
    printf("%x\n", check_sum(ptr, 18));
    
    system("pause");
    return 0;
}

 

计算得到b753

 
 

 

 

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992326.html

 

IP头结构中的checksum