免费注册 查看新帖 |

Chinaunix

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

关于更新的IP头checksum问题,请教? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-14 19:55 |只看该作者 |倒序浏览
现有程序更新IP头部分字段,需重新计算IP头校验和。根据RFC1624 公式三,有如下的计算:
          HC  - old checksum in header
          HC' - new checksum in header
          C   - one's complement sum of old header
          m   - old value of a 16-bit field
          m'  - new value of a 16-bit field
         
          HC' = ~(C + (-m) + m')    --    [Eqn. 3]
              = ~(~HC + ~m + m')
   
    我的问题是根据上述公式计算新校验和,是否也应该考虑进位问题。是否必须考虑进位值才能够得到正确的新校验和。比如下面的例子:

    HC = 0x0001   m = 0xfffd   m' = 0x0003
    (1)依照普通的方式计算,可得 HC' = ~(~HC - m + m')                                                                                             
                                                     = ~(0xfffe - 0xfffd + 0x0003)                                       
                                                    = ~(0x0001 + 0x0003)
                                                   =  ~(0x0004) = 0xfffb

    (2)依照公式3          HC' = ~(~HC + ~m + m')
                                      = ~(0xfffe +   0x0002 + 0x0003)
                                      = ~(0x10000 + 0x0003)
                                      = ~(0x10003)
                                转换为  ~(0x0004) = 0xfffb(考虑到进位)
    可见,依照传统方式以及公式3可以得到相同的值,这是否可以说明在这样的计算中必须考虑进位问题?
   
   
    另外,公式3中,如果C + (-m) < 0, 是否应该作特殊处理,方可使用公式3
    (例如,将C-1+0x10000,再去减m),如果不特殊处理,是否会产生错误。见下例:
    C = ~HC = 0xfffd , m = 0xfffe, m' = 0x0003  (变量均为无符号短整数(u_short)-1 = 0xffff)
    HC' = ~(C + (-m) + m') = ~(0xfffd - 0xfffe + 0x0003)
          = ~(0xffff + 0x0003) = ~(0x10002)  
   0xfffc(考虑高位进位0x10002 转换为 0x0003)
    (注, 实际上我在vc中编译下面的代码:

    unsigned short j = 0xfffd - 0xfffe + 0x0003;
    printf("j = [0x%x]"\n, j);
   
      打印结果是 0x0002, 没有提示有高位截断。HC'真实结果应该是(0x0002) = 0xfffd,那么为什么这种情况下就 不需要考虑高位置为问题了呢?否则计算结果就会出错。
    )
   
    HC' = ~(~HC + ~m + m') = ~(0xfffd + 0x0001 + 0x0003)
                                            = ~(0x10001) 转换为 ~(0x0002)
                                            = 0xfffd (考虑高位进位)
   
        
    RFC1624中没有明确指出,是否考虑进位或者为负数的问题。如果考虑更极端的例子C + (-m) + m'< 0 会如何???
   
    还请各位兄弟指点。[/code]

论坛徽章:
0
2 [报告]
发表于 2005-03-15 08:28 |只看该作者

关于更新的IP头checksum问题,请教?

我想作路由器协议栈 NAT转换以及 各种CPU上的TCPIP协议栈的朋友都碰到过的问题吧,哪位自己写过或者研究过协议栈的兄弟出来讲讲!

论坛徽章:
0
3 [报告]
发表于 2005-03-15 11:50 |只看该作者

关于更新的IP头checksum问题,请教?

第一个问题就这样沉下去了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP