TCP协议的滑动窗口通过以下方式控制流量:
基本原理与窗口设置
窗口概念:在TCP连接的发送端和接收端各维护一个窗口。发送方维护一个发送窗口,接收方维护一个接收窗口。窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据,发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。
窗口大小表示:TCP报头使用16位字段向发送方报告接收窗口大小,理论上最大窗口是2^16 = 64千字节。
工作过程中的流量控制
数据发送与确认:发送方将数据分割成一定大小的报文段,每个报文段都有一个序列号,按照序列号顺序发送。发送方在发送窗口内发送数据后,等待接收方的确认应答。确认应答中包含接收方期望接收的下一个字节的序列号。例如,发送方窗口大小为3,发送序列号为1、2、3的三个数据包,接收方成功接收后,用序列号4确认。
窗口滑动:只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。当发送方接收到确认应答后,根据确认的序列号更新发送窗口的大小,即向前滑动发送窗口,发送窗口滑动后,发送方可以发送新的报文段。比如接收方接收并确认了序列号为1 1000的字节数据,发送方的窗口就会从原来的位置向前滑动1000个字节,原来窗口内已确认的部分就可以移除,新的未发送数据进入窗口可被发送。
窗口大小调整:接收方根据自身的处理能力和缓冲区使用情况,在确认报文中告知发送方自己的接收窗口大小(rwnd)。如果接收方处理能力强,缓冲区剩余空间大,就可以增大接收窗口,允许发送方发送更多数据;反之,如果接收方处理不过来,缓冲区快满了,就减小接收窗口,限制发送方的发送速率。发送方会根据接收方通告的窗口大小以及网络拥塞情况来调整自己的发送窗口大小。
基于算法的窗口大小动态调整
慢启动:TCP连接刚建立时,发送方会将拥塞窗口(cwnd)初始化为一个较小的值,然后每收到一个确认就将cwnd加倍,以实现指数增长。这样可以在网络空闲时快速探测网络可用带宽,尽快提高数据发送速率,但又不会一开始就发送大量数据导致网络拥塞。当cwnd达到一个阈值(拥塞避免阈值)时,就进入拥塞避免阶段。
拥塞避免:进入拥塞避免阶段后,cwnd的增长变为线性增长,即每收到一个确认就将cwnd增加1个MSS(最大报文段长度)。这种较为缓慢的增长方式可以避免过快地增加拥塞窗口,从而更加稳定地维持网络的拥塞状态,避免网络因发送方发送数据过快而导致拥塞。
快重传和快恢复:当发送方连续收到三个重复的确认时就立即重传丢失的报文段,而快恢复则是将拥塞窗口减半,然后进入拥塞避免状态。这样可以快速应对网络中出现的丢包情况,及时调整发送速率,避免网络拥塞进一步恶化。