TCP滑动窗口详解
每个TCP活动连接的两端都维护一个发送窗口结构和接收窗口结构。如下图展示了一个TCP发送窗口结构。
图1
TCP发送端滑动窗口结构记录了已确认,在传以及还未传的数据的序列号。提供窗口的大小是接收端返回的ACK中窗口大小字段控制的。
TCP是以字节为单位维护其窗口结构的,如上图的标号1-13分别表示第1-13的字节。接收端返回的窗口里面的窗口称为提供窗口。
图2
这是通过tcpdump
命令看到的信息,其中的win就是窗口大小。可以看到这里的窗口大小是6379。
滑动窗口到底怎么滑呢?
所以滑动窗口到底怎么滑呢?下面来具体分析一下:
现在我们假设tcp发送端发送了一个像图1一样的报文(字节1-13)至服务端。对应的tcp信息应该是这样,其他信息我们暂时不关注:
send -> rcv seq 1:6 ,win 6 ···else···
但接收端当前只能确认前三个字节(ACK=3),并通告了一个6字节大小的窗口,那么返回的tcp信息应该是这样。
rcv->send ack 3, win 6 ···else···
大概是这个样子的:
TCP接收端滑动窗口结构帮助了解其下次应接受的数据序列号,若接收到的数据序列号在窗口内,则可以存储,否则丢弃。
这时候,发送端可以计算其可用窗口,即它可以立即发送的数据,可用窗口计算值为提供窗口大小减去在传(已发送但未得到确认)的数据值。