TCP拥塞控制
最近被问了好几次拥塞控制了,答得不太好,总结反思一下
滑动窗口和流量控制
TCP 利用滑动窗⼝实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报⽂中的窗口字段可以⽤来控制发送方窗口大小,从而影响发送⽅的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
TCP 主要通过四个算法来进行拥塞控制:
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
为了进⾏拥塞控制,TCP 发送方要维持一个拥塞窗口(cwnd)的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的⼀个。
注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
- 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍(指数增长2^n)。
何时结束增长:如果出现丢包事件,TCP发送方将cwnd设置为1,并重新开始慢启动的过程。并将慢启动阈值(ssthresh)设置为增长结束时的cwnd的一半,即ssthresh = cwnd/2。当cwnd再次指数增长,当达到或超过ssthresh时,结束慢启动,并转移到拥塞避免模式。
- 拥塞避免: 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1.
随着cwnd增加,再次出现丢包现象时,我们将进入快重传与快恢复的方式。
- 快重传: 在传输过程中,个别报文段会发生丢失,然而网络并未发生拥塞。快重传能快速恢复丢失的数据包,可以避免发送方错误的启动慢开始。
如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。
当有单独的数据包丢失时,快重传和快恢复能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
- 快恢复: 快恢复主要是当出现个别数据包丢失时,发送方知道只是丢失了个别报文段,会启动拥塞避免,而不是慢开始。