TCP为什么是可靠的(怎么保证有效传输的)?

这篇具有很好参考价值的文章主要介绍了TCP为什么是可靠的(怎么保证有效传输的)?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TCP为什么是可靠性的?

可靠传输就是通过TCP连接传送的数据是没有差错、不会丢失、不重复并且按序到达的。TCP是通过序列号、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制一起保证TCP传输的可靠性的。

总结:

TCP保证可靠性一般有以下几种方法:

  1. 检验和:在数据传输过程中,吧传输的数据当作一个16位整数。吧所有的数据加起来,最前面的进位补到最后一位,然后取反得到校验和。发送方和接收方验证校验和是否相同。不相同则数据传输有误,相同也可能有问题。
  2. 确认应答:ACK和序列号(一应一答)机制保证数据的完整性(三次握手于四次挥手过程中通过比对Seq和ACK来实现)
  3. 超时重传:发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送(也就是发送数据后,长时间没收到回应,会把数据再发一次。)
  4. 连接管理:三次握手,四次挥手
  5. 最大消息长度:理想的情况下是该长度的数据刚好不被网络层分块。
  6. 拥塞控制:控制传输上流量(发送数据时开始是慢启动,先发送一点点数据去探测网络拥塞不拥塞,如果不拥塞了,则大量的发送数据。如果突然拥塞了,则又很慢的发送数据。这样是为了尽可能快的发送数据,避免网络拥塞造成一系列问题)
  7. 流量控制:TCP利用滑动窗口实现流量控制,流量控制是为了控制发送方的发送速率,保证接收方来的及时接收

原理解析

一、检验和

检验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP 段,重新发送。

TCP在计算检验和时,会在TCP首部加上一个12字节的伪首部。

检验和总共计算3 部分:

  • TCP首部
  • TCP数据
  • TCP伪首部;

TCP为什么是可靠的(怎么保证有效传输的)?

计算方式如下:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。

  • 发送方:在发送数据之前计算检验和,并进行校验和的填充。
  • 接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。
    TCP为什么是可靠的(怎么保证有效传输的)?

注意:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。

二、序列号/确认应答

序列号/确认应答机制过程如下:

  • 发送端每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收端对分配的这个序列号进行确认,如果发送端在一个特定时间内没有收到接收端的确认,则发送端会重传此数据包。
  • 接收端利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,接收端一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。

上述过程中,只要发送端有一个包传输,接收端没有回应确认包(ACK包),发送端就会认为数据丢包,然后进行重发。或者接收端的应答包,发送端没有收到也会重发数据。这就可以保证数据的完整性。

TCP为什么是可靠的(怎么保证有效传输的)?

另外:序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一

三、超时重传

首先,TCP可靠性中最重要的一个机制是处理数据超时和重传。正是因为有这样的重传机制作为保障,在我们传输过程发生错误的时候,可以通过重传机制进行收尾。

超时重传原理

TCP协议要求在发送端每发送一个报文段,就启动一个定时器并等待确认信息;接收端成功接收新数据后返回确认信息。若在定时器超时前数据未能被确认,TCP就认为报文段中的数据已丢失或损坏,需要对报文段中的数据重新组织和重传。

导致重传的情况

首先,发送方没有接收到响应的ACK报文原因可能有两点:

  • 数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。
  • 接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。

那么发生上述情况,我们的发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。

  • 如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。
  • 如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

我们知道,一来一回的时间总是差不多的,都会有一个类似于平均值的概念。比如发送一个包到接
收端收到这个包一共是0.5s,然后接收端回发一个确认包给发送端也要0.5s,这样的两个时间就是
RTT(往返时间)。然后可能由于网络原因的问题,时间会有偏差,称为抖动(方差)。

所以,超时重传的时间大概是比往返时间+抖动值还要稍大的时间

注意:在重发的过程中,假如一个包经过多次的重发也没有收到对端的确认包,那么就会认为接收端异常,强制关闭连接。并且通知应用通信异常强行终止。

四、连接管理

连接管理就是三次握手与四次挥手的过程,过程如下图所示:

TCP为什么是可靠的(怎么保证有效传输的)?

TCP为什么是可靠的(怎么保证有效传输的)?

五、最大消息长度

在建立TCP连接的时候,双方约定一个最大的长度(MSS)作为发送的单位,重传的时候也是以这个单位来进行重传。

理想的情况下是该长度的数据刚好不被网络层分块。

双方协商最大报文消息长度流程如下所示:
TCP为什么是可靠的(怎么保证有效传输的)?

六、拥塞控制

滑动窗口控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。

发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送窗口取拥塞窗口与接送段接收窗口最小者。

慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停 止指数增长,按照线性增长方式增加至拥塞窗口;线性增长达到网络拥塞时立即把拥塞窗口置回 1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。

拥塞控制算法主要有:慢启动、拥塞避免、快重传和快恢复;

他们的传播过程图如下所示:
TCP为什么是可靠的(怎么保证有效传输的)?

1、慢启动

通常在一条TCP连接开始时,cwnd 被设置为 1 个 MSS(最大报文段),也即 cwnd = 1 该阶段,每当TCP发送方将发送窗口的数据发送完,并顺利接收到所有的确认后,就会将拥塞窗口大小翻倍,也即慢启动阶段,cwnd 以指数形式增长,如下图所示;注意这里忽略了接收窗口的影响,拥塞窗口会一直增长直到到达慢开始门限 ssthresh,开始执行拥塞避免算法。

2、拥塞避免

​ 该阶段的拥塞窗口变为线性增长,每次 cwnd + 1,也即每次增加一个 MSS;

​ 随着拥塞窗口的增加,发送速率不断提高,当TCP遇到分组超时重传时,即认为发生了网络拥塞,此时将更新 拥塞窗口阈值 为当前拥塞窗口阈值的一半,下图中是更新为 24 的一半即 12 更新 cwnd 的值为1然后继续执行慢启动——拥塞避免,如下图所示;

​ 如果TCP发送方接收到连续的3个重复确认,则认为是正常的网络包丢失,而不是网络拥塞造成的(这正是快重传算法的功劳)重传丢失的分组执行快恢复算法;

3、快重传

​ 所谓的快重传算法,就是让发送方尽快重传,而不是等待计时器超时再重传;

​ (1)要求接收方不要等待自己发送数据时才捎带确认,而是要立即发送确认;

​ (2)即使是失序的报文段,也要立即发送对已收到的报文段的重复确认;

​ (3)发送方一旦收到3个连续的重复确认就认为发生数据丢包,就将相应的报文段立即重传,而不是等待该报文的重传计时器超时再重传;

TCP为什么是可靠的(怎么保证有效传输的)?

4、快恢复

如果发送方收到了3个重复确认,就执行快恢复;

然后将快开始门限(慢启动阈值)拥塞窗口阈值都设置为原来的一半,然后执行慢启动——拥塞避免;

七、流量控制

流量控制:如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。

所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制

TCP 流量控制是通过滑动窗口机制来实现的,下面我们来看一下:

滑动窗口机制

滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输,相互连接的主机间存在两个滑动窗口:

  • 一个用于接收数据(可用窗口)
  • 一个用于发送数据(发送窗口)

根据接收端的接收情况,动态去调整窗口大小,然后来控制发送端的数据流量。

TCP为什么是可靠的(怎么保证有效传输的)?文章来源地址https://www.toymoban.com/news/detail-406244.html

到了这里,关于TCP为什么是可靠的(怎么保证有效传输的)?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP如何保证可靠性,TCP如何实现可靠性传输的

    tcp 如何保证可靠性 大家都知道TCP是可靠性传输协议,既然是可靠的,就需要解决比如包丢失了、数据被破坏了、包重复了、乱序了等等这样的问题。下面将从几个方面介绍TCP的可靠性。 1. 校验和 TCP每一段报文都有校验和,这保证了报文不被破坏或篡改,如果收到的报文在校

    2024年02月10日
    浏览(44)
  • TCP如何保证传输的可靠性

    TCP采用哪些方式保证数据传输可靠? 答: 1、数据分块:将数据包划分为合适的大小,这样更能适应网络的限制,如果数据发生错误或丢失,只要重传有问题的部分即可,减少重传的数据量。方便进行流量和拥塞控制。 2、数据包有序号,可以根据序号对失序的数据包进行重

    2024年04月11日
    浏览(33)
  • TCP 和 UDP 的区别、TCP 是如何保证可靠传输的?

    先来介绍一些osi七层模型 分为应用层、表示层、会话层、运输层、网络层、链路层、物理层。 应用层(数据):确定进程之间 通信的性质 以及满足用户需要以及提供网络和用户应用,为应用程序提供服务,DNS,HTTP,HTTPS,DHCP,FTP,POP3(Post Office Protocol)、SMTP(Simple Mail Transfer P

    2024年02月11日
    浏览(35)
  • 计算机网络-TCP如何保证传输可靠性

    TCP协议传输的特点主要就是面向字节流、传输可靠、面向连接。 TCP协议如何确保传输的可靠性的? TCP协议保证数据传输可靠性的方式主要有: 1.校验和 2.序列号 3.确认应答 4.超时重传 5.连接管理 6.流量控制 7.拥塞控制 1.校验和 发送方:在发送数据之前计算检验和,并进行校验

    2024年02月05日
    浏览(34)
  • 【HBZ分享】TCP可靠性传输如何保证的?

    ACK机制是发送方与接收方的一个相互确认 客户端向服务端发送连接请求,此时服务端要回馈给客户端ACK,以表示服务端接到了客户端请求,这是第一和的第二次握手 客户端接收到服务端响应后,同样也要回馈服务端的响应,告知服务端我收到了你的回馈,我们可以进行传输

    2024年02月10日
    浏览(28)
  • 为什么 volatile不能保证原子性

    volatile 本质上是一种内存屏障,它可以确保在 volatile 变量写操作和读操作之间不会发生重排序,这样就可以保证对 volatile 变量的修改能够立即对其他线程可见。但是, volatile 只能保证可见性,并不能保证原子性。 在 Java 中,原子性是指一个操作是不可中断的,即使在

    2024年02月15日
    浏览(44)
  • RSA加密为什么能保证安全

    一、原则:公钥机密、私钥解密、私钥签名、公钥验签 公钥私钥都可以加密和解密数据,但是因为持有公钥和私钥的人不同,在具体的使用场景中,公私钥的使用方式,也是有明确规定的。 公钥加密/私钥解密: 因为公钥是暴露在外的,私钥确实某个人单独持有的,当使用私

    2024年02月16日
    浏览(32)
  • ChatGPT 在做什么,为什么有效?

    原文:What Is ChatGPT Doing … and Why Does It Work? 译者:飞龙 协议:CC BY-NC-SA 4.0 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上,这是关于技术的故事。但它也是关于科学的故事。以及关于哲学的故事。为了讲述这个故事,我们将不得不汇集许多世纪以来的

    2024年04月09日
    浏览(41)
  • ArrayList为什么不是线程安全的,如何保证线程安全?

    官方曰, 线程安全就是多线程访问时,采⽤了加锁机制,当⼀个线程访问该类的某个数据时,进⾏保护,其他线程不能进⾏访问直到该线程读取完,其他线程才可使⽤。不会出现数据不⼀致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数

    2024年02月07日
    浏览(53)
  • 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?

    在上篇文章中,我们了解到 HTTP 在通信过程中,存在以下问题: 通信使用明文(不加密),内容可能被窃听 不验证通信方的身份,因此有可能遭遇伪装 而 HTTPS 的出现正是解决这些问题, HTTPS 是建立在 SSL 之上,其安全性由 SSL 来保证 在采用 SSL 后, HTTP 就拥有了 HTTPS 的加密

    2024年03月19日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包