面试官:来,说一说TCP中的滑动窗口
(1)为什么要引入窗口这个概念?
对于TCP而言,每发送一个数据,都要进行一次确认应答,也就是说当上一个数据包收到了应答,才能发送下一个,如果接收方一直不对数据进行应答,发送方就要干等着,直到收到确认后才能发送新数据,这样效率就很低。即数据包的往返时间越长,通信的效率就越低。
为了解决上面这个问题,TCP 引入的 窗口 这个概念,目的是:即使是在往返时间较长的情况下,它也不会降低网络通信的效率
有了窗口,就可以指定窗口大小(无需等待确认应答而可以继续发送数据的最大值)
窗口的实现实际上是操作系统中的一个缓存空间,发送方在接收到确认应答前必须在该缓冲区中保留已发送的数据,直到按期收到确认应答才可以将对应的数据从缓存中删除。
还有一个概念是累计确认或者说累计应答,假设窗口大小为 N 个 TCP 段,那么发送方就可以连续发送 N 个 TCP 段,如果中途有 ACK 报文丢失,可以通过下一个确认应答进行确认,如下图:

从上图中我们可以看到,ACK 600 丢失了,但是发送方收到了 ACK 700,就意味着 700 之前的所有数据都被接收方收到了,发送方就知道不用再重传 600 数据包了,这个模式就叫做累计确认或者累计应答。
窗口的大小通常是由接收方的窗口大小来决定,TCP头中有一个叫 Window 的字段,代表窗口的大小,借助这个字段,接收方可以告诉发送方自己还有多少缓冲区可以接收数据,发送方根据这个可以得出接收方的处理能力,使得发送数据不会导致接收方处理不过来。总之发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。
(2)TCP中的滑动窗口
发送方的滑动窗口
发送方的滑动窗口结构怎样的?
发送方的滑动窗口结构如下图:

其中:
- 绿色部分代表已发送并收到确认的数据,范围1~31字节
- 蓝色部分代表已发送但未收到确认的数据,范围32~45字节
- 蓝色方框代表发送窗口
- 紫色方框部分是可用窗口,代表未发送并且还在接收方的处理范围内,范围46~51字节
- 最后红色部分是指未发送但总大小在发送方的滑动窗口外(总大小超过接收方的处理范围)的数据,范围:52字节之后
如果可用窗口的大小为0,说明发送方在没收到 ACK 确认前都无法继续发送数据。
如果发送方接收到对已发送数据的 ACK 确认,举个例子,上图中 32~ 40 字节的数据收到 ACK 确认应答,即有 9 个字节的数据被确认,如果发送窗口大小不变,则滑动窗口向右移动 9 个字节。
- 已发送并收到确认的数据 + 9字节
- 已发送但未收到确认的数据 - 9字节
- 可用窗口大小 + 9字节
如何在程序中表示发送方的四个部分?
四个部分:已发送并确认、已发送未确认、未发送但在可用窗口内、未发送但在可用窗口外
具体实现:一个大小 + 三个指针(两个是绝对指针,即指向特定的序列号,另一个是相对指针,即在绝对指针的基础上做偏移):
- SND.WND:表示发送窗口的大小,其大小由接收方指定
- SND.UNA(Send Unacknoleged 已发未确认):绝对指针1,指向已发送但未收到确认的第一个字节的序列号,即发送窗口第一个字节的序列号
- SND.NXT:绝对指针2,指向未发但可发送的范围的第一个字节的序列号,即可用窗口的第一个字节的序列号。
- 相对指针:SND.UNA 加上 SNU.WDN 大小的偏移量,即可表示未发送并且不可发送范围的第一个字节。
可用窗口怎么计算?发送窗口大小 - 已发未确认范围的大小,即SND.WND - (SND.NXT - SND.SND.UNA)
接收方的滑动窗口
接收方滑动窗口结构
可以分为三个部分:
- 已成功接收并确认,等待应用进程读取的数据
- 未收到但是可以接收的数据,也代表了接收窗口的范围
- 未收到并且不可以接收的数据
如下图:

如何在程序中表示接收方的三个部分?
一个大小+两个指针(一个绝对指针,一个相对指针)
- RCV.WND:接收窗口的大小,接收方会将其通告给发送方
- RCV.NXT:绝对指针,指向未接收但是可以接收的
接收窗口和发送窗口的大小是否相等?
先说结论:接收窗口的大小约等于发送窗口大小
- 因为滑动窗口不是一成不变的,当接收方的应用进程读数据的数据很快,接收窗口就可以很快地空出来,然后接收方就可以通过 TCP 报文中的 Windows 字段来告诉发送方新的接收窗口大小。但是由于传输过程存在时延。接收窗口的大小约等于发送窗口的大小。
总结
学习 TCP 的滑动窗口,要先知道因为 TCP 的确认应答机制,为了提升传输效率而引入了窗口这个概念。然后要了解 TCP 中的发送方和接收方的滑动窗口的基本结构(发送窗口是四个部分,接收窗口是三个部分)以及其在程序中是怎样表示的(发送窗口是一个大小+三个指针,接收窗口是一个大小+两个指针)。最后还要记住因为网络传输时延,接收窗口和发送窗口的大小是约等于的关系。
参考资料:小林图解计网、jk时间趣谈网络协议
