TCP 面试系列第五弹,TCP 可靠传输实现之滑动窗口。
现在我们假定 A 收到了 B 发来的确认报文段,其中窗口是 20(字节),而确认号是 31(这表明 B 期望收到的下一个序号是 31,且到序号 30 为止的数据已经收到了)。根据这两个数据,A 便构造出自己的发送窗口,如下图所示:
为了方便大家的理解,对照着上图,对一些概念进行阐述。(注意图中的后沿与前沿)
发送窗口表示:在没有收到 B 的确认的情况下,A 可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。
从图上很清晰地看出,发送窗口的位置由窗口前沿和后沿的位置共同确定。
发送窗口后沿的后面部分表示已发送且已收到了确认。这些数据显然不需要再保留了。
而发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间
关于发送窗口后沿的可能变化:
- 不动(没有收到新的确认)
- 前移(收到了新的确认)
关于发送窗口前沿的可能变化:
- 向前移动。正常发送新的数据
- 不动。原因可能是没有收到新的确认,对方的通知窗口大小也没变;收到了新的确认,但对方通知的窗口缩小了,刚刚好不动
了解了滑动窗口的基本知识后,下面我们考虑更加滑动窗口一些常见的复杂情况。
上图简要前置假设说明:
- A 发送了序号为 31~41 的数据。
- 发送窗口内靠后面有 11 个字节(灰色小方框表示)表示已发送但未收到确认。
- 发送窗口内靠前面的 9 个字节(42~50)是允许发送但尚未发送的。
现在分析接收窗口 B:
- B 的接收窗口大小是 20。
- 接收窗口内的序号(31~50)是允许接收的。
- 在接收窗口外面,到 30 号为止的数据是已经发送过确认,并且已经交付主机了。因此在 B 可以不再保留这些数据。
- 注意,重点来了,现在假设数据没有按序到达,即序号为 31 的数据没有收到(滞留在网络中的某处),也就是说 B 收到了序号为 32 和 33 的数据,却没有收到 31 的数据。这种情况下,B 发送的确认报文段中的确认号 ACK 仍然是 31(即期望收到的序号),而不是 32 或者 33。因为 B 只能对按序收到的数据中的最高序号给出确认。
滑动窗口还有很多复杂的情况,帅天就不一一列举了。但是对于发送窗口、接收窗口和发送前沿和后沿是需要重点掌握的。
如果喜欢这篇文章,请点个关注,你的关注是我最大的动力。