免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2131 | 回复: 3
打印 上一主题 下一主题

[C] ip校验和的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-09 14:57 |只看该作者 |倒序浏览
为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接受方在计算过程中包含了发送方存在首部中的校验和。因此,如果首部在传输过程中没有发生任何差错,那么接受方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。

下面是别人代码实现:
  1. /*
  2. **************************************************************************
  3. Function: ip_sum_calc
  4. Description: Calculate the 16 bit IP sum.
  5. ***************************************************************************
  6. */
  7. typedef unsigned short u16;
  8. typedef unsigned long u32;

  9. u16 ip_sum_calc(u16 len_ip_header, u16 buff[])
  10. {
  11.         u16 word16;
  12.         u32 sum=0;
  13.         u16 i;
  14.    
  15.         // make 16 bit words out of every two adjacent 8 bit words in the packet
  16.         // and add them up
  17.         for (i=0;i<len_ip_header;i=i+2){
  18.                 word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
  19.                 sum = sum + (u32) word16;
  20.         }

  21. [color=Red]        // take only 16 bits out of the 32 bit sum and add up the carries
  22.         while (sum>>16)
  23.                 sum = (sum & 0xFFFF)+(sum >> 16);[/color]

  24.         // one's complement the result
  25.         sum = ~sum;

  26.         return ((u16) sum);
  27. }
复制代码

红色部分代码的意思:把sum的高16位取出来加?是的话,我不明白为什么要这样?

论坛徽章:
0
2 [报告]
发表于 2008-10-09 15:40 |只看该作者
按 16 位累加,有可能溢出了,拉下来加到低 16 位上。

论坛徽章:
0
3 [报告]
发表于 2008-10-09 15:46 |只看该作者
这是我以前写的一个分析:
http://bbs.chinaunix.net/viewthread.php?tid=1026359&extra=

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-10-09 15:49 |只看该作者
红色部分代码的意思:把sum的高16位取出来加?是的话,我不明白为什么要这样?

高16位折叠加到低16位,这是校验和计算的要求。
LZ可以看一下RFC1141
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP