1.拥塞的定义
计算机网络中的带宽,交换机中的缓存和处理机等,都是网络的资源。在某段时间,若对网络的资源超过了该资源所能承载的可用部分,网络性能会变差,这就是拥塞。
2.拥塞控制
拥塞控制就是防止过多的数据注入网络中。拥塞控制是一个全局性的过程,与流量控制不同,流量控制是端对端通信的控制。
2.1.慢开始
发送方维持一个拥塞窗口cwnd的状态变量。拥塞窗口的大小取决于网络带宽的拥塞程度,并且是在动态变化。发送方让自己的发送窗口等于拥塞窗口,但是考虑到接收方部分,发送窗口可能小于拥塞窗口。
慢开始:算法思想是一开始不要发送大量数据,而是慢慢的对网络进行一个试探,也就是从小到大慢慢递增(2的幂数)。当接收到接收方确认的数据报时则进行加倍。
为了防止拥塞窗口cwnd增长过快导致拥塞,所以设定了一个慢开始门限(阈值)ssthresh。
- cwnd < ssthresh时,使用慢开始
- cwnd = ssthresh时,使用慢开始或者拥塞避免都行
- cwnd > ssthresh时,使用拥塞避免
2.2.拥塞避免
拥塞避免是指发送端每收到一个接收端一个确认报文时,将拥塞窗口+1,使其缓慢增长。
无论是处于慢开始或者拥塞避免阶段,只要发送方判断网络出现拥塞(通过判断是否接收到发送方的确认报文,虽然可能是其他原因的分组丢失,但是当做拥塞处理),之后的话会把慢开始门限(阈值)ssthresh设置为发生拥塞时的窗口大小的一半,然后把拥塞窗口cwnd设置为1,之后就从慢开始阶段开始。
快重传和快恢复
快重传:要求接收方当收到一个失序的报文就立即发出重复确认(为了让发送方尽早知道报文没有到达接收方),而不是等自己发送数据时顺带着确认。根据快重传算法,如果当发送方连着接受到了三个重复确认的报文则应该立即重传而不是等待设置重传计时器。
快重传配合快快恢复算法,有一下两点:
- 当发送方连续收到三个确认时,则将ssthresh等于当前cwnd的大小的一半。
- 考虑到发送方能够连续收到三个确认,那么应该说明此时的网络环境没有出现拥塞,所以不采用慢开始的方式,将cwnd值等于ssthresh,执行拥塞避免算法。
流量控制
对接收端和发送端的流量控制,一般使用滑动窗口来解决。
滑动窗口
滑动窗口是指针对于发送方和接收方对数据的处理速度不同设计的。
1.发送端连发送了三条消息,ACK=3,窗口SIZE = 3。
2.接收端收到了两条消息,所以此时ACK=3,窗口SIZE = 2。
3.发送端收到ACK=3代表第三个消息丢失,所以需要重传。
每次发送需要携带自己的窗口剩余大小。
ARQ协议(滑动窗口协议)
1.停止等待ARQ(stop and wait):当发送窗口和接收窗口都为1时。即发送报文开始等待回复ACK并开始计时,当超过一定时间以后进行重发,直到收到ACK为止。
2.后退N帧ARQ:发送窗口>1,接收窗口=1。当发送端接收到接收到的报文错误以后,就会重发发送之前的n个报文。
举例:比如此时发送1-8报文,1,2接收成功,发送端接收到3出现故障,但是此时可以已经发送完毕,则此时需要从3开始重新发送,并且将3后的报文丢弃。
3.选择重传ARQ:发送窗口>1,接收窗口>1,发送端每发送一个报文都会设置一个计时器,当超时则选择进行重传。(避免重复发送正确的报文)