返回信息流这个函数是计算IP头校验和
unsigned short /* this function generates header checksums */
csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
代码的意思明白,但不清楚为什么这么处理,为什么可以这么处理?
这是一条镜像帖。来源:北邮人论坛 / cpp / #17594同步于 2008/12/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【计算IP校验和】反码求和 与 和的反码
bupter007
2008/12/16镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
这两行是sum对2^16-1取模
具体为什么研究一下反码和源码的关系吧
这个函数是计算IP头校验和
unsigned short /* this function generates header checksums */
csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
//每32bit相加
sum = (sum >> 16) + (sum & 0xffff); //fold,也就是将32bit的高低部分折叠相加,
sum += (sum >> 16); // 上一步相加时,可能出现进位,继续折叠。
return ~sum; //取反码
}
这套算法是标准的IP头部checksum计算流程
至于为什么这么计算
应该是为了接收端检验checksum时
连校验和在内的头部加起来结果正好是FFFF。
跟ip协议的校验和计算方式有关。具体为什么那样定义我也不明白。
【 在 ericyosho 的大作中提到: 】
: 小问,和反码有啥关系,
: 反码不是在搞 有符号数 的时候才有意义么?
: 这里都没出现 有符号数。
: ...................