TCP--滑动窗口
接收端和发送端通过窗口来实现流量的控制。发送端维护一个发送窗口,接收端维护一个接收窗口。拥塞窗口是一个变量,是发送方通过当前网络拥塞状态计算出来的一个值。
前言
推荐一个可以查看流量控制动图的网站,还有一个滑动窗口动图的网站。
发送窗口--swnd
发送方维护一个发送窗口(swnd)。
\
发送窗口就是操作系统开辟出来的一片缓存,如果数据已经发送并且收到确认就从缓存中删除。\
当发送窗口中的数据都发送出去等待确认的时候,这个时候就不会在发送数据了,因为超出了接收窗口的承受能力了,这时候只能等待收到服务端的确认。
我们看到17~19的已经确认,窗口向右移动3格,就会有3个进入窗口,进入就绪状态。\
就这样发送窗口一直向右移动,但是要注意的是发送窗口的大小并不是固定的,而是动态变化的。
接收窗口--rwnd
接收方维护一个接收窗口。
\
中间的窗口可以接收数据,
数据到了,那么窗口就会向右移动了。如下图。19~21
比
17~18
先到达(乱序到达),会先将
19~21
放到缓存区,然后等待
17~18
的数据,如果
17~18
接收窗口收到
并且发出确认,窗口向右移动。17~18
细节
窗口大小由谁决定
TCP头部里面有个Window,用来协商窗口大小的。\
这个就是接收方告诉发送方自己缓存区能接受数据的大小,发送方依据接收方的能力发送数据,不会导致接收方缓存爆满。 \
发送方发送的数据大小不能超过接收方的窗口大小,不然就会产生数据丢失。\
但是TCP会根据当前网络拥塞状态计算出一个拥塞窗口(cwnd),TCP比较无私,当网络拥堵的时候会降低自己传输的速率,这时候发送窗口(swnd)=min(接收窗口rwnd,拥塞窗口cwnd)。
当接收窗口从0又有缓存了,发送端如何感知
当发送端知道接收窗口满了,会启动一个零窗口(TCP Zero Window)定时探测器,发送端每隔一段时间就会发送探测包,查看接收端的窗口是否有缓存。如下图所示。\
作者:徐锦桐
链接:https://www.xujintong.com/2023/10/02/53/
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)