免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

数据包校验和的疑问 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-11-19 11:24 |只看该作者
这段代码好像有问题,但又不太可能,疑惑

static inline
int ip_decrease_ttl(struct iphdr *iph)
{
    u32 check = iph->check;//u32 check=ntohs(iph->check);
    check += __constant_htons(0x0100);//check+=0x0100;
    iph->check = check + (check>=0xFFFF);//iph->check=htons(check+(check>0xffff));
    return --iph->ttl;
}

论坛徽章:
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
32 [报告]
发表于 2008-11-19 14:28 |只看该作者
原帖由 qtdszws 于 2008-11-19 11:24 发表
这段代码好像有问题,但又不太可能,疑惑

static inline
int ip_decrease_ttl(struct iphdr *iph)
{
    u32 check = iph->check;//u32 check=ntohs(iph->check);
    check += __constant_htons(0x0100 ...


这个地方我觉得就是防止校验和计算出来为0xFFFF的情形吧,如果结果时0xFFFF,则会变为0xFFFF+(0xFFFF>=0xFFFF) = 0xFFFF + 1 = 0x0000(取低16位)

论坛徽章:
0
33 [报告]
发表于 2008-11-19 17:39 |只看该作者
考虑机器是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(网络序)

类似的例子可以举很多

论坛徽章:
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
34 [报告]
发表于 2008-11-19 18:27 |只看该作者
多谢qtdszws 兄

论坛徽章:
0
35 [报告]
发表于 2008-11-20 09:07 |只看该作者
不客气,你也提醒了我,互相学习

论坛徽章:
0
36 [报告]
发表于 2008-11-26 08:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP