经过复习自己的计算机网络书籍的总结TCP拥塞控制
一.慢开始算法:
1.送方维持个“拥塞窗口( cwnd, congestion window)”的变量,单位为MSS (最大报文段送方维持个“拥塞窗口( cwnd, congestion window)”的变量,单位为MSS (最大报文段长度,1046) 发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥寨窗口,cwnd和rwnd的最 小值决定了数据传送。
2.当发送方开始发送数据时,选择发送1个字节的试探报文,避免一下将大量字节发送到网络,造成拥塞
3.当收到确认后,就发送2个字节的报文:
4.若再次收到2个字节的确认,则发送4个字节,依次递增2的指数级:
5.最后会达到一个提前预设的“慢开始门限(ssthresh)",比如24.即一次发送了24个MSS.此时遵循下面的条件判断;
1)cwnd < ssthreash,继续满开始算法;
2)cwnd>ssthresh,停止使用慢开始算法,改用拥塞避免算法:
3)cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
二.拥塞避免:
1.加法增大:每经过”个往返时间RTT(Round-TripTime), 拥塞窗口+1, 即让拥磨窗口缓慢地增大, 按照线性规律增长
2.乘法减小当出现网络拥塞。比如去包时,将慢开始门限(ssthresh)设为原先的半, 然后将cwnd设为1.执行慢开始算法(较低的起点,指数级增长) :
三.快重传和快恢复:
快重传和快恢复则是为了减少因为拥寒导致的数据包丢失带来的重传时间。快重传的机制是:
1)接收方如果一个包丢失,则对后续的包继续发送针对该包的重传请求(什么意思呢?例如收到了序号位 4 6的包但是序号位5的包没有收到,那就要重传 4 以后的所有包)
2) 一旦发送方接收到三个一样的确认(连续的4个相同的ACK.标志着1个数据段已丢失) ,就知道 该包之后出现了错误,立刘重传该包:
3) 此时发送方开始执行“快恢复”算法,
4) 慢开始门限碱半:
5) cwnd设为慢开始门限诚半后的数值:
6) 执行拥塞避免算法(高起点,线性增长):
更多的C/C++ linux编程我会在下面的文章中陆续的分享,也可以关注‘奇牛学院’
来一起讨论