TCP拥塞控制原理
一、何为拥塞
路由器无法处理高速到达的数据而被迫丢弃数据的现象叫做拥塞。
二、何为拥塞控制
TCP流量控制时为了平衡一个链接中接收方和发送方的速度匹配问题,当发送方发现发送速度大于接收方的接收速度时动态调整发送速度。
但是成千上万的TCP链接共享着整个网络基础设施,当网络上这些TCP都在传输数据时,网络有可能就会拥塞,TCP的拥塞控制就是在传输自己数据的同时实时掌握整个网络的负载,然后基于整个网络的负载来动态调整自己的发送速度。
三、网络拥塞的开销
拥塞时路由器丢失数据,丢失后基于可靠性传输的机制,发送方会重传数据,重传会再次加大网络负载,导致更大的开销。
在多路由器的情况下,会导致更大的资源浪费,比如数据有A传递到B经过了三个路由器,结果被第三个路由器给丢弃了。这样前两个路由器的工作全被白白浪费。如下图所示,R3拥塞,A--》B的数据到达R3之后最终被丢弃了,R1、R2的工作被白白浪费。

由此可见,拥塞控制势在必行。
四、拥塞控制的基本方法
4.1 端到端的拥塞控制
网络层不提供拥塞控制机制,主要依靠端系统对网络的观察来调整发送的速度最终完成拥塞的控制(比如端系统通过观察丢包的情况来判断)。TCP/IP就是通过端到端的方法来解决拥塞控制(让TCP来控制,IP不管)。
核心:观察,感知,调整,解决。TCP的拥塞控制方法。
4.2 网络辅助的拥塞控制
由路由器告知发送方网络是否拥塞,主要两种:
- 路由器直接高速发送方网络状况
- 当发送拥塞时,路由器在当前报文中标识拥塞,当接收方拿到这个拥塞标识后,由接收方告知发送方网络拥塞,这种方式至少要一个RTT发送方才能知道拥塞。
报文不详细展开。
五、TCP拥塞控制方法
TCP拥塞控制属于端到端的控制方法,其核心便是观察感知网络的拥塞状态,然后调整发送速度。在TCP中引入了拥塞窗口(cwnd:congestion window),流量控制中引入了接收窗口(rwnd:receive window)。最终TCP的发送窗口为min{cwnd,rwnd}。
5.1 如何感知网络?
对于TCP来说核心两点:
- 丢包(超时,或者三次冗余ack)就代表网络拥塞,需要减少cwnd的size。
- 确认代表网络畅通,可以加大cwnd的size。确认的越快cwnd增加的越快(反之亦然)。自计时(self-clocking)
下面的即将要介绍的几个方法都是基于上面的两个核心来展开的。
5.2 慢启动(Slow Start)
慢启动就是TCP启动后的发送速度慢慢的进行提速,这样才能便于感知网络的状况。
慢启动的核心算法:
- 刚开始cwnd=1个MSS(max segment size)
- 每当收到一个ack,cwnd=cwnd+1。这样每过一个RTT。cwnd便会翻倍:cwnd=cwnd*2,这是指数级增加
- 当cwnd=ssthresh(慢启动阈值,slow start threshold)时,停止指数级增加,进入避免拥塞流程。


5.3 拥塞避免
慢启动时cwnd时指数级增长,当增长的到ssthresh后便进入避免拥塞。避免拥塞算法比较简单:
- 每收到一个ack,cwnd=cwnd+1/cwnd;
- 由此可见,每过一个RTT。cwnd=cwnd+1
可见拥塞避免算法实际是将cwnd的增长由指数级增长变为了一个线性缓慢增长。如下图所示。

5.4 拥塞发生(感知到拥塞)
TCP认为发生拥塞由两种情况:
- 超时
- 收到连续三次相同的ACK(快速重传的场景)
5.4.1 超时
TCP超时后的具体动作:
- ssthresh=cwnd/2
- cwnd=1
- 进入慢启动流程

5.4.2 连续三次相同的ACK
- 进入快速恢复流程
5.5 快速恢复
收到三次连续相同的ACK,说明产生了丢包,但是能收到ACK,说明超时相对不是那么严重。所以针对这种情况,TCP的做法没有超时那么激进:
- ssthresh=cwnd
- cwnd=cwnd/2+3,3代表连续收到了3个ACK,累加三个窗口大小。
- 进入拥塞避免流程

以上介绍了TCP拥塞控制的一个整体过程。本文完。
TCP拥塞控制原理的更多相关文章
- TCP拥塞控制算法纵横谈-Illinois和YeAH
周五晚上.终于下了雨.所以也终于能够乱七八糟多写点松散的东西了... 方法论问题. 这个题目太大以至于内容和题目的关联看起来有失偏颇.只是也无所谓,既然被人以为"没有方法论"而歧视 ...
- Linux TCP拥塞控制算法原理解析
这里只是简单梳理TCP各版本的控制原理,对于基本的变量定义,可以参考以下链接: TCP基本拥塞控制http://blog.csdn.net/sicofield/article/details/9708 ...
- TCP拥塞控制算法 优缺点 适用环境 性能分析
[摘要]对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点.以及它们的适用环境. [关键字]TCP拥塞控制算法 优点 缺点 适用环境公平性 公平性 公平性是在发生拥塞时各源端(或同一源端 ...
- 网络拥塞控制(三) TCP拥塞控制算法
为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制.最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion ...
- TCP拥塞处理—Congestion Handing
TCP拥塞处理-Congestion Handing 1 慢启动 2 拥塞避免 3 快重传/拥塞发生(拥塞发生时的快速重传) 4 快恢复
- 让人非常easy误解的TCP拥塞控制算法
正文 非常多人会觉得一个好的TCP拥塞控制算法会让连接加速,这样的观点是错误的.恰恰相反,全部的拥塞控制算法都是为了TCP能够在贪婪的时候悬崖勒马,大多数时候.拥塞控制是减少了数据发送的速度. 我在本 ...
- 浅谈TCP拥塞控制算法
TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入 ...
- TCP拥塞算法瓶颈及TCP加速器解决方案
TCP拥塞算法详解 ps:详解TCP拥塞算法就是为了说明瓶颈所在. 先解释一下概念: 拥塞:对网络中某一资源的需求超出了该资源所能提供的可用部分 拥塞窗口:以字节为单位,表示能通过的数据报的 ...
- TCP拥塞避免
目录 TCP拥塞避免 超时重传机制 拥塞控制 慢启动 拥塞避免 快重传 快恢复 与流量控制区别 参考 TCP拥塞避免 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载.拥塞 ...
随机推荐
- Tomcat配置Gizp 客户端使用okHttp3
找到tomcat 在 server.xml 新增如下配置 <Connector connectionTimeout="20000" port="8088" ...
- 【python】python返回结果多了none(递归时)
把每个返回值的print使用return替代即可 例子: def trim(s): if s[:1]==" ": s=s[1:] retrim(s) elif s[-1:]==&q ...
- Android开发教程之密码框右侧显示小眼睛
现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套[Android进阶学习视频].[全套Android面试秘籍].[Android知识点PDF] ...
- 最大子段和之M子段和
最大M子段和 题目模型 N个整数组成的序列 \(a_1,a_2,a_3,-,a_n\) ,将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的. 问题分析 方法一: 看到序列,我们首先要尝试 ...
- spring boot:thymeleaf给fragment传递参数的方法(spring boot 2.3.3)
一,thymeleaf如何给fragment传递参数? 1,如果是全局的参数,可以用interceptor中传递 非全局参数,可以从controller中传递 2,引用片断时也可以传递参数 说明:刘宏 ...
- linux(centos8):禁用selinux(临时关闭/永久关闭)
一,selinux的用途 1,什么是selinux SELinux:即安全增强型 Linux(Security-Enhanced Linux) 它是一个 Linux 内核模块,也是 Linux 的一个 ...
- centos 7.8 添加磁盘后查看、分区、格式化、挂载
基础环境 公有云 由于磁盘空间快用完了,现在决定多加一个40G磁盘 第一步 分区 fdisk -l #查看当前磁盘信息 fdisk /dev/vdb #对指定磁盘进行操作 如上图一般磁盘的第一个分区都 ...
- 安装Linux注意事项
网络配置NAT Worstation 生成虚拟网卡,编辑虚拟网络中子网IP地址为10网段内部地址,避免冲突. Linux命令 查看主机IP地址 [root@C8 ~]# hostname -I 19 ...
- Pytest配置文件声明自定义用例标识
使用pytest.ini添加自定义用例标识: [pytest] # 1.使用没有注册过的标记抛出错误 addopts = --strict-markers # 2.自定义标记 markers = sm ...
- 56.Qt-滚动字幕之无间隙滚动(原创)
1.描述 最近要实现一个滚动条字幕,但是搜到的系列文章都是利用定时器QTimer,在固定的时间截取文本并显示,这样滚动的时候其实是断断续续的,因为实际上是一个个字符位移实现的,不过实现方便. 所以只有 ...