0%

TCP可靠传输的实现

本文主要讲述TC保证可靠性的方式,并且采用哪些机制来保证可靠传输的,首先是

TCP 保证可靠性的方式:

1) 应用数据被分割成 TCP 认为最适合发送的数据块。

2) 校验和:保持它首部和数据的校验和,确认数据的准确性。

3)确认和重传机制:确认机制,发送报文后,等待确认;如果没有收到确认,将重发数据段。

5)接收端会丢弃重复的数据

6)发送端数据编号,接收端按序接收

7)进行流量控制、拥塞控制

一、确认与重传

  • 思想:发送报文后,等待对方的确认,如果收不到确认,则重传

超时重传:发送报文后在超时计时器到期内还收不到该报文的确认,则重新发送该报文

超时计时器的时间应当比报文平均的往返时间更长一些

确认丢失:确认消息在传输过程丢失,重传该报文,接收端丢弃重复的报文并发送确认

确认迟到:确认消息在传输过程中迟到,发送端丢弃迟到的确认

imga

(1)停止等待协议:为了实现可靠传输

  • 基本原理:每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组;并且若接收方收到重复分组,就丢弃该分组,但同时还要发送确认;
  • 自动重传请求ARQ:即上述的重传与确认机制,保证在不可靠的传输网络实现可靠的通信,简单但信道利用率低

(2)连续ARQ协议(利用滑动窗口实现)

  • 基本原理:发送方可以连续发送分组,不需要等待对方确认。接收方一般采用累计确认,对按序到达最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。

  • 优点:提高信道利用率,容易实现,即使确认丢失,也不必重传。
  • 缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。

二、滑动窗口

TCP的滑动窗口是以字节为单位的,并且可以动态变化的

  • 发送端的三种发送状态:

发送端的滑动窗口

  1. 已发送且收到确认的序号:发送窗口前面的序号(不再保留被删除)
  2. 允许发送的序号:发送窗口里面的序号(已发送但未确认、可发送但未发送)
  3. 未允许发送的序号:发送窗口后面的序号
  • 接收端的三种接受状态:
  1. 已发送确认且并交付主机的数据
  2. 允许接收的数据
  3. 为允许接收的数据
  • 过程:发送端发送 发送窗口 中的数据,接收端按序接受数据并给出确认,如果数据没有按序到达(数据丢失),则接收端只能给出按序到达的数据中的最高序号给出确认,发送端要根据收到的确认号重传确认号后的数据(比如连续ARQ的例子)

二、TCP的流量控制

思想:让发送方的发送速率不要太快,让接收方来得及接受,因此发送方的发送窗口不能超过接受端的接受窗口的数值

利用滑动窗口实现:

img

滑动窗口协议既保证了分组无差错有序接收,也实现了流量控制。主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。

三、TCP 的拥塞控制

主要是下面的四种机制:
一、慢启动(慢开始):

发送方维持一个拥塞窗口(cwnd)的状态变量,拥塞窗口的大小取决于网络的阻塞程度,并且动态变化

思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小

为举例说明,这里使用报文段的个数作为拥塞窗口大小的单位(实际上拥塞窗口大小是以字节为单位的)

过程

  1. 一开始发送方先设置 cwnd=1,发送第一个报文M1

  2. 接收方收到后确认M1,发送方收到确认后,将cwnd从1增大为2

  3. 发送方每收到一个对新报文的确认(重传不算在内)就使发送方的拥塞窗口加1,所以每经过一个传输轮次,拥塞窗口cwnd就加倍

    慢开始示意图

慢开始不是指 拥塞窗口cwnd 的增长速度慢(指数增长),而是指开始时cwnd=1

一次传输轮次的时间=晚饭时间RTT=所有报文发送完毕并收到确认的时间

为了防止 cwnd 增长过大引起网络拥塞,设置一个慢开始门限(ssthresh 状态变量)

  • 当 cnwd<ssthresh,使用慢开始算法
  • 当 cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法
  • 当 cnwd>ssthresh,使用拥塞避免算法

二、拥塞避免:

思路:让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞控制窗口加1

拥塞避免并非完全能够避免拥塞,而是cwnd按线性规律缓慢增加,比慢开始算法的倍数增长速率缓慢得多,使网络比较不容易出现拥塞

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为 1,执行慢开始算法。 如图所示:

1567933355644

在TCP拥塞控制的文献中也成为“乘法减小”和”加法增加“,上述两种算法合起来就是AIMD算法

三、快速重传:

思路:

  1. 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。

  2. 快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

  3. 由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网络的吞吐量。

    快重传示意图

四、快速恢复:

  1. 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半,为了避免网络发生拥塞。但是接下去并不执行慢开始算法。

  2. 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小,然后执行拥塞避免算法

    1567935047600

发送端有cwnd发送窗口,接收端也有rwnd接收窗口(通知窗口)

发送端发送窗口的大小取决于网络拥塞程度,但接收端的缓存空间有限,所以接收端的接受窗口是根据自己的接受能力来设置的,并把这个窗口值写入TCP首部中的窗口字段,传送给发送方。因此,从接收方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收窗口值rwnd

即发送方窗口的上限值 = Min [ rwnd, cwnd ]

当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。

当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。

也就是:rwnd和cwnd中较小的一个控制发送方发送数据的速率

拥塞控制和流量控制的区别

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