详细总结:TCP为何是可靠的

TCP协议保证数据传输可靠性的方式主要有5种:

1.校验和

   发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。
   如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 

2.确认应答+序列号

   TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。 

3.超时重传

   当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。
   如果不能及时收到一个确认,将重发这个报文段。 

4.流量控制

   TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。
   当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
   TCP使用的流量控制协议是可变大小的滑动窗口协议。
   接收方有即时窗口(滑动窗口),随ACK报文发送

5.拥塞控制

   当网络拥塞时,减少数据的发送。
   发送方有拥塞窗口,发送数据前比对接收方发过来的即使窗口,取小
   慢启动、拥塞避免、拥塞发送、快速恢复

说一下流量控制和拥塞控制的区别:
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况

分别仔细分析一下这五种:

1.校验和

校验和的计算方法( IP 首部中的校验和为例)
方法是计算16位的二进制和,首先将校验和字段(16位)置0,将每个16位相加,若最后未到16字节,则以0补充,然后对结果取反,结果存在校验和字段中,
然后接收端接收到报文后,头部是包含之前的校验和,则接收端又计算全部的二进制和,然后取反,如果结果为0则传输没出问题。否则出错
如果出错:接收端就会丢弃这个报文的接收。从而发送端等待确认超时后,会自动重发该数据包

我引用了之前学习保存的一张图。能很好的说明情况。
在这里插入图片描述

2.确认应答+序列号

以TCP三次握手和四次挥手为例子。
如果是传输过程中。ACK代表期望下次收到的是什么报文,如果丢包了,假设X端发给Y端1000-1009的包,如果1004在这个过程丢包了,那么ack这个应答就跟序列号不匹配。就会转到重传阶段
如果重发:接收方发现接收的数据已存在(,所以序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

在这里插入图片描述

3.超时重传

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

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

TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制
如果是第一个原因,接收方收到二次重发的数据后,便进行ACK应答。
如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

超时以500ms为一个单位进行控制
如果重发一次后,得不到应答,等待2500ms后进行重传
如果仍然得不到应答,等待4
500ms进行重传,依次类推,以指数形式递增
累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接

4.流量控制

接收端滑动窗口大小是由接收端的接收能力决定的,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

在这里插入图片描述

4.拥塞控制

TCP传输的过程中,发送端开始发送数据的时候,如果刚开始就发送大量的数据,那么就可能造成一些问题。网络可能在开始的时候就很拥堵,如果给网络中在扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧就会产生大量的丢包,就对大量的超时重传,严重影响传输。

慢启动:所以TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫做拥塞窗口的概念。发送刚开始定义拥塞窗口为 1,每次收到ACK应答,拥塞窗口加 1。在发送数据之前,首先将拥塞窗口与接收端反馈的窗口大小比对,取较小的值作为实际发送的窗口。

拥塞避免:拥塞窗口的增长是指数级别的。慢启动的机制只是说明在开始的时候发送的少,发送的慢,但是增长的速度是非常快的。为了控制拥塞窗口的增长,不能使拥塞窗口单纯的加倍,设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时,不能再按照指数来增长,而是线性的增长。在慢启动开始的时候,慢启动的阈值等于窗口的最大值,一旦造成网络拥塞,发生超时重传时,慢启动的阈值会为原来的一半(这里的原来指的是发生网络拥塞时拥塞窗口的大小),同时拥塞窗口重置为 1。

快重传:比如发送了1001,1002接收方也正常回应了,而发送1003丢包,接收方没有收到,此时发送方发送了1004,接收方还是回应ACK1003表示期望收到1003的包,这种情况会持续三次,三次之后发送方不必等待超时的时间,即可立即发送丢失的1003,此时三次之后假设1004,1005,1006都正常接收,那么下次也是回应ACK=1007,因为缓存队列中已经有了

快恢复:新的阈值通常为窗口大小的一半,如图中24->12,阈值只要作为一个门槛,达到阈值了就是拥塞避免算法慢慢加,别以为到了阈值就会发生堵塞。其实要到真的堵塞了才知道堵塞了。把cwnd值设置为慢启动门限减半后的值,然后开始执行拥塞避免算法,拥塞窗口cwnd值线性增大。

这里引用计算机网络书上的图作为例子理解:

————————————————

おすすめ

転載: blog.csdn.net/qq_40861091/article/details/102022443