第20章 TCP的成块数据流
20.3 滑动窗口
图2 0 - 4用可视化的方法显示了我们在前一节观察到的滑动窗口协议。
在这个图中,我们将字节从 1至11进行标号。接收方通告的窗口称为提出的窗口( o ff e r e d w i n d o w),它覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第 3字节在内的数据,且通告窗口大小为 6。回顾第1 7章,我们知道窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。
当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小。我们使用三个术语来描述窗口左右边沿的运动:
- 称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。
- 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了 T C P的接收缓存时。
- 当右边沿向左移动时,我们称之为窗口收缩。 Host Requirements RFC强烈建议不要使用这种方式。但T C P必须能够在某一端产生这种情况时进行处理。第 2 2 . 3节给出了这样的一个
例子,一端希望向左移动右边沿来收缩窗口,但没能够这样做。图2 0 - 5表示了这三种情况。因为窗口的左边沿受另一端发送的确认序号的控制,因此不可能向左边移动。如果接收到一个指示窗口左边沿向左移动的 A C K,则它被认为是一个重复 A C K, 并被丢弃。
如果左边沿到达右边沿,则称其为一个零窗口,此时发送方不能够发送任何数据。
一个例子
图2 0 - 6显示了在图2 0 - 1所示的数据传输过程中滑动窗口协议的动态性。
以该图为例可以总结如下几点:
- 发送方不必发送一个全窗口大小的数据。
- 来自接收方的一个报文段确认数据并把窗口向右边滑动。这是因为窗口的大小是相对于确认序号的。
- 正如从报文段7到报文段8中变化的那样,窗口的大小可以减小,但是窗口的右边沿却不能够向左移动。
- 接收方在发送一个 A C K前不必等待窗口被填满。在前面我们看到许多实现每收到两个报文段就会发送一个A C K。
下面我们可以看到更多的滑动窗口协议动态变化的例子。