TCP协议100%可靠吗?
Posted 车小胖谈网络
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议100%可靠吗?相关的知识,希望对你有一定的参考价值。
数据的正确性是怎么校验的,如果数据出错了,这时候恰巧校验也出错了,但结果反而对了怎么办?
答案是否定的,TCP数据校验和(Checksum)的校验机制,无法保证传输数据100%的正确性!
校验和(Checksum),采用线性的数据校验机制,是一种弱校验。
非线性的强校验机制,MD5、SHA、CRC32之流能否保证传输数据的100%的正确?
也不能!
有两个字符串“plumless” 、 “buckeroo”,对它们采用CRC32校验,得到的校验值都是“0x4ddb0c25”。
这意味着,发送方发送的“plumless”,在传输的环节中变异成“buckeroo”,接收方统合CRC32的校验值,是无法检测到数据已经发生更改!
CRC的准确性有两个决定因素:
待传输数据的长度
CRC的校验长度
据统计,CRC32的可靠性可以达到99.99999%,即平均1000万次数据传输,产生一次错误!
MD5采用128位的数据校验长度,单从这一个指标,MD5的可靠性要比CRC32要高。
SHA1采用160位的数据校验长度,所以SHA1比MD5的可靠性更高。
为了进一步提高数据校验的可靠性,可以采用256位的SHA256强校验算法!
但是强校验算法带来2个负面的影响:
有效载荷的空间被挤占
数据校验双方计算量的增加
既然校验和那么不可靠,当初设计TCP/IP协议时,为何不选择强校验CRC32、MD5?
具体为何我也不知道,但是我猜测设计TCP/IP那个特定的时间周期,计算机的计算能力还比较弱。计算校验和checksum还行,但是要做更复杂的CRC32、MD5运算,有点勉为其难了。
另外,底下数据链路层不是还有以太网的CRC32强校验可以弥补TCP校验和的不足嘛!
历史的车轮一眨眼的功夫,开到了21世纪。人类越来越离不开互联网,互联网越来越离不开传输数据的可靠性!
这里的可靠性有两层意思:
数据可以达到目的地
到达目的地的数据和原始发送数据是一摸一样的
关于这两点,TCP协议完成了第一点,但是第二点却无法高可靠性地完成!
数据到达目的地的沿途,会有N多不怀好意的机器、人,这些不怀好意的第三方,随时都有可能篡改、替换数据,然后重新计算数据校验值。无论使用弱校验、强校验,其结果都是一样的。接收方即使计算出校验值和接收到的校验值是一样的,但也难保数据没有被第三方篡改,对吗?
这些都是潜在的敌人!如何击退这些敌人呢?
只有依靠安全的手段,通信双方认证彼此的身份,然后双方协商出用于保护数据的校验密钥。校验密钥只有通信的双方知道。
发送方将待传输数据,计算出数据校验值,然后将校验值与校验密钥做加密计算。得到加密的校验值附在报文的尾部。
接收方使用校验密钥解密“加密的校验值”,得到明文的校验值。
将接收的数据,计算本地的校验值,如何和接收到的校验值是一摸一样的,那么就认为数据是没有被第三方篡改!
第三方没有校验密钥,即使篡改了数据,却无法加密明文的校验值,即使伪造一个加密的校验值,接收方也可以轻易地判断为伪造而丢弃。
这不是TCP的实现,而是依赖于安全传输层TLS的实现!
以上是关于TCP协议100%可靠吗?的主要内容,如果未能解决你的问题,请参考以下文章