TCP拥塞控制、窗口滑动

窗口滑动

  • “窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;
  • “滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。
前提:
  • A和B应该分别维护着一个独立的发送缓冲区和接收缓冲区
  • 发送窗口是发送缓存中的一部分,是可以被TCP协议发送的那部分,其实应用层需要发送的所有数据都被放进了发送者的发送缓冲区
  • 发送窗口中相关的有四个概念:
    已发送并收到确认的数据(不再发送窗口和发送缓冲区之内)、
    已发送但未收到确认的数据(位于发送窗口之中)、
    允许发送但尚未发送的数据、
    发送窗口外发送缓冲区内暂时不允许发送的数据;
  • 每次成功发送数据之后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据包含到窗口中准备发送

(下面的例子不涉及窗口大小调整,假设是B接受到了完整的报文就被进程读取的情况)


A发送缓冲区

A发送了31-41,但是B只接收到32和33,所以确认报文的ack=31。A不向后移动发送窗口,并且重发31。


A发送缓冲区和B接受缓冲区

只有当A成功发送了数据且发送的数据得到了B的确认之后,才会移动滑动窗口离开已发送并得到确认的数据;同时B继续确认连续的数据分组,对于乱序的分组则先接收下来,避免网络重复传递。

一个简单的例子(B有调整窗口)
image.png

1、 首先是AB之间三次握手建立TCP连接。在报文的交互过程中,A将自己的缓冲区大小(窗口大小)3发送给B;B同理,这样双方就知道了对端的窗口大小。
2、 A开始发送数据,A连续发送3个单位的数据,因为他知道B的缓冲区大小。在这一波数据发送完后,A就不能再发了,需等待B的确认。
3、 A发送过来的数据逐渐将B缓冲区填满。
4、 这时候B缓冲区中的一个报文被进程读取,缓冲区有了一个空位,于是B向A发送一个ACK,这个报文中指示窗口大小为1。
5、 A收到B发过来的ACK消息,并且知道B将窗口大小调整为1,因此他只发送了一个单位的数据并且等待B的下一个确认报文。
6、 如此反复。

流量控制

先看两张图:


1
2

1、一开始,设置ssthresh=16
2、 窗口大小一开始设为1,在没达到ssthresh前,窗口大小就乘2
3、 达到ssthresh后,窗口大小每次加1
4、

  • 情况一:若在窗口大小等于24的时候发生拥塞,这时把ssthresh=24/2=12,窗口设为1,继续步骤2
  • 情况二:若在窗口大小等于24的时候发送方收到3个重复的确认,就把ssthresh设为24/2=12,也把窗口大小设为12,继续步骤3

你可能感兴趣的:(TCP拥塞控制、窗口滑动)