免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6188 | 回复: 19
打印 上一主题 下一主题

关于首部校验和, [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-29 16:40 |只看该作者 |倒序浏览
IP首部校验和,在tcp/ip1 中第3章说的,按16位取反相加,我有点疑问,比如首部的两个16位被交换了位置,那么校验和计算就是正确的了,而实际上传输不正确。

论坛徽章:
0
2 [报告]
发表于 2006-05-04 23:24 |只看该作者
谁能给我讲讲吗?

我的意思是校验和错肯定传输出错,但是对了并不一定对

比如纠错码,假如纠错一位,如果我有两位错了,那很有可能不能检查出来了
而且比如对一个20字节的串,如果20个字节都错了(包括检错码),那么这不是意味着检错的几个字节没有用了吗?

论坛徽章:
0
3 [报告]
发表于 2006-11-07 22:06 |只看该作者
up
这个问题困惑了我一年,希望能找到答案,其实我明白是我理解的问题,但实在是百思不得其解。

ip首部,20字节包括首部校验和,从A机器传到B机器,B进行校验,如果校验和不符,那么就有错误,我的问题的是,如果校验和计算相等,那么能说明首部是正确的吗?

两个包a,b,在网络中传输,先a,后b,如果传输中a发生错误,生成和b一样的数据,后来b又错误成a了,那么接受方也根本不知道错误了?

希望谁给点一下,哪儿出问题了。
还有各种校验都方法,如果校验玛和数据都错了怎么可能检验出来呢?

论坛徽章:
0
4 [报告]
发表于 2006-11-08 13:43 |只看该作者
根据校验和的算法,即使a发生错误,基本上也不可能会和b的校验和一摸一样,概率非常小,具体请看校验和算法,understand?

论坛徽章:
0
5 [报告]
发表于 2006-11-12 16:29 |只看该作者
IP 校验和,区别于 IP 纠错码。前者是常被 IP 及各建立在 IP 之上的传输层协议常常用到的一种校验和,而后者不存在。简单说来,校验和只提供对于 "对错" "真假" 之类的判断,而纠错码是一种冗余信息,可以在一定程度上恢复被损坏/篡改的信息。(参考关键字:MD5,碰撞,摘要算法,hash)

IP 校验和,在 IP 协议中使用的时候,只对 IP 头进行计算。发送方计算并放在数据报的头信息中,接收方在接收到后自然也计算一次,如果得到的结果是 0,就继续处理数据报;反之(非零的情况),则 "安静" 地丢掉数据报而不做任何处理。(参考:TCP/IP Illustrated, Volume 2)

所以,IP checksum 根本无法找到错误的字段或者字节位置,也更不可能恢复被损坏的 IP 头。至于你理解成了 "纠错码" 的原理,我想是不是翻译出的差错。原书应该是用 "ckecksum" 这个词,翻译过来是 "校验和"。

至于你说的,结果正确而实际不一定正确的情况,我想,这类似于 false positive。显示为真,而实际为假,在统计学里常遇到。但对于仅仅 20 字节的 IP 头来说,出现偏差的可能性比较小。你认为 "比如首部的两个16位被交换了位置",还是根据 4.4BSD-Lite 中 in_cksum() 的可移植版本来说明问题吧。摘自 TCP/IP Illustrated, Volume 2

unsigned short
cksum(struct ip *ip, int len)
{
    long sum = 0;  /* assume 32 bit long, 16 bit short */

    while (len > 1) {
        sum += *((unsigned short*) ip)++;
        if (sum & 0x80000000)   /* if high order bit set, fold */
            sum = (sum & 0xFFFF) + (sum >> 16);
        len -= 2;
    }

    if(len)       /* take care of left over byte */
        sum += (unsigned short) *(unsigned char *)ip;

    while(sum>>16)
        sum = (sum & 0xFFFF) + (sum >> 16);


    return ~sum;
}

/* taken from TCP/IP Illustrated Vol. 2(1995) by Gary R. Wright and W. Richard
   Stevens. Page 236 */


根据这样的实现,也基本不可能产生 "首部的两个16位被交换了位置" 而仍然 checksum 正确的情况。

论坛徽章:
0
6 [报告]
发表于 2006-11-12 17:21 |只看该作者
谢谢yuhuohu
谢谢langue

langue 你说的那个算法我看过,虽然没有仔细分析代码,但是我知道校验算法能检查出错误的概率
但是你们两个都提到了“基本上”。其实卷一中文版的110页写到
"如果你的数据很有价值,也不要相信tcp和udp得检验和,因为这些都是简单的检验和,不能检测所有可能发生的差错"
99.999999% 和100%我现在认为是本质的区别,就是说我从一个ftp上下载一个文件,是有可能出错了我还不知道?
我改天去看看这个代码。可能还要依赖传输介质的保证不会出现那么大的错误吧,

论坛徽章:
0
7 [报告]
发表于 2006-11-12 17:43 |只看该作者
是这样的。其实传输一个文件没有出现异常,但已传输的文件会出问题的情况的确会发生,只是几率非常小。通常只能由密码学来增加这个可靠性。网站上如果提供软件的下载,常常同时提供一个校验和文件,或者使用网站管理者/软件作者自己的私人密钥来得到的 “签名”,其目的之一就在于此。当然,目前在中国大陆,网站往往没有这个习惯,是意识的问题。

换言之,没有绝对的可靠性。好比前一天晚上我庆幸地说,自己一直没有忘带雨伞,也就绝不可能忘带雨伞;可是第二天我的确忘了,后来只好又买了一把伞,而这恰巧是真实的事情。

论坛徽章:
0
8 [报告]
发表于 2006-11-12 23:03 |只看该作者
我明白你的意思了
thanks a lot

论坛徽章:
0
9 [报告]
发表于 2011-11-13 22:40 |只看该作者
我现在在看TCP/IP 详解,也遇到了一样的疑问。如果某个或多个字节在传输的过程中发生交换,但并不影响校验和的结果,那就意味着,这种差错是检验不出来的啊。。。。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-07-05 06:20:00
10 [报告]
发表于 2011-11-13 23:01 |只看该作者
知其然不知其所以然

不是我耸人听闻:
所有的效验和,如果其提供的信息量少于被效验的信息,那就必定做不到100%保真.
就是只能做到"基本上".

效验码与纠错码的本质区别是二者的算法是否是可逆的.
纠错码必定采用可逆算法,插入纠错码的本质是把原码"搞长",稀释原码的信息密度,降低错误数据位对原码准确性的影响.注意:是降低,不是完全消除.
效验码要考虑到时效性和经济性,所以它只是尽可能保真,但是因为生成效验码的算法都是不可逆的,所以效验码只是形式上搞长原码,实际上没有稀释原码的信息密度.

如果有通信工程的本科生,认真学过<<信息论>>和<<通信原理>>这两门课,再肯动脑子琢磨一下,是能够体会到知其所以然的乐趣的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP