拥塞控制算法由于滑动窗口仅考虑接收方的接收能力不考虑网络因素,网络带宽是共享的,网络延时是抖动的,网络的变化带来的问题势必会造成整个系统的崩溃,这就像两个火车站运输货物,仅考虑火车站的容纳量,不考虑火车轨道的承载能力,火车车次发的再多可能也是堵在轨道上,还可能导致轨道系统瘫痪 。
拥塞控制算法是发送方根据当前网络情况调整发包速率的流量控制机制,TCP中拥塞控制算法发展至今,从经典的reno到google近年来提出的bbr,期间不断有新的拥塞控制算法提出来,拥塞控制也形成了如下RFC 。
RFC5681
https://datatracker.ietf.org/doc/html/rfc5681
以linux内核为例,最新的内核版本内部实现了十多种拥塞控制算法实现,包括一些比较新的算法实现(比如bbr),linux较早版本内核使用reno,linux 2.6.8以后默认采用bic算法,linux 2.6.19以后又默认使用了cubic算法,目前linux 5.x依然默认使用cubic算法,windows同样也是支持多种拥塞控制算法的,目前windows11默认也是使用cubic算法 。
拥塞算法原理(reno为例)TCP拥塞算法整体框架基本一致,以经典的TCP reno拥塞控制算法(教科书通常讲的版本)进行简要介绍,TCP拥塞控制RFC5681规定都包含慢启动、拥塞避免、快重传、快恢复阶段,这又涉及到几个基本参数(cwnd、ssthresh),cwnd指拥塞窗口的大小,决定了一次发送多少数据包,ssthresh指慢启动阈值 。
- 慢启动
RFC3465
https://datatracker.ietf.org/doc/html/rfc3465
RFC3742
https://datatracker.ietf.org/doc/html/rfc3742
首次慢启动最初初始ssthresh都是设置为一个很大的值,这样直到丢包才会进入拥塞避免,后又出现了hystart优化(混合慢启动),比如预测出理想的ssthresh,从而让首次慢启动不至于丢包才进入拥塞避免(丢包代价太大) 。
- 拥塞避免
- 快重传
- 快恢复
reno拥塞控制算法状态图如下


reno算法iperf打流wireshark抓包io图如下:

拥塞算法对比拥塞控制算法主要是基于网络丢包和延迟(RTT)来实现,所以有的算法丢包敏感,有的算法延迟敏感,有的结合丢包和延迟,不同的算法主要的区别可能在于拥塞避免阶段如何去拟合理想发送速率曲线又不至于丢包,如下
推荐阅读
- 网络高清播放器怎么用 网络播放器的使用方法
- 网络电话呼叫软件免费版 免费网络电话无限打
- led显示屏控制软件app led电子屏软件
- 加油站模拟器清洁度脚印怎么控制 加油站模拟器清洁度脚印
- 怎样安全利用网络 安全使用网络的方法
- cpu风扇控制软件 台式机风扇调速软件
- 测试下载速度 专业网络测试工具
- arduino舵机转动程序 arduino控制舵机代码
- 行业网站推广方案 网络推广营销策划方案
- 网络实名认证怎么弄 微信实名认证操作
