Socket通信——Linux下,TCP滑动窗口

来源:互联网 发布:单片机最小系统的组成 编辑:程序博客网 时间:2024/06/07 02:40
  • 窗口机制

      滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):

      这里写图片描述

      分析:
      ①初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;
      ②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。此时接收窗口状态不变;
      ③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;
      ④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;
      ⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;
      ⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;
      ⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;
      ⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。

  • TCP滑动窗口

    滑动窗口协议可以用图四来形象表示。

    这里写图片描述

      图中我们已经将字节进行了1到11的编号。由接收者通告的窗口称为提议窗口(offered window),它覆盖了第4到第9个字节,意味着接收方已经确认了第3字节之前(包括第3字节)的数据,并且通告窗口的大小是6。窗口大小与确认的顺序号(acknowledged sequence number)有关。发送者计算它的可用窗口(usable window),用以度量它可以立即发送多少数据。

      随着接收者对收到数据的确认,滑动窗口随时向右移动。窗口两端的相关运动增加或减少着窗口大小。我们使用3个术语来描述窗口边缘(edge)的左右运动。

      1. 当窗口左边缘靠近右边缘时称窗口闭合(window closes)。窗口闭合发生在数据已经发送并被确认的情况下。

      2. 当窗口右边缘向右移动时称窗口打开(window opens)。窗口打开发生在另一端的接收进程读取已确认数据的时候,它释放了TCP接收缓冲区的空间。

      3. 当窗口右边缘向左移动时称窗口收缩(window shrinks)。Host Requirement RFC强烈不鼓励这种做法,但TCP必须能够在一端发生这种情况时进行处理。

      图五表示了这三个术语。由于窗口的左边缘是受从连接另一端收到的确认号来控制的,因此它不会向左移动。如果收到一个ACK要求将左边缘向左移动,那么它是一个重复的(duplicate)的确认,并被丢弃。

      这里写图片描述

      如果窗口左边缘重合了右边缘,就称它为零窗口(zero window)。它将停止发送者传输任何数据。

      示例

      图六显示了图一数据传输中TCP滑动窗口的动态变化

      这里写图片描述

  • 以此图为例,我们可以总结几个要点:

      1. 发送者不必传送满窗口大小的数据。
      2. 收到接收者对数据的确认后,窗口向右滑动。这是由于窗口大小与确认顺序号相关。
      3. 从段7到段8的变化,可以看出窗口可以减小,但窗口右边缘不能向左移动。
      4. 接收者不必等待窗口被填满才发送确认。在许多实现中,接收者每收到两个段发送一个确认。