这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。
这篇文章主要深入学习TCP的拥塞控制。
拥塞控制
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等
而TCP的机制又会重传数据,因此情况越来越糟,于是拥塞控制是很有用的 (包含慢启动、拥塞避免、快重传、快恢复)
拥塞窗口
拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。
拥塞窗口 cwnd 变化的规则:
- 只要网络中没有出现拥塞,cwnd 就会增大;
- 但网络中出现了拥塞,cwnd 就减少;
因此:发送方将拥塞窗口视为发送窗口,即swnd=cwnd
慢启动
TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量
慢启动的算规则:
- 当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。 (因为swnd=cwnd,于是cwnd是指数增加的)
慢启动什么时候开始?
有一个叫慢启动门限 ssthresh (slow start threshold)状态变量。
- 当 cwnd < ssthresh 时,使用慢启动算法。
- 当 cwnd >= ssthresh 时,就会使用**「拥塞避免算法」**
拥塞避免算法
进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1。
就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。当触发了重传机制,也就进入了「拥塞发生算法」。
快重传
当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:
- 超时重传
- 快速重传
而重传机制的不同,会导致【拥塞发生】时,具体的算法也不同。
比如是「超时重传」,拥塞发生算法是这样的:
- ssthresh 设为 cwnd/2,
- cwnd 重置为 1
- 接着重新开始慢开始算法