本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 滑动窗口介绍
TCP 连接的双方,有发送方和接收方。
在接收方的速度跟不上发送方的速度时,会强迫发送方慢下来,这称为流量控制。
流量控制有两种方式。一是基于速率的流量控制,给发送方指定一个速率,不能超过这个速率,最适合流应用程序,可以被用于广播和组播发现。二时基于窗口的流量控制,使用滑动窗口实现,接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。
TCP 采用滑动窗口来实现流量控制。每个 TCP 头部中的窗口字段,其大小表示接收端可用缓存空间的大小,单位是字节。窗口字段的长度是16位。
每个 TCP 连接的双方都有一个发送窗口和接收窗口的结构。发送端维护了一个发送窗口的结构,接收端维护了一个接收窗口的结构。
2. 发送窗口
发送窗口的整个结构,记录了哪些序列号已确认,哪些正在传,哪些未传。
(图片来源于网络)
以上图为例,发送方的窗口大小为20个字节,窗口中包含已发送还未确认的序列号或分组,和还未发送的部分序列号。当接收方确认数据,发送方接收到一个 ACK ,窗口也会右移,并将相应的分组副本释放,窗口也增大或缩小(根据报文段中的窗口信息调节)。
3. 接收窗口
接收端维护的接收窗口,记录了已接收并确认的数据,和它能接收的最大序列号。只有在窗口左右边界值内的序列号才能被接收并确认,窗口才会前移。
这个窗口可以保证接收端接收数据的正确性,避免接收到重复的确认过的数据,或者接收不能接收的数据(超出窗口边界的数据不能接收)。
(图片来源于书籍 TCP/IP详解 卷1:协议)
怎么判断是重复数据??
当到达的序列号小于窗口左边界,会被认为是重复数据,从而丢弃。
此外,如果到达的序列号大于窗口右边界,接收端没有能力接收,也会被丢弃。