文章内容概览
TCP的拥塞控制
当网络中的数据报文过多的时候,就会造成网络的拥塞
网络拥塞的根源
- 一条数据链路经过非常多的设备
- 数据链路的各个部分都可能成为网络传输的瓶颈(网络中各种路由器的性能可能不一样、或者传输媒介性能有差别)
- 网络对一些硬件设备的性能要求,大于可用资源,因此就导致了拥塞
TCP的拥塞控制和TCP的流量控制有什么区别?
- 流量控制考虑点对点的通信量控制(主要是通过窗口来控制通信量,考虑接收方的接收性能)
- 拥塞控制考虑整个网络,是全局性的考虑(它会感知到整个网络是否发生拥塞)
拥塞控制是一个很庞大的问题,因为它考虑到了整个网络,并且对于拥塞控制,很难有最优解。这里只对拥塞控制有一个简单的认识
如果要进行拥塞控制,首先需要有一个方法去判断网络是否发生拥塞。判断的方法简单粗暴,如果发送方发送的报文发生了超时,就认为网络发生了拥塞。但是,通过报文超时来判断网络是否一定拥塞是不成立的
如果在传输的某一个阶段,把光纤给断了,这个也会导致报文超时,这时就不是因为拥塞所造成的了,而是网络故障所造成的。所以,报文超时只是判断网络拥塞的一个方法(下边的内容先不考虑网络故障的情况)
拥塞控制的两个算法
慢启动算法
- 由小到大逐渐增加发送的数据量
- 每收到一个确认报文就增加(假如第一次收到了1个确认报文,下一次就发送2个报文;如果第二次收到2个确认报文,下一次就发送4个报文,依次1、2、4、8)
可以看到发送的报文是按指数增长的,指数增长的增长速率是非常快的。慢启动算法,它的指数增长会有一个阈值,称为慢启动阈值(ssthresh),增长到这个慢启动阈值之后就不再增长了。增长到这个阈值之后,它就会进行第二个算法
拥塞避免算法
- 维护一个拥塞窗口的变量(这个变量大于慢启动阈值)
- 只要网络不拥塞(即只要报文不超时),就试探着增大拥塞窗口(每次加一)
假设慢启动到达了阈值(假设是16),此时就会启动拥塞避免算法,它会试探着将拥塞窗口调大,如果16个报文都收到了确认,它就会再发送17个报文,如果没有发生超时,下一次就会发送18个报文。一直这样一个一个的调大,直到发生拥塞。这就是拥塞避免算法
拥塞避免算法可以保证在网络不发生拥塞的情况下,更多的发送数据
这是一张慢启动算法和拥塞避免算法的图(纵坐标:每一次发送数据报文的数量;横坐标:发送的轮次)
在到达阈值之前,数据报文的数量是指数增长的。当数据报文的数量达到阈值的时候就会启动拥塞避免算法,之后数据报文的数量就是线性增长的