31-tcp协议——拥塞控制

1. 为什么会有流量控制

  简单来说,流量控制可以让发送方根据接收方实际接收数据的能力,来控制发送的数据量,这样做的目的是为了防止发送方发送数据过于频繁,导致接收方对于大量的数据处理不过来。

  tcp使用了滑动窗口来进行流量控制:一个是发送方的发送窗口,另一个是接收方的接收窗口。也就是说,当接收方在接收发送方发送的数据时,发送方发送数据的速度和接收方接收数据的速度应该达到某种平衡(在前面的学习tcp首部时已经详细介绍过窗口字段了,这里就不再多做解释)。

  拿tcp连接建立的例子来说,从A跟B在建立tcp连接时,双方都发送了自己的接收窗口大小并通告对方,然后双方再根据接收到的接收窗口大小来设置自己的发送窗口大小(具体例子参考19篇中的tcp连接建立:19-tcp连接建立)。

  注意:这个窗口的大小是动态变化的,虽然在建立tcp连接时窗口是固定的,但是当开始接收或发送数据时,窗口就会随着增大或减小。比如,当接收方一直在接收数据时,通告的接收窗口大小就有可能减小到0,即当接收缓冲区数据满时,必须等待应用进程从该缓冲区读取数据,才能继续接收数据,而发送方接收到接收方的窗口为0时,也会设置发送窗口为0,暂时停止发送数据。

  一般来说,这是由于当时网络的环境不稳定,出现拥塞而导致的情况。


2. 拥塞控制

  相信大家对上下班高峰期的交通拥堵应该深有体会吧,同样是上下班高峰期,有的路口的车流量比较少,基本上不会产生交通拥堵;但是有的路口红绿灯比较多,车流量又非常大(即开往这个路口的车辆比较多),而每次绿灯通过的车辆远远没有开往这个路口的车辆多,然后就会出现大量的车堵在这个路口排成长队,出现交通拥堵。

  这个时候就会有人检测到这个路口出现交通拥堵,然后赶过来指挥交通解决拥堵的问题,但是不能每次都在拥堵后,再来解决问题,因此就有了各种交通规则来保障交通的畅通。

  再来看网络拥塞,也是一样的道理,计算机的网络是处于一个共享的环境,如果发送到网络中的数据流量超过链路或路由交换设备的处理范围(因为这些路由,交换设备在处理数据都会有一个先存储,再转发的过程),那些来不及转发的数据包将会被丢弃,因此就有可能造成拥塞情况。

31-tcp协议——拥塞控制
图1-网络拥塞

  在上图中,R1->R2链路的带宽是500M,最多能处理500M的数据流量,如果R1向R2发送了600M的数据流量,超过了这条链路的处理能力,那么在R1->R2这条链路就会出现拥塞,多出来的数据将会被丢弃。

  同理,如果R1向R3也发送了600M的数据流量,由于R1->R3链路的带宽是800M,最多能处理800M的数据流量,因此R1->R3就不会出现拥塞的情况。

  在上面的例子中我们知道,只要发送的数据不超过所在网络的处理范围,那么就不会出现网络拥塞,当然,这只是在理想状态下来考虑拥塞控制。然而在现实中的出现网络拥塞的因素有很多,以上描述的只是其中一种,也就是说,网络拥塞本质上是一个动态,比较复杂的问题,而网络拥塞控制又是非常难的。

  因此RFC规定了拥塞控制的四种算法:即慢开始,拥塞避免,快速重传,快速恢复这四种算法。