大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。
接收端和发送端通过窗口来实现流量的控制。发送端维护一个发送窗口,接收端维护一个接收窗口。拥塞窗口是一个变量,是发送方通过当前网络拥塞状态计算出来的一个值。
前言
推荐一个可以查看流量控制动图的网站,还有一个滑动窗口动图的网站。
发送窗口–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)定时探测器,发送端每隔一段时间就会发送探测包,查看接收端的窗口是否有缓存。如下图所示。