IP效验和的计算不太明白。

sboom 2004-04-11 04:26:03
IP校验和的计算方法是:首先将IP首部的校验和字段设为0(IP_HEADER.checksum=0),然后计算整个IP首部(包括选项)的二进制反码的和。

USHORT checksum(USHORT *buffer, int size)
 {
  unsigned long cksum=0;
  while(size >1)
    {
     cksum+=*buffer++;
     size -=sizeof(USHORT);
    }
  if(size ) cksum += *(UCHAR*)buffer;
  cksum = (cksum >> 16) + (cksum & 0xffff);//这两句是干什么的??
  cksum += (cksum >>16); //这两句是干什么的??
  return (USHORT)(~cksum);
 }
...全文
72 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangle11111 2004-04-11
  • 打赏
  • 举报
回复
不是溢出低16位吧。。而是所求的和(16位)可能有有进位,,,这样16位就不够了,,当然要把原来的和进位后的相加了。
txcn 2004-04-11
  • 打赏
  • 举报
回复
cksum = (cksum >> 16) + (cksum & 0xffff);//这两句是干什么的??
long cksum=0;所以cksum是32位的,而IP头中的Checksum是16 位的,所以右移16位,然后和低位求和,注意此时仍有可能溢出低16位
  cksum += (cksum >>16); //这两句是干什么的??
再将溢出部分右移求和,此时不会在溢出。

该算法的前因后果具体可参考rfc1071,rfc1141,rfc1624

18,358

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧