QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1171|回复: 2

[b]如何计算ip检验和?[/b]

[复制链接]
发表于 2003-3-18 09:56:12 | 显示全部楼层 |阅读模式
我在学习网络编程, 书上说,检验和的计算是反码求和,
请问,如何求16bit数反码?
[code:1]
unsigned short check_sum(unsigned short *addr,int len)
{
        int nleft=len;
        int sum=0;
        unsigned short *w=addr;
        unsigned short answer=0;
        while(nleft>1)
        {
                sum+=*w++;
                nleft-=2;
        }
        if (nleft==1)
        {
                *(unsigned char *)(&answer)=*(unsigned char *)w;
                sum+=answer;
        }
        sum=(sum>>16)+(sum&0xffff);
        sum+=(sum>>16);
        answer=sum;
        return(answer);
}
[/code:1]
以上求和函数的算法的导出原理是啥?
发表于 2003-3-18 10:50:35 | 显示全部楼层
求16bit数据码,上面的算法是先用求出总和放在32bit数里,然后再把高16位和低16位相加。
sum+=(sum>>16); 是为了防止最后一次相加时有进位。

另:好像要返回return(~answer)吧?好长时间没有看书了,记不清楚了。
回复

使用道具 举报

发表于 2003-3-18 15:18:57 | 显示全部楼层
补:若数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。
适用于IPv4、ICMPv4、IGMPV4、ICMPv6、UDP和TCP校验和。参见RFC107  
(说实话,俺以前也看不懂,真多谢二位了!)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 08:34 , Processed in 0.107736 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表