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