当前位置:网站首页>[面试时]——我如何讲清楚TCP实现可靠传输的机制

[面试时]——我如何讲清楚TCP实现可靠传输的机制

2022-07-06 09:21:00 李孛欢

        一.概述

        所谓可靠传输是指信息在发送方和接收方准确、精确的传输。TCP主要提供了检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制和 流量控制等方法实现了可 靠性传输。

  • 检验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢 弃TCP段,重新发送。
  • 序列号/确认应答: 序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重 复序列号的数据。 TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文, 这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里开始发。
  • 滑动窗口:滑动窗口既提高了报文传输的效率,也避免了发送方发送过多的数据而导致接收方无法正常处理的异常。
  • 超时重传:超时重传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被 认为是丢包了,需要重传。最大超时时间是动态计算的
  • 拥塞控制:在数据传输过程中,可能由于网络状态的问题,造成网络拥堵,此时引入拥塞控制机制,在保证TCP可靠性的同时,提高性能。
  • 流量控制:如果主机A 一直向主机B发送数据,不考虑主机B的接受能力,则可能导致主机B的接受 缓冲区满了而无法再接受数据,从而会导致大量的数据丢包,引发重传机制。而在重传的过程中, 若主机B的接收缓冲区情况仍未好转,则会将大量的时间浪费在重传数据上,降低传送数据的效率。所以引入流量控制机制,主机B通过告诉主机A自己接收缓冲区的大小,来使主机A控制发送的 数据量。流量控制与TCP协议报头中的窗口大小有关

        二.细节

         一个TCP报文段由首部数据载荷两个部分构成,TCP的全部功能都体现在它首部各个字段的作用,首先我们来看TCP报文段的首部格式(最小20字节,最大60字节):

各字段的含义如下:

(1) 源端口和目的端口:各占2个字节。源端口用来标识发送该TCP报文段的应用进程,目的端口用来标识接收该TCP报文段的应用进程。运输层的复用和分用功能都要通过端口才能实现。

(2) 序号:占4个字节。TCP是面向字节流的,所以TCP连接中传送的数据流中的每一个字节都编上一个序号(并非内容)序号字段用来指出本TCP报文段数据载荷第一个字节的序号,如下图所示,序号字段的值为166。

(3) 确认号:占4个字节,是期望收到对方的下一个报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。若确认号为N,表明前N-1的所有数据都已经正确接收,并且期望序号为N的数据,只有当ACK = 1确认字段才有效,否则无效

(4) 数据偏移量:占4个比特,并以4字节为单位,它指出TCP报文段的数据载荷的起始处距离TCP报文段的起始处有多远,实际上指出了表示首部长度。首部固定长度为20字节,最长为60字节,二进制表示为0101和1111。

(5) 保留:占6位,目前不使用,所以置为0。

(6) 紧急位 URG:当其值为1时,表明紧急指针字段有效。它会告诉系统此报文段中有紧急数据,应该尽快传送。但是URG需要和紧急指针配套使用,即从第一个字节到紧急指针所指字节就是紧急数据。

(7) 确认位 ACK:只有当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1

(8) 推送位 PSH:TCP收到PSH=1的报文段,就尽快的交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

(9) 复位位 RST:当RST=1时,表明TCP连接中出现了严重的错误,必须释放连接,然后再重新建立运输连接。

(10) 同步位 SYN:SYN=1表示这是一个连接请求或连接接收报文。SYN = 1 以及 ACK = 1为TCP连接请求确认报文段

(11) 终止位 FIN:用来释放一个连接。FIN=1表明此报文段的发送方的数据已经发送完毕,并要求释放传输连接。

(12) 窗口:占2个字节。它指出发送本报文段的一方的接收窗口,接收方的数据缓存空间是有限的,所以使用窗口值作为接收方让发送方设置其发送窗口的依据,这是以接收方的接收能力来控制发送方的发送能力,称为流量控制发送窗口的大小为拥塞窗口和接收窗口的最小值

(13) 校验和:占2个字节。它的检验范围包括首部和数据部分。计算时要在TCP报文段前面加上12字节的伪首部。

(14) 紧急指针:占16位,指出在本报文段中紧急数据共有多少个字节。

(15) 选项:长度可变。TCP最初只规定了一种选项,即最大报文段长度(MSS)。

(16) 填充:这是为了使整个首部长度是4字节的整数倍。
       

         超时重传时间如何确定?

        超时重传时间RTO确定时TCP最复杂的问题之一,设定的过小会出现不必要的重传使得网络负荷增大,而过大又会降低传输速率,如下面两张图所示

         针对于上述两种情况,我们可以得到下面这个结论,超时重传时间RTO的值应该略大于往返时间RTT的值。然而往返时间RTT由于网络的复杂性会波动较大。这样我们就需要计算一个有代表性的往返时间RTT,也称平滑的往返时间,计算公式就不贴了,大家可以自行查找,记住上述概念即可。

        详细说一下滑动窗口:

        在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后,才可以发送下一个数据包(一问一答)。这样一来,就会在等待确认应答包环节浪费时间。 为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值(多问多答)。

        从上面的图可以看到滑动窗口左边的是已发送并且被确认的分组,滑动窗口右边是还没有轮到的分组。 滑动窗口里面也分为两块,一块是已经发送但是未被确认的分组,另一块是窗口内等待发送的分组。随着已发送的分组不断被确认,窗口内等待发送的分组也会不断被发送。整个窗口就会往右移动,让还没 轮到的分组进入窗口内。 可以看到滑动窗口起到了一个限流的作用,也就是说当前滑动窗口的大小决定了当前 TCP 发送包的速率,而滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的最小值。 

         详细说一下拥塞控制:

  • 若网络中有许多资源同时出现供应不足,网络性能就要明显变化,整个网络的吞吐量将随着输入负荷的增大而下降,这就是拥塞。
  • 拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至于过载。

        TCP 一共使用了四种算法来实现拥塞控制:

  • 慢开始 (slow-start);
  • 拥塞避免 (congestion avoidance);
  • 快速重传 (fast retransmit);
  • 快速恢复 (fast recovery)。

        发送方维持一个拥塞窗口(cwnd)的状态变量。其大小取决于网络的拥塞程度,并且动态的在变化。发送方让自己的发送窗口小于或等于拥塞窗口。
慢开始的算法思路是:

  1.  发送窗口先设置cwnd = 1,发送第一个报文段,以后每收到一个报文段确认,cwnd加1
  2. 每经过一个传输轮次,拥塞窗口cwnd就加倍(即呈指数增长)
  3. 当cwnd大于ssthresh阀值时,改用拥塞避免算法1(加法增大)
  4. 假设增长到某值(如24),网络出现超时,此时将ssthresh值变为值的一半(如12)(乘法减小),让后将cwnd置1,重新采用慢开始算法,重复如上步骤。

拥塞避免算法的思路是:让拥塞窗口cwnd线性缓慢增长 

 

快重传的算法思路是:

  1. 要求接收方每收到一个时序的报文段后就立即发出重复确认,而不是等待发送数据时才进行捎带确认
  2. 发送方只要一连收到三个重复确认,就应当立即重传对方尚未收到的报文段,而不必等待设置的重传计时器到期

快恢复的算法思路是:

  1. 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始阀值ssthresh减半
  2. 接着不执行慢开始,而是从新阀值ssthresh开始执行拥塞避免算法(加法增大)

 

原网站

版权声明
本文为[李孛欢]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_61543601/article/details/124965716