- 论坛徽章:
- 0
|
考虑机器是arm等大头机器的情形:
原check值 0xfeff
0xfeff+0x0100=0xffff+(0xffff>=0xffff)=0xffff+1=0x10000=0x0000经过计算后check为0x0000, why?
分析,可能有错,请大家指正
设x为除去check之外其它部分的检验和,则~x为检验和
x+~x=0xffff
现在有x+0xfeff=0xffff,则x=0x0100
但是根据ip协议,不可能没有进位就能计算出x=0x0100(因为版本是4,则第一个16位数就>0x4000)
则有0x0100=0x00ff+1
即32位的和值是0x100ff,现在ttl--,则0x100ff-1=0xffff,即x=0xffff
所以~x=0x0000
再考虑x86等小头机器
原check值 0xfeff (网络序,注意计算时的不同)
0xfffe+0x0001=0xffff+(0xffff>=0xffff)=0xffff+1=0x10000=0x0000经过计算后check为0x0000
这是一个有趣的现象,无论大头和小头,都能不经过转换就能计算出相同的结果,不知道是否有理论支持???
arm:0xffff+0x0100=0x100ff=0x0100
x86:0xffff+0x0001=0x10000=0x0001,存入check时就成了0x0100(网络序)
类似的例子可以举很多 |
|