计网基础-TCP拥塞控制的方法
上篇文章讲的是拥塞的成因和代价
该篇,我们将学习如何进行拥塞拥塞控制
拥塞控制基本原理:
成因:太多的发送方以太快的速度发送了太多的数据
方法一(在传输层,端系统自己判断,TCP即采用此种方式):控制数据、网络的负载,管制发送方的发送速率
方法二(在网络层,路由器网络辅助方式):暂不考虑,可自行查询ATM ABR(available bit rate)拥塞控制、RM(resource management) cells相关知识
TCP拥塞控制
Sender限制发送速率?CongWin窗口!
LastByteSent - LastByteAcked <= CongWin拥塞窗口
rate = CongWin/RTT Bytes/sec
CongWin拥塞窗口
- 动态调整以改变发送速率rate?加性增乘性减,慢启动!
- 反映所感知到的拥塞控制
如何感知网络拥塞?Loss事件!
- 接收到3个Ack
- timeout超时
发生以上任意一种Loss事件后,发送方就要降低速率
如何合理地动态地调整发送速率?加性增乘性减,慢启动!
- 加性增-乘性减:AIMD
- 慢启动:SS
加性增乘性减AIMD
原理:逐渐增加发送速率,谨慎探测可用带宽,直到发生loss
方法:
additive increase:每个RTT将CongWin增大一个MSS——拥塞避免
multiplicative decrease:发生loss后将CongWin减半

慢启动SS
原因:当TCP连接刚开始创建的时候,初始值一般设置为1,很小,假如使用线性增长(加性增),则需要很长时间才能增长到一个可用的带宽,会造成浪费
方法(快速启动->):
初始时,CongWin=1,每个RTT将CongWin翻倍(收到每个ACK时进行操作)
初始速率虽然很慢,但增长速率很快攀升

改进:线性增长和加性增长进行切换?Threadhold变量!
Q:不可能一直指数增长,我们应该在某一个时间改为线性增长,那么何时应该把指数增长切换为线性增长(即进入拥塞避免阶段)?
A:当CongWin达到loss事件前值的1/2时,如下图第4sec、第12sec的时候

注意,在第9sec的时候,一个从1开始,一个从6开始,为什么呢?
- 原版本:乘性减,直接置为1
- Reno版本:减为(前值的)一半
Loss事件时使用的两种手段
- 3个重复的ACK:CongWin切为一半然后线性增长
- Timeout事件:CongWin直接置为1,指数增长,达到threadhold时,再线性增长

初始时,CongW=1

浙公网安备 33010602011771号