Linux.ChinaUnix.net
ChinaUnix | Linux首页 | 新闻 | 博客 | 文章 | 专栏 | 新手 | 方案 | 图书 | 下载 | 人才 | 手册 | wiki | 搜索     
Linux论坛
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索



数据包校验和的疑问
首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
版主 Godbach (To be 千里马!)
版主-大法师


CU奥运火炬传递手2008
CU编号: 534931
注册:2007-3-9
最后登录: 2009-07-05
帖子:8560
精华:12

可用积分:22755 (巨富豪门)
信誉积分:112
专家积分:114 (本版:10)
空间积分:2
推广积分:17

状态:...保密...

[个人空间] [短信] [博客]


1楼 发表于 2008-11-17 16:13 
之前讨论的时候觉得,数据包的校验和可以为0x0000, 但是不会为0xFFFF.
而今天再看《Linux网络体系结构》第25章,在介绍UDP的checksum的时候,有这样一段内容:

QUOTE:
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. 有点糊涂了?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
----------------------------------
欢迎光临Godbach的博客交流技术问题:
http://blog.chinaunix.net/u/33048/
----------------------------------
版主 Godbach (To be 千里马!)
版主-大法师


CU奥运火炬传递手2008
CU编号: 534931
注册:2007-3-9
最后登录: 2009-07-05
帖子:8560
精华:12

可用积分:22755 (巨富豪门)
信誉积分:112
专家积分:114 (本版:10)
空间积分:2
推广积分:17

状态:...保密...

[个人空间] [短信] [博客]


2楼 发表于 2008-11-17 17:49 
UP一下



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
----------------------------------
欢迎光临Godbach的博客交流技术问题:
http://blog.chinaunix.net/u/33048/
----------------------------------
版主 dreamice
广告杀手-精灵使
言多必失



CU编号: 562632
注册:2007-5-11
最后登录: 2009-07-05
帖子:3895
精华:37

可用积分:6236 (富足长乐)
信誉积分:110
专家积分:70 (本版:0)
空间积分:0
推广积分:31

状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2008-11-17 18:11 
回复 #1 Godbach 的帖子

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



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Nothing is impossible!
版主 Godbach (To be 千里马!)
版主-大法师


CU奥运火炬传递手2008
CU编号: 534931
注册:2007-3-9
最后登录: 2009-07-05
帖子:8560
精华:12

可用积分:22755 (巨富豪门)
信誉积分:112
专家积分:114 (本版:10)
空间积分:2
推广积分:17

状态:...保密...

[个人空间] [短信] [博客]


4楼 发表于 2008-11-17 18:50 


QUOTE:
原帖由 dreamice 于 2008-11-17 18:11 发表
应该是这样的:如果校验和计算结构为0的话,那么会转而传输比特位均为1的一个值:这等价于与1的补码运算。校验和字段如果为0,则表示发送方没有计算检验和。

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



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
----------------------------------
欢迎光临Godbach的博客交流技术问题:
http://blog.chinaunix.net/u/33048/
----------------------------------
版主 dreamice
广告杀手-精灵使
言多必失



CU编号: 562632
注册:2007-5-11
最后登录: 2009-07-05
帖子:3895
精华:37

可用积分:6236 (富足长乐)
信誉积分:110
专家积分:70 (本版:0)
空间积分:0
推广积分:31

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-11-17 20:13 


QUOTE:
原帖由 Godbach 于 2008-11-17 18:50 发表


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

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



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Nothing is impossible!
Au_Hank
精灵王




CU编号: 406196
注册:2006-4-20
最后登录: 2009-02-13
帖子:307
精华:1

可用积分:450 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2008-11-17 20:17 


QUOTE:
原帖由 Godbach 于 2008-11-17 18:50 发表


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

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



您对本贴的看法:鲜花[0] 臭蛋[0]
版主 Godbach (To be 千里马!)
版主-大法师


CU奥运火炬传递手2008
CU编号: 534931
注册:2007-3-9
最后登录: 2009-07-05
帖子:8560
精华:12

可用积分:22755 (巨富豪门)
信誉积分:112
专家积分:114 (本版:10)
空间积分:2
推广积分:17

状态:...保密...

[个人空间] [短信] [博客]


7楼 发表于 2008-11-17 20:28 


QUOTE:
原帖由 Au_Hank 于 2008-11-17 20:17 发表


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

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

因此,当我们接收到一个数据包的校验和为0xFFFF的时候,他实际上应该是0x0000. 对吧?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
----------------------------------
欢迎光临Godbach的博客交流技术问题:
http://blog.chinaunix.net/u/33048/
----------------------------------
版主 Godbach (To be 千里马!)
版主-大法师


CU奥运火炬传递手2008
CU编号: 534931
注册:2007-3-9
最后登录: 2009-07-05
帖子:8560
精华:12

可用积分:22755 (巨富豪门)
信誉积分:112
专家积分:114 (本版:10)
空间积分:2
推广积分:17

状态:...保密...

[个人空间] [短信] [博客]


8楼 发表于 2008-11-17 20:30 
但是看内核代码中并没有明确的看到当计算校验和为0x0000的时候,作为0xFFFF使用。各位能找到具体的代码吗?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
----------------------------------
欢迎光临Godbach的博客交流技术问题:
http://blog.chinaunix.net/u/33048/
----------------------------------
Au_Hank
精灵王




CU编号: 406196
注册:2006-4-20
最后登录: 2009-02-13
帖子:307
精华:1

可用积分:450 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-11-18 06:14 


QUOTE:
原帖由 Godbach 于 2008-11-17 20:30 发表
但是看内核代码中并没有明确的看到当计算校验和为0x0000的时候,作为0xFFFF使用。各位能找到具体的代码吗?

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



您对本贴的看法:鲜花[0] 臭蛋[0]
qtdszws (异次元空间)
天使



CU编号: 85595
注册:2003-8-17
最后登录: 2009-07-03
帖子:1241
精华:5

可用积分:1578 (家境小康)
信誉积分:100
专家积分:89 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-11-18 09:34 
参考 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;
...
}



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Good better best,
never let it rest,
till good is better,
and better best.

首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »

 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - Linux时代 - Archiver - WAP - TOP

Processed in 0.094353 second(s), 5 queries , Gzip enabled