滑动窗口RWND 和 拥塞窗口 CWND的区别
参考文章:「What is CWND and RWND?」
文章如有错误,希望指正,共同学习
RWND (Receiver Window) 滑动窗口:
滑动窗口技术是TCP的流量控制的核心,存在于TCP的Header中,主要用于并发处理网络seq;
在不使用窗口之前,TCP的Sender和Receiver收发的数据包总是一一对应,并且按序执行,即假设存在5个包,sender发送包1必须收到Receiver的ack才能继续发送包2,否则只有忙等。
但是滑动窗口的存在则是允许我们Sender按照Receiver的允许大小,一次按序传递seq,而不用等到某个ack回来才能发新的数据包。即可以按序发送1、2、3、4、5 五个包,然后等对方回复对应ACK即可。
Receiver Window的是动态改变的,随着Sender每次发送seq的时候,Receiver都会根据当前机器的执行效率和缓存上限、当前缓存大小得出一个合适的Window Size,并且随着Ack回传到Sender。Sender在下次发送数据包的时候,就可以根据新的窗口大小去发送数据了。
可以说RWND是为了并发seq存在的一个缓存技术,一般是Receiver端去维护可行的大小,并且和计算机本身CPU的处理速度有关。
CWND(Congestion Window)拥塞窗口:
在TCP的拥塞处理-慢启动上面提出了Congestion Window拥塞窗口,与RWND还是存在不少的差别。
Congestion Window最大的一个区别在于控制网络速度,即控制的是一次能收发多少个seq,你可以理解他是一个限速,好比一个网络限速,他也不是一个"缓存"的存在,虽然他的名字叫Window…
而且Congestion Window的出现,一般都是出现网络拥塞发生的时候;即可能因为收发双方的缓存已经开始写满溢出了,这时候开始引起网络丢包、重传、降低数据传输的吞吐量、性能下降甚至出现"网络风暴"。
Congestion Window是通过慢启动的方式逐渐按照算法去增长,并且一直往RWND的大小去靠近,或者直到这个CWND的大小达到了网络的峰值。这里看也可以得出RWND可能会比CWND大得多,毕竟RWND是通过Receiver的机器去控制大小的,而CWND则会受到网络相关的设备限制(电缆、路由器那些)。
但是TCP层面的收发速率,确实是会取决于CWND和RWND的最小值(很大程度上取决于CWND,因为RWND一般都比较大),这个还是比较容易理解。
同时CWND是由发送端去维护,根据慢启动的处理,CWND的大小是会根据RTT(segment片段从sender发送到Receiver,Receiver回ACK到Sender,并且Sender收到ACK的一个时间差)采样实现动态变化;
当网络畅通的时候能快速达到峰值;当网络慢的时候,又可以通过拥塞避免、拥塞发生、快速恢复等手段降低CWND的大小,减少数据包的发送,避免网络风暴。当网络比较畅通的时候,将窗口又按照算法快速控制到最大值,从而提高网络发送效率。