一、一般原理
(1)拥塞:某段时间内,对网络的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫拥塞。
(2)拥塞控制与流量控制的区别:拥塞控制就是防止过多的数据注入到网络中这样可以使网络中的路由器或链路不至于过载,拥塞控制有一个前提,就是网络能够承受现有的网络负荷,他是一个全局性过程。而流量控制往往是指点对点通信量的控制,是个端到端的问题。
(3)拥塞控制策略:当提供的负载达到某一数值,网络的吞吐量反而随提供的负载增大而下降,这时网络就进入了拥塞状态,当提供的负载继续增大到某一数值时网络的吞吐量就下降到0,网络无法正常工作,这就是死锁。
可以分为开环控制和闭环控制两种方法。开环控制:设计网络时事先将发生拥塞的有关因素考虑周到,一旦系统运行就不会中途更改了。闭环控制:基于反馈环路的概念,主要有以下措施,检测网络拥塞状况,把拥塞发生的信息传到可采取行动的地方,调整网络系统的运行。
二、拥塞控制方法
2.1 概述
TCP进行拥塞控制的算法有四种:慢开始,拥塞避免,快重传,快恢复。
发送方维持一个叫做拥塞窗口cwnd的状态变量,拥塞窗口大小取决于网络的拥塞程度,并且是动态变化的。发送方的发送窗口等于拥塞窗口。发送方在超时重传计时器启动时,就判断网络出现了拥塞。
2.2 慢开始算法
主机在已建立的TCP连接上开始发送数据时,由于不知道网络当前的负荷情况,可以由小到大逐渐增大拥塞窗口数值。先把cwnd设置为不超过2至4个发送方的最大报文段SMSS的数值,具体细则如下:
若SMSS>2190字节, 则设置初始拥塞窗口cwnd= 2 × S M S S 2 \times SMSS 2×SMSS字节,且不超过2个报文段。
若SMSS>1095字节且SMSS ≤ 2190 \leq 2190 ≤2190字节,则设置初始拥塞窗口cwnd= 3 × S M S S 3 \times SMSS 3×SMSS字节,且不超过3个报文段。
若SMSS ≤ 0951 \leq 0951 ≤0951字节, 则则设置初始拥塞窗口cwnd= 4 × S M S S 4 \times SMSS 4×SMSS字节,且不超过4个报文段。
每收到一个对新的报文段的确认,可以把拥塞窗口增加最多一个SMSS数值:拥塞窗口cwnd每次的增加量=min(N,SMSS)
,N是原先未被确认的,但现在被刚收到的确认报文段所确认的字节数。为了防止cwnd增长过大,还需设置一个慢开始门限ssthresh状态变量(可以设置的大一点),具体用法如下:
当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,停用慢开始算法改用拥塞避免算法。
当cwnd=ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法。
2.3 拥塞避免算法
目的是让拥塞窗口缓慢地增大。每经过一个往返时间RTT,发送方的拥塞窗口cwnd的大小就加1,而不是像慢开始阶段那样加倍增长,因此在拥塞避免阶段就称为加法增大AI,表明在拥塞避免阶段,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
图中的点4出现了一个新的情况,就是发送方一连收到了3个对同一个报文段得重复确认,有时个别报文段会在网络意外丢失,实际网络并未拥塞,发送方迟迟收不到确认会误以为发生了拥塞,这就导致发送方错误地启动慢开始,把cwnd设为1,不必要地减低了传输效率。
2.4 快重传算法
首先要求接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。快重传算法规定,发送方只要一连收到了3个重复确认,就可知道现在并未出现网络拥塞,而是接收方少收到了报文段,因而立即重传缺失的报文段。
图5-25中,一旦出现超时或3个重复的确认,就把门限值设置为当前拥塞窗口值的一半,大大减小拥塞窗口的数值,称为乘法减小MD,与加法增大AI合在一起称为AIMD算法。
2.5 快恢复算法
在图5-25中的点4,发送方知道丢失了个别的报文段,于是执行快恢复算法,调整门限值同时设置cwnd。也有的快恢复算法是把快恢复开始时的拥塞窗口cwnd值再增大一点(增大3个报文段的长度)。
2.6 接收方窗口
实际上接收方的缓存空间总是有限的,接收方根据自己的接受能力设定了接收方窗口rwnd,并把这个窗口值写入TCP首部中的窗口字段,传送给发送方,因此接收方窗口又称为通知窗口。因此,发送方的发送窗口一定不能超过对方给出的接收方窗口值rwnd
。发送方窗口的上限值=Min[rwnd,cwnd]
三、主动队列管理AQM
3.1 概述
由于路由器的队列长度有限,因此当队列满时,以后再到达的所有分组(如果能继续排队,这些分组都将排在队列的尾部)将被丢弃,这叫做尾部丢弃策略。主动队列管理AQM在路由器队列长度达到某个警惕的数值时就主动丢弃到达的分组。AQM可以有不同实现方法,最流行的是随机早期检测RED。
3.2 RED
实现RED需要路由器维持两个参数,即队列长度最小门限和最大门限。当每一个分组到达时,RED就按照规定的算法先计算当前平均队列长度。
若平均队列长度<最小门限,则把新到达的分组放入队列进行排队。
若平均队列长度>最大门限,则把新到达的分组丢弃。
若平均队列长度>最小门限且平均队列长度<最大门限,则按照某一丢弃概论p把新到达的分组丢弃。