TCP拥塞控制:优化网络性能的关键
在上面介绍了滑动窗口,它反映了接收端的处理能力,但不能反映出当前网络拥堵环境。所以接下来介绍的是发送端的拥塞窗口。
拥塞控制的核心任务是根据网络状况和接收端的处理能力来控制数据传输的速率,以防止网络拥塞和数据丢失。
在本文中,我们将深入探讨TCP的拥塞控制机制,包括拥塞窗口、慢开始、拥塞避免、快重传和快恢复。
# 拥塞窗口
拥塞窗口其实就是对于发送窗口的限制, 来控制目前自己能传输数据量的大小。
所以发送窗口收到两个窗口状态的限制,拥塞窗口cwnd和接收窗口rwnd
那么发送窗口大小公式是: min(cwnd, rwnd)
如果说流量控制是控制滑动窗口大小,那么拥塞控制就是控制拥塞窗口的大小。
# 拥塞控制算法
TCP使用多种算法来控制拥塞窗口的大小,以适应不同的网络环境和情况,涉及的算法大概有三个:
- 慢开始
- 拥塞避免
- 快重传和快恢复
# 慢开始
慢开始是一种启动拥塞控制的算法,其目的是逐渐增加拥塞窗口以探测当前网络的可用带宽。慢开始的过程如下:
- TCP握手连接
- 初始化拥塞窗口,假设为1
- 双方开始传输数据,每次收到一次确认回复ACK,则拥塞窗口大小+1,所以每过一次数据轮换RTT,拥塞窗口大小*2。第一轮:2,第二轮:4,第三轮:8,以此类推,成2的指数级增长。
但增长到慢开始阈值的时候,增长的速度就会慢下来,这时候就进入拥塞避免算法。
# 拥塞避免
当拥塞窗口大小达到慢开始阈值后,拥塞避免算法生效。此时,拥塞窗口的增长速度从指数级变为线性增长,由速率由原来的+1/ACK变成+(1/cwnd)/ACK,即往返时间(RTT)只增加一个单位而不是每收到一次ACK,就+1,这有助于防止过多的数据注入到网络中,减轻了网络拥塞的可能性。
# 快重传和快恢复
快重传
快重传是一种用于检测丢失数据包并快速进行重传的机制。当接收端连续收到相同的三个重复的ACK时,它会立即通知发送端重传丢失的数据包,而不必等待超时。
比如:需要传输1-2-3-4-5数据,3号包丢了,其他全部到达,则接收方会返回1-2-2-2-2的序号回去,当发送端接收到3个重复的ACK序号的时候,就能知道哪个数据丢包了,马上进行重传,而不需要等待超时重传时间。
如果ACK在网络中也丢包
如果一直没有收到ACK,则达到超时时间后,对丢失的3号包进行重传。如果全部已经到达,但只有3,4包的ACK丢失了,只收到5号包的ACK的话,那么发送端就认为接收方已经接受所有数据。因为收到5号包的ACK就表示,全部数据已经收到,否则只有回复丢失包的前一个序号2。
如果只丢失了3号包,4,5号包需要重传吗?
不需要,这就是选择性重传的机制,接收端会在报文头部中加上SACK的属性,告诉发送端那些数据区间已经收到了,只需要让它再次传输丢失的包即可。
快恢复
在快重传的介绍中,当收到3个重复的ACK的时候,就会意识到丢包,感觉网络环境不好,这时候就会进入快恢复的阶段
- 慢开始阈值减半。
- cwnd的值变成阈值+3。注:+3是因为收到3个重复的ACK,表明已经有3个数据包丢失在网络了
- cwnd继续进行拥塞避免的状态,每次线性增加。
# 总结
拥塞控制是TCP协议的一个关键部分,它通过调整拥塞窗口的大小来控制数据传输的速率,以确保网络的高效性和可靠性。不同的拥塞控制算法适用于不同的网络环境和条件,它们共同协作,使TCP成为一种强大而可靠的传输协议。理解拥塞控制的工作原理对于网络性能的优化至关重要。