TCP的滑动窗口

RTT和RTO

  • RTT:发送一个数据包到收到对应的ACK,所花费的时间
  • RTO:重传时间间隔(RetransmitTimeOut),TCP在发送一个数据包后会启动一个重传定时器,即RTO,如果超时没收到ACK就重传。
    • RTO不是固定写死的数据,而是根据RTT算出来的。

TCP使用滑动窗口做流量控制与乱序重排

滑动窗口的作用:

  • 保证TCP的可靠性
  • 提供TCP的流控特性
v2-a154dc61d394b5d48d2e55cf18f6f45c_r

流量控制:

TCP报文头中的Window字段用于接收方通知发送方自己还有多少缓冲区可以接收数据。发送方根据接收方的处理能力来发送数据。不会导致接收方处理不过来

窗口数据的计算过程:

截屏2021-02-13 下午8.30.25

左图是TCP协议的发送方的缓冲区,右图是接收端端缓冲区,下面是字节流,从左往右发送/接收

截屏2021-02-13 下午8.36.39
  • AdvertisedWindow:接收方返回的还可以接收的缓冲区大小
  • MaxRcvBuffer:接收方能接收的最大数据量
  • LastByteRcvd - LastByteRead:已占用的缓存空间
截屏2021-02-13 下午8.44.13
  • EffectiveWindow:发送方剩余可发送大小
  • LastByteSent - LastByteAcked:待确认的数据量大小

滑动窗口基本原理

TCP会话的发送方:

截屏2021-02-13 下午8.55.13

数据可分为四类:

  1. 已发送并收到回应
  2. 已发送没收到回应
  3. 未发送但对端允许发送
  4. 未发送且由于达到了Window的大小对端不允许发送

2、3类数据组成滑动窗口

滑动窗口

截屏2021-02-13 下午8.57.40

发送方收到ACK之后窗口滑动,才能继续发送新出现在窗口中的数据

TCP会话的接收方:

截屏2021-02-13 下午9.00.58

数据存在三种状态:

  1. 已接收并已发送回执
  2. 未接收但是可以接收(准备接收)
  3. 未接收但是不能接收

未接收但是可以接收这段空间就称为接收窗口

滑动机制和前面发送方一致。