面试总结之拥塞控制与流量控制

前言:

拥塞控制和流量控制分别是什么概念?流量控制的过程,分别解决什么问题?

解答:

首先需要明确这两个概念从手段上都是通过遏制发送方,但使用它们其实是出于不同的目的。


流量控制应用在如下场景:

一条TCP连接的双方主机都为该连接设置了接收缓存。当该TCP连接收到正确按序的字节后,它就将数据放入接收缓存。相关联的应用进程会从该缓存中读取数据,但不一定是立即去读数据,可能现在接收方应用正在忙于其他的服务。那么如果应用程序读取数据时相当缓慢,而发送方发送的数据太多,太快,那就可能导致接收方的缓存溢出。

由以上场景我们可知,其实TCP流量控制主要是一种速度匹配的机制,即为了匹配发送方的发送速率和接收方应用程序读取速率的,从而防止缓存的溢出。

而TCP流量的控制主要是通过让发送方维护一个接收窗口的变量来提供的,也就是说接收窗口告诉发送方,该接收方还有多少可用的缓存空间。(滑动窗口协议)

下面我们可以通过一个例子来看这一过程,图片取自《TCP/IP协议详解》

面试总结之拥塞控制与流量控制

这个图的主要过程是bsdi主机运行服务器程序,该服务器程序设置接收窗口为6144,接着主机sun启动客户程序并向服务器发送8192个字节的数据。下面分析这个过程:

1)首先从报文段1,2,3可以看出,双方首先进行了三次握手,客户机通告服务器SYN序号,win窗口,和mss(最大报文段长度)的大小,同时服务器也告知其提供的窗口为6144。

2)接着我们可以看到客户机sun立即向bsdi服务器发送了6个报文(4~9),然后停止。此时报文段10确定了所有的数据,但是通告客户端此时其窗口为2048,这是因为接收方应用程序现在只是读取了前2048字节的数据,而2049~6144字节的数据都没有读取。

3)报文段11和12完成了客户数据的最后传输,并在最后一个报文携带了FIN的标志。

4)接下来的报文主要是接收方对报文的确认和最终完成TCP的关闭过程。


拥塞控制,一种通俗的说法是,太多主机发送了太多的数据或发送速度太快以至于网络无法处理,其表现为分组丢失(路由器缓存溢出),分组延迟过大(在路由器缓存排队)。

TCP对拥塞控制采用的方法是让每一个发送方根据所感知的网络拥塞程度,来限制其能向连接发送流量的速率。首先,TCP拥塞控制机制让连接的每一端都记录一个额外的变量,叫拥塞窗口(Congwin),其限制了TCP发送方能向网络中发送流量的速率。而后TCP发送方定义一种丢包事件:要么出现超时,要么收到来自接收方的3个冗余ACK,来感知路径上的拥塞。接着就是在感知拥塞时,采用的发送速率的控制算法。有如下两种:

1)加性增,乘性减:在开始阶段,如果没有检测到拥塞,就缓慢地增加拥塞窗口的长度,谨慎地探测端到端路径上的可用带宽。也就是说TCP发送方在每次收到一个确认之后就将Congwin增加一个MSS(加性增)。而每发生一次丢包事件,就将当前的Congwin减半(乘性减)。曲线如下:

面试总结之拥塞控制与流量控制

2)慢启动:发送方在初始阶段以指数的速度增加速率,即每过一个RTT就将Congwin翻倍,直到达到某个阈值(Threshold),就按照加性增线性增长。直到发生一个丢包事件为止,将Congwin降为一半或降为1个MSS。如下图

面试总结之拥塞控制与流量控制