TCP--滑动窗口

接收端和发送端通过窗口来实现流量的控制。发送端维护一个发送窗口,接收端维护一个接收窗口。拥塞窗口是一个变量,是发送方通过当前网络拥塞状态计算出来的一个值。

前言

推荐一个可以查看流量控制动图的网站,还有一个滑动窗口动图的网站

发送窗口--swnd

发送方维护一个发送窗口(swnd)
接收窗口.webp \

发送窗口就是操作系统开辟出来的一片缓存,如果数据已经发送并且收到确认就从缓存中删除。\

发送窗口数据都发送.webp
当发送窗口中的数据都发送出去等待确认的时候,这个时候就不会在发送数据了,因为超出了接收窗口的承受能力了,这时候只能等待收到服务端的确认。

发送窗口移动.webp
我们看到17~19的已经确认,窗口向右移动3格,就会有3个进入窗口,进入就绪状态。\

就这样发送窗口一直向右移动,但是要注意的是发送窗口的大小并不是固定的,而是动态变化的

接收窗口--rwnd

接收方维护一个接收窗口
接收窗口啊.webp \

中间的窗口可以接收数据,19~2117~18先到达(乱序到达),会先将19~21放到缓存区,然后等待17~18的数据,如果17~18数据到了,那么窗口就会向右移动了。如下图。

接收窗口移动.webp
接收窗口收到17~18并且发出确认,窗口向右移动。

细节

窗口大小由谁决定

TCP头部里面有个Window,用来协商窗口大小的。\
这个就是接收方告诉发送方自己缓存区能接受数据的大小,发送方依据接收方的能力发送数据,不会导致接收方缓存爆满。 \
发送方发送的数据大小不能超过接收方的窗口大小,不然就会产生数据丢失。\
但是TCP会根据当前网络拥塞状态计算出一个拥塞窗口(cwnd),TCP比较无私,当网络拥堵的时候会降低自己传输的速率,这时候发送窗口(swnd)=min(接收窗口rwnd,拥塞窗口cwnd)。

当接收窗口从0又有缓存了,发送端如何感知

当发送端知道接收窗口满了,会启动一个零窗口(TCP Zero Window)定时探测器,发送端每隔一段时间就会发送探测包,查看接收端的窗口是否有缓存。如下图所示。\
0窗口探测器.webp

THE END