关于滑动窗口的一些理解

最近在学习TCP协议,在看到关于滑动窗口的理论时,找了很多博客,发现都讲得不太好,要么含糊其辞,要么存在错误

现在根据自己的理解对滑动窗口简单总结如下,后续再补充详细的说明。

1、滑动窗口包括发送窗口和接收窗口,client和server每个连接都有一个发送窗口和一个接收窗口,因为TCP是全双工通信。

2、窗口大小的调整是通过调整窗口左边沿、窗口右边沿调整窗口大小的,并且不管接收窗口还是发送窗口,左、右边沿只能向右滑动。由于窗口边沿只能向右滑动,因此窗口宽度减小只能是左边沿滑动,窗口宽度增大只能是右边沿滑动。

3、接收侧边沿移动规则:

 定义应用从缓存区取出的包为地址为AppLastRead,最大连续包所在地址为NextExpected,发给发送侧Ack所指向的地址,缓存作为一个循环队列的大小为BufferSize,滑动窗口左边沿地址为WindowLeft,窗口右边沿地址为WindowRight,则窗口边沿计算公式如下:

  WindowLeft = NextExpected

  WindowRight = AppLastRead+BufferSize

发送窗口大小Window = WindowRight-WindowLeft

NextExpected指向的包序号作为Ack,Window填入TCP报文window字段,一起相应给发送端。

4、发送侧边沿移动规则:

  定义已发送并且收到ACK的最大包对应的地址为Acked,已发送但是未收到Ack的包的地址为Sent,已在窗口内暂时未发送的包的最大地址为WaitSendm,窗口右侧不能发送的包的最大地址为AppWrite

  则WindowLeft = Acked

  WindowRight = WindowLEft+Window,Window为从TCP报文提取的window字段,也就是接收发给发送侧的

5、综合3、4点可知,发送侧的窗口受接收侧来调节,左边沿受接收侧响应ACK控制,右边沿受接收侧窗口大小控制

猜你喜欢

转载自www.cnblogs.com/chameleon-/p/9399737.html