- 论坛徽章:
- 0
|
现有程序更新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] |
|