Chinaunix

标题: 关于更新的IP头checksum问题,请教? [打印本页]

作者: iwhy    时间: 2005-03-14 19:55
标题: 关于更新的IP头checksum问题,请教?
现有程序更新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]
作者: iwhy    时间: 2005-03-15 08:28
标题: 关于更新的IP头checksum问题,请教?
我想作路由器协议栈 NAT转换以及 各种CPU上的TCPIP协议栈的朋友都碰到过的问题吧,哪位自己写过或者研究过协议栈的兄弟出来讲讲!
作者: iwhy    时间: 2005-03-15 11:50
标题: 关于更新的IP头checksum问题,请教?
第一个问题就这样沉下去了?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2