写点什么

TCP 拥塞控制四种算法

用户头像
赖猫
关注
发布于: 2021 年 03 月 15 日

TCP 拥塞控制


当网络数据传输过程中出现拥塞时,分组将会丢失,但此时发送方会继续重传从而导致网络拥塞程度升高。因此当发送拥塞时,应当控制发送方的速率


  • 控制拥塞是为了降低网络拥塞程度

  • 流量控制是为了让接收方来得及接收数据



TCP 拥塞控制的四个算法


  • 慢开始

  • 拥塞避免

  • 快重传

  • 快恢复


发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量


拥塞窗口只是一个状态变量,控制发送报文段个数。真正决定传输速率的是发送方的滑动窗口



慢开始


发送方发送数据的最初执行是慢开始,令 cwnd=1,发送方只能发送一个报文段。当收到接收方的确认信息后,将 cwnd 加倍(2、4、8、16……)


拥塞避免


拥塞避免是在慢开始的基础上,由于慢开始到后面数据传输量依然很大,增长非常快,网络拥塞概率增高,故设置一个门限 ssthresh。当 cwnd>ssthresh 时,进入拥塞避免,每一次 cwnd 不再成倍增加而是 +1


若出现超时,则令 ssthresh = cwnd/2,然后重新执行慢开始算法


即降低门限为当前超时的拥塞窗口值一半


快重传


接收方会对最后一个已收到的有序报文段进行确认,当连续回复三个相同的确认消息时,说明其下一个报文段丢失了,发送方执行快重传



快恢复


快恢复是在快重传的现象下,为了避免拥塞,对 cwnd 进行了设置


虽然出现了报文段丢失,但发送方并不觉得此时已经发生了拥塞,此时并不执行慢开始算法(cwnd=1),而是将 cwnd 设置为门限的一半,然后逐次+1


快恢复就是在快重传的情况下,将 cwnd 设置为门限的一半进行数据传输


总结


慢开始和拥塞避免是一组,拥塞避免是为了在慢开始算法中预防网络拥塞,设置了一个门限


快重传和快恢复是一组,快恢复是为了在快重传算法中避免网络拥塞,对 cwnd 进行了设置


Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、大厂面试题、和热门技术教学视频资料共享在里面(包括 C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK 等等.),有需要的可以自行添加哦!~


以上不足的地方欢迎指出讨论。


用户头像

赖猫

关注

还未添加个人签名 2020.11.28 加入

纸上得来终觉浅,绝知此事要躬行

评论

发布
暂无评论
TCP拥塞控制四种算法