TCP协议100%可靠吗?

Posted 车小胖谈网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议100%可靠吗?相关的知识,希望对你有一定的参考价值。

数据的正确性是怎么校验的,如果数据出错了,这时候恰巧校验也出错了,但结果反而对了怎么办?

 

 


答案是否定的,TCP数据校验和(Checksum)的校验机制,无法保证传输数据100%的正确性!

 

校验和(Checksum),采用线性的数据校验机制,是一种弱校验。

 

非线性的强校验机制,MD5SHACRC32之流能否保证传输数据的100%的正确?

 

也不能!

 

有两个字符串plumless” buckeroo”,对它们采用CRC32校验,得到的校验值都是“0x4ddb0c25”。



 

这意味着,发送方发送的“plumless”,在传输的环节中变异成“buckeroo”,接收方统合CRC32的校验值,是无法检测到数据已经发生更改!

 


CRC的准确性有两个决定因素:

 

  • 待传输数据的长度

  • CRC的校验长度

 

据统计,CRC32的可靠性可以达到99.99999%,即平均1000万次数据传输,产生一次错误!

 

MD5采用128位的数据校验长度,单从这一个指标,MD5的可靠性要比CRC32要高。

 

SHA1采用160位的数据校验长度,所以SHA1MD5的可靠性更高。

 

为了进一步提高数据校验的可靠性,可以采用256位的SHA256强校验算法!

 

但是强校验算法带来2个负面的影响:

 

  • 有效载荷的空间被挤占

  • 数据校验双方计算量的增加

 

既然校验和那么不可靠,当初设计TCP/IP协议时,为何不选择强校验CRC32MD5

 

具体为何我也不知道,但是我猜测设计TCP/IP那个特定的时间周期,计算机的计算能力还比较弱。计算校验和checksum还行,但是要做更复杂的CRC32MD5运算,有点勉为其难了。

 

另外,底下数据链路层不是还有以太网的CRC32强校验可以弥补TCP校验和的不足嘛!

 

历史的车轮一眨眼的功夫,开到了21世纪。人类越来越离不开互联网,互联网越来越离不开传输数据的可靠性!

 


这里的可靠性有两层意思:

 

  • 数据可以达到目的地

  • 到达目的地的数据和原始发送数据是一摸一样的

 

关于这两点,TCP协议完成了第一点,但是第二点却无法高可靠性地完成!

 

数据到达目的地的沿途,会有N多不怀好意的机器、人,这些不怀好意的第三方,随时都有可能篡改、替换数据,然后重新计算数据校验值。无论使用弱校验、强校验,其结果都是一样的。接收方即使计算出校验值和接收到的校验值是一样的,但也难保数据没有被第三方篡改,对吗?

 

这些都是潜在的敌人!如何击退这些敌人呢?

 

只有依靠安全的手段,通信双方认证彼此的身份,然后双方协商出用于保护数据的校验密钥。校验密钥只有通信的双方知道。

 

发送方将待传输数据,计算出数据校验值,然后将校验值与校验密钥做加密计算。得到加密的校验值附在报文的尾部。

 

接收方使用校验密钥解密“加密的校验值”,得到明文的校验值。

 

将接收的数据,计算本地的校验值,如何和接收到的校验值是一摸一样的,那么就认为数据是没有被第三方篡改!

 

第三方没有校验密钥,即使篡改了数据,却无法加密明文的校验值,即使伪造一个加密的校验值,接收方也可以轻易地判断为伪造而丢弃。

 

这不是TCP的实现,而是依赖于安全传输层TLS的实现!

以上是关于TCP协议100%可靠吗?的主要内容,如果未能解决你的问题,请参考以下文章

为什么要由TCP协议负责数据传输的可靠性?

20TCP IP 网络协议基础入门--IP网际协议

可靠连接,TCP协议全解析

TCP协议如何保证数据可靠性

TCP是啥意思

可靠的传输层协议——TCP协议