忘记密码   免费注册 查看新帖 | 论坛精华区
ChinaUnix.net
  平台论坛 博客 微博 读书 人才 精华 文库 自测 | 频道操作系统 开发 数据库 存储 服务器 网络 IT新闻 Linux 下载 Power用户组
最近访问板块 发新帖
查看: 4925 | 回复: 35

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

To be 千里马!

Rank: 8Rank: 8

帖子
14516
主题
366
精华
21
可用积分
58752
专家积分
79
在线时间
5761 小时
注册时间
2007-03-09
最后登录
2012-02-09
论坛徽章:
0
发表于 2008-11-17 16:13:28 |显示全部楼层
之前讨论的时候觉得,数据包的校验和可以为0x0000, 但是不会为0xFFFF.
而今天再看《Linux网络体系结构》第25章,在介绍UDP的checksum的时候,有这样一段内容:
If the computation results in the checksum zero, the all-1-bit value is transmitted instead, which is equivalent in ones-complement arithmetic. A zero in the checksum field means that the sender has not computed a checksum.


上面的意思感觉应该是如果计算出的校验和为0x0000的话,则发送的时候采用1的补码,发送0xFFFF作为替代。校验和域为0的情况,代表发送方没有计算校验和。

这个意思应该是就算你计算出实际的校验和为0x0000,但数据包中校验和域应该填写的是0xFFFF. 有点糊涂了?
----------
欢迎光临Godbach的博客交流技术问题:
Godbach's Blog
---------
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
To be 千里马!

Rank: 8Rank: 8

帖子
14516
主题
366
精华
21
可用积分
58752
专家积分
79
在线时间
5761 小时
注册时间
2007-03-09
最后登录
2012-02-09
论坛徽章:
0
发表于 2008-11-17 17:49:24 |显示全部楼层
UP一下
----------
欢迎光临Godbach的博客交流技术问题:
Godbach's Blog
---------
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
言多必失

Rank: 8Rank: 8

帖子
5585
主题
214
精华
38
可用积分
18873
专家积分
80
在线时间
2940 小时
注册时间
2007-05-11
最后登录
2012-02-10
论坛徽章:
0
发表于 2008-11-17 18:11:41 |显示全部楼层

回复 #1 Godbach 的帖子

应该是这样的:如果校验和计算结构为0的话,那么会转而传输比特位均为1的一个值:这等价于与1的补码运算。校验和字段如果为0,则表示发送方没有计算检验和。
Nothing is impossible!

Nginx源码分析交流群:120388348
微博地址:http://weibo.com/u/1847971765
To be 千里马!

Rank: 8Rank: 8

帖子
14516
主题
366
精华
21
可用积分
58752
专家积分
79
在线时间
5761 小时
注册时间
2007-03-09
最后登录
2012-02-09
论坛徽章:
0
发表于 2008-11-17 18:50:57 |显示全部楼层
原帖由 dreamice 于 2008-11-17 18:11 发表
应该是这样的:如果校验和计算结构为0的话,那么会转而传输比特位均为1的一个值:这等价于与1的补码运算。校验和字段如果为0,则表示发送方没有计算检验和。


这个结果0本身应该就是取1的补码的结果了啊,为什么还要转换。难道是RFC的规定?
----------
欢迎光临Godbach的博客交流技术问题:
Godbach's Blog
---------
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
言多必失

Rank: 8Rank: 8

帖子
5585
主题
214
精华
38
可用积分
18873
专家积分
80
在线时间
2940 小时
注册时间
2007-05-11
最后登录
2012-02-10
论坛徽章:
0
发表于 2008-11-17 20:13:44 |显示全部楼层
原帖由 Godbach 于 2008-11-17 18:50 发表


这个结果0本身应该就是取1的补码的结果了啊,为什么还要转换。难道是RFC的规定?


没有看RFC,不知道是不是规定,猜测应该是。
Nothing is impossible!

Nginx源码分析交流群:120388348
微博地址:http://weibo.com/u/1847971765

Rank: 1

帖子
300
主题
8
精华
1
可用积分
450
专家积分
0
在线时间
199 小时
注册时间
2006-04-20
最后登录
2009-10-06
论坛徽章:
0
发表于 2008-11-17 20:17:12 |显示全部楼层
原帖由 Godbach 于 2008-11-17 18:50 发表


这个结果0本身应该就是取1的补码的结果了啊,为什么还要转换。难道是RFC的规定?


因为如果传输校验的值如果为0的话,就代表发送方没有做校验----这是一种约定,所以如果计算出来的CRC为0的话,就用其补码来
代替。
To be 千里马!

Rank: 8Rank: 8

帖子
14516
主题
366
精华
21
可用积分
58752
专家积分
79
在线时间
5761 小时
注册时间
2007-03-09
最后登录
2012-02-09
论坛徽章:
0
发表于 2008-11-17 20:28:23 |显示全部楼层
原帖由 Au_Hank 于 2008-11-17 20:17 发表


因为如果传输校验的值如果为0的话,就代表发送方没有做校验----这是一种约定,所以如果计算出来的CRC为0的话,就用其补码来
代替。


哦,那就意味着本来在计算校验和的时候就是用了1的补码运算,但是如果这样计算出来的结果为0x0000的话,又要做一下特殊处理,将其作为0xFFFF发送。

因此,当我们接收到一个数据包的校验和为0xFFFF的时候,他实际上应该是0x0000. 对吧?
----------
欢迎光临Godbach的博客交流技术问题:
Godbach's Blog
---------
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
To be 千里马!

Rank: 8Rank: 8

帖子
14516
主题
366
精华
21
可用积分
58752
专家积分
79
在线时间
5761 小时
注册时间
2007-03-09
最后登录
2012-02-09
论坛徽章:
0
发表于 2008-11-17 20:30:34 |显示全部楼层
但是看内核代码中并没有明确的看到当计算校验和为0x0000的时候,作为0xFFFF使用。各位能找到具体的代码吗?
----------
欢迎光临Godbach的博客交流技术问题:
Godbach's Blog
---------
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!

Rank: 1

帖子
300
主题
8
精华
1
可用积分
450
专家积分
0
在线时间
199 小时
注册时间
2006-04-20
最后登录
2009-10-06
论坛徽章:
0
发表于 2008-11-18 06:14:13 |显示全部楼层
原帖由 Godbach 于 2008-11-17 20:30 发表
但是看内核代码中并没有明确的看到当计算校验和为0x0000的时候,作为0xFFFF使用。各位能找到具体的代码吗?

应该是在include/asm-x86/checksum_32.h的汇编代码里面,偶现在看不懂汇编了。

Rank: 3Rank: 3

帖子
1849
主题
235
精华
9
可用积分
2690
专家积分
89
在线时间
267 小时
注册时间
2003-08-17
最后登录
2011-11-08
论坛徽章:
0
发表于 2008-11-18 09:34:22 |显示全部楼层
参考 v2.4.0
static int udp_getfrag(const void *p, char * to, unsigned int offset, unsigned int fraglen)
{
...
                if (ufh->uh.check == 0)
                        ufh->uh.check = -1;
...
}
Good better best,
never let it rest,
till good is better,
and better best.
您需要登录后才可以回帖 登录 | 注册

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP