拥塞控制和流量控制
流量控制的目的:
如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。
TCP的流量控制是利用滑动窗口机制实现的,滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。接收方在返回的数据中会包含自己的接收窗口的大小,以控制发送方的数据发送。
拥塞控制:拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
拥塞控制和流量控制的区别
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
拥塞控制就是防止这种现象的发生,或者缓解拥堵问题。
实现原理:四种算法(慢开始,拥塞避免、快重传、快恢复)
发送方会维持一个拥塞窗口(动态变化),拥塞窗口的大小代表着网络的拥塞程度。发送方的滑动窗口小于等于该拥塞窗口。
一:慢开始
发送方先探测一下网络的拥塞程度,并不是一开始就发送大量的数据,然后根据拥塞程度慢慢的增大或减小拥塞窗口
二:拥塞避免
该算法用来控制拥塞窗口的增长速率,每一次 RTT 往返之后,拥塞窗口 + 1 而不是翻倍,这样的话拥塞窗口以线性速率增长,流量可控。
三:快重传
当发送方没有在超时期限内收到确认信号的话就认为网络阻塞了,此时拥塞窗口变为 1 ,同时把慢开始门限值 ssthresh 减半。
拥塞窗口大小 < ssthresh 时,使用慢开始算法
拥塞窗口大小 > ssthresh 时,使用拥塞避免算法
拥塞窗口大小 = ssthresh 时,慢开始与拥塞避免算法均可
接收方收到一个失序的报文段后就立刻发出重复确认,如下图,M3丢失,会重复确认 M2
一旦接收方连续 3 次收到同一个重复确认就会立马启动快重传算法,即立马重传 M3,而不会等待 M3 的超时时间到期
四:快恢复
快恢复是配合快重传使用的。
上图所示的 M3 丢失,可能是因为 M3 在某个节点因为网络波动等非网络拥挤情况阻塞住了。
也就是网络其实并没有拥塞,快恢复就是在此情况下避免直接重传会真正导致网络阻塞,其原理就是先将拥塞窗口设置成 ssthresh 的大小,然后执行拥塞避免算法
下图展示了整个控制流程: