在文章TCP滑动窗口协议与流量控制中,我们已经理解了滑动窗口(发送窗口swnd和接收窗口rwnd)。
在发送端TCP通过发送窗口提高分组报文的传输效率,同时TCP也要求发送端维护一个接收窗口(rwnd)以提供流量控制,注意接收窗口的值是由接收方计算出来,并通报给发送方后,让发送方用来计算出接收窗口后主动做流量发送控制的。
因为TCP是全双工通信,所以两边的主机同时都是发送方和接收方,所以两边的主机都同时维护了自己的滑动窗口(发送窗口swnd和接收窗口rwnd)。注意在不考虑拥塞控制等算法的情况下,发送窗口swnd和接收窗口rwnd就会退化成完全相等的同一个窗口。
通常TCP有三个窗口,接收窗口 rwnd (receive window),发送窗口swnd(send window),拥塞窗口cwnd(congestion window)。
拥塞避免(cwnd)是发送方使用的流量控制,而滑动窗口(swnd, rwnd)则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的处理能力处理速度大小有关。
接收窗口 rwnd (receive window)
接收窗口rwnd使用图中的三个变量计算而来,即下图的下半个图的蓝色部分:
1应用程序已经读走的最后一个分组报文的最后一个字节序号,定义为LastByteRead
2从网络中收到的最后一个分组报文的最后一个字节序号,定义为LastByteRecv
3提供的窗口,定义为RecvBuffer
接收方的接收窗口rwnd = RecvBuffer - [LastByteRecv - LastByteRead]。
![](https://i-blog.csdnimg.cn/blog_migrate/40f41ea4f7ac615726d9a692b45e7b06.png)
发送窗口swnd(send window)
发送窗口swnd和rwnd有类似的计算方法,是指上图中,上半个图里的蓝色部分。
1未收到确认的第一个分组报文的前一个分组的最后一个字节序号,定义为LastByteAcked
2下一个可发送的分组报文的前一个报文的最后一个字节序号,定义为LastByteSent
3提供的窗口,定义为SendBuffer
发送方的窗口swnd的初始值为:由拥塞窗口cwnd和rwnd两者中取小值,swnd是一定会小于等于rwnd, 然后系统会用 LastByteSent - LastByteAcked <= rwnd来控制流量的发送。
在网络足够好,即cwnd足够大的情况下, 我们可以简单的认为 swnd = rwnd - (LastByteSent - LastByteAcked) , 真实可用的发送大小还取决于剩余可用发送缓冲区SendBuffer - (LastByteSent - LastByteAcked)的大小。
在接收方能力足够强,即rwnd足够大的情况下,swnd <= cwnd。
这个告诉我们在发送方发送能力足够大的情况下,网络的吞量取决于网络状况cwnd和接收方的接收能力rwnd),cwnd和rwnd二个值都是随着网络的状态和接收方接收能力的变化而动态变化的。
拥塞窗口cwnd(congestion window)。
拥塞窗口是TCP中设计的一种用于避免网络拥塞发生的机制。拥塞窗口的大小取决于网络的拥塞程度,并且动态变化。发送方通过保证自己的发送窗口小于等于拥塞窗口以避免网络拥塞的发生。
发送方控制拥塞窗口的原则是:网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。只要网络一出现拥塞,拥塞窗口就减少一些,以减少注入到网络中的分组数,避免网络拥塞。
cwnd是随着网络状态的变化面变化的,它的大小与TCP慢启动门限,拥塞避免算法,快重传算法和快恢复算法相关,具体cwnd的产生算法,我们可以再开篇来讲。
通过本文,大家可以理解TCP的这三个窗口,以及TCP如何通过这三个窗口进行流程控制。