由于TCP协议向应用层提供不定长的字节流发送方法,使得TCP协议先天性的就有意愿占满网络中的整个带宽,但是网络中许多TCP连接同时去试图占满整个带宽的时候就有可能发生恶心拥塞事件,而TCP的拥塞控制算法则是非常有必要的,能够有效的降低网络当中的拥塞,提升所有TCP的发送速度。
全局思考:拥塞控制
•
慢启动
•
拥塞避免
•
快速重传
•
快速恢复
在网络拓扑中可以看到左边的client向右边的server进行链路通信的时候,这条链路的带宽是1000M每秒,理想条件下没有达到1000M的时候是缓慢上升,到了1000M是保持在这样一个水平,但是实际上是达不到的。
比如从R1过来的流量是700M每秒,从R2过来的流量是600M每秒,实际上R3能够传出的流量是1000M每秒,所以一定有300M每秒的数据被R3丢弃了。
当R3发生丢掉过载的数据包的时候,R3的队列也会非常的长,使得每一个报文在网络当中呆的时间也会更加长,RTT时延也会过长,当轻度拥塞的时候吞吐量已经下降了,当重度拥塞的时候网络是非常糟糕的。
而拥塞控制实际上是包含了4个部分, 慢启动,拥塞避免,快速重传,快速恢复。
慢启动
慢启动当中定义了一个概念叫做拥塞窗口,
- 拥塞窗口 cwnd(congestion window)
- 通告窗口 rwnd(receiver‘s advertised window,也就是对方的接受窗口)
- 发送窗口 swnd = min(cwnd,rwnd)(等于对方的接受窗口和拥塞窗口的最小值)
- 每收到一个ACK,cwnd扩充一倍(最初只有一个mss,当我收到了ack之后,没有发生丢包,然后扩展为2个cwnd,同理收到之后4个cwnd,以指数级别的快速的去上升)
慢启动在解决什么问题呢,也就是我不清楚当前的网络状态是不是已经非常繁忙了,所以我先悠着点,少发一点,当我确定网络中没有丢包的时候,那么我再去快速的增加我的拥塞窗口,这就是慢启动的意义所在。