TCP 拥塞控制
虽然网络层也试图管理拥塞,但是,大多数繁重的任务是由TCP来完成的,因为针对拥塞的真正解决方案是减慢数据率
分组守恒:当有一个老的分组离开之后才允许新的分组注入网络
TCP希望通过动态维护窗口大小来实现这个目标
拥塞检测 (Congestion detection)
所有的互联网TCP算法都假定超时是由拥塞引起的,并且通过监视超时的情况来判断是否出现问题
拥塞控制 (Congestion prevention)
当一个连接建立的时候,双方选择一个合适的窗口大小,接收方根据自己的缓冲区大小来指定窗口的大小。
如果发送者遵守此窗口大小的限制,则接收端不会出现缓冲区溢出的问题,但可能由于网络内部的拥塞而发生问题
互联网解决方案应该是认识到两个潜在的问题的:网络容量,接收者容量,然后单独地处理这两个问题
为此,每个发送者维护两个窗口:
接收者窗口 大小反映了目前窗口的容量 (容易控制)
拥塞窗口 大小反映了网络目前的容量(难于控制)
发送者发送的数据字节数是两个窗口中小的那个窗口数
决定拥塞窗口的大小
慢启动算法(Slow Start) (尝试的过程):
当连接建立的时候,发送者用当前使用的最大数据段长度初始化拥塞窗口,然后发送一个最大的数据段
如果在定时器超期之前收到确认,则将拥塞窗口翻倍,然后发送两个数据段……直至超时(或达到接收方窗口的大小)
确定出拥塞窗口的大小
如:如果试图发送 4096 字节没有问题,但是发送8192字节的时候,超时没有收到应答,则拥塞窗口设为4096个字节
慢速启动算法
按指数增长趋势定义拥塞窗口大小cwnd
初始:cwnd0 = MaxSegL(当前数据段长度)
增长:cwnd1 = 2 cwnd0
cwnd2 = 2 cwnd1
• • •
截止:达到接收窗口大小或超时
慢速启动算法图例
TCP 拥塞控制
除了使用接收者窗口和拥塞窗口,TCP拥塞控制还是用了第三个参数,阈值(threshold),初始化为64K
当一个超时发生的时候,阈值降为当前拥塞窗口的一半,同时将拥塞窗口设为一个最大数据段的长度
使用慢启动算法来决定网络的容量,拥塞窗口增长到阈值时停止指数增长
从这个点开始,每次成功的传输都会让拥塞窗口线性增长(即每次仅增长一个最大的数据段长度)
拥塞控制算法-CWin指数增长
拥塞控制算法- cwnd线性增长
拥塞控制算法-重新慢速启动
注意
快速恢复
拥塞控制算法
定义初始拥塞窗口阈值和窗口大小
Threshold 0 和 cwnd 0
初始超时
拥塞窗口阈值减半:Threshold1 = CWND / 2
cwnd二进制指数增长至确认超时
cwnd线性增长至确认超时
拥塞窗口值减半:Threshold n = CWND n / 2
定义窗口大小:cwnd = cwnd 0
重新开始慢速启动过程
注意
如果收到一个ICMP抑制分组( ICMP source quench)并被送给TCP传输实体 ,则这个事件被当作超时对待
小结:
TCP拥塞控制遵循分组守恒定律
两种因素引起拥塞警报
接收方处理不过来
通信子网中出现拥塞
处理拥塞的具体方法
Window size
Congestion window
CWND通过慢起动方法尝试而来
通过阈值调节CWND尝试的精度