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