《linux高性能服务器编程》学习笔记(二)之拥塞控制

来源:互联网 发布:电脑怎样编程软件 编辑:程序博客网 时间:2024/06/06 01:20

上一篇写着写着电脑就崩了,估计嫌我太罗嗦了啦哈哈哈
换个地方继续罗嗦,可可,我就是这么一个罗嗦的人~~~~啦啦啦
今天让我们接着上篇开始唠叨.
拥塞控制:
由于接收方缓存的限制,发送窗口不能大于接收方接收窗口。在报文段首部有一个字段就叫做窗口(rwnd),这便是用于告诉对方自己的接收窗口,可见窗口的大小是可以变化的。

那么窗口的大小是如何变化的呢?TCP 对于拥塞的控制总结为“慢启动、加性增、乘性减”,如图所示:这里写图片描述
慢启动 :初始的窗口值很小,但是按指数规律渐渐增长,直到达到慢开始门限(ssthresh)。
CWND +=min(N,SMSS);
慢启动算法的理由是,TCP模块刚开始发送数据时并不知道网络的实际情况,需要用一种试探的方式平滑地增加CWND的大小.
拥塞避免:
使得CWND按照线性方式增加,从而减缓其扩大
两种实现方式:
每个RTT时间内按照上式计算新的CWND,而不论该RTT时间内发送端收到多少个确认.
每收到一个对新数据的确认报文段,就按照下式来更新CWND .CWND +=SMSS*SMSS/CWND.
发送端判断拥塞发生的依据有:
传输超时,或者说TCP重传定时器溢出
接受到重复的确认报文段.
快速重传和快速恢复:
发送端如果连续收到3个重复的确认报文段,就认为是拥塞完成了,然后它启用快速重传和快速恢复算法来处理拥塞.
过程如下:
1. 当 收到三个重复的确认报文段时,按照CWND=ssthresh+3*SMSS;
2. 每次收到一个重复的确认时,设置CWND = CWND+SMSS.此时发送端可以发送新的TCP报文段(如果新的CWND允许的话).
3. 当收到新数据的确认时,设置CWND = ssthresh(ssthresh是新的慢启动门限值).
快速冲传和快速回复完成之后,拥塞控制将恢复到拥塞避免阶段.

0 0