一、何为拥塞
路由器无法处理高速到达的数据而*丢弃数据的现象叫做拥塞。
二、何为拥塞控制
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拥塞避免 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载.拥塞 ...
随机推荐
-
dbms_stats包更新、导出、导入、锁定统计信息
dbms_stats包问世以后,我们可通过一种新的方式来为CBO收集统计数据.目前,已经不再推荐使用老式的Analyze分析表和dbms_utility方法来生成CBO统计数据.dbms_stats能 ...
-
POJ1845Sumdiv(求所有因子和 + 唯一分解定理)
Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 17387 Accepted: 4374 Descripti ...
-
sql(join on 和where的执行顺序)
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...
-
Qt QToolTip 控件背景的 QSS 设置方法(摘抄)
Qt/C++/CSS: QTooltip stylesheet background colour Hi there, I've recently come across a problem deve ...
- PO/VO/POJO/BO/VO图解
-
grunt+bower依赖管理
安装bower(必须安装git) npm install bower -g bower按照插件命令 初始化配置 bower init 生成bower.json //如果有bower.json 直接输入 ...
-
leetcode_输入一个数组,目标树,检查目标是数组下标的哪两个之和,不准重复
今天是leetcode第一天,但是不太顺利.做这些,想不到 原题目: 我给的答案: class Solution { public: vector<int> twoSum(vector&l ...
-
打开视图 :1449 - the user specified as a definer (&#39;root&#39;@&#39;%&#39;)does not exist
从一个数据库数据迁移到本地localhost 程序在调用到数据库的视图时报错,直接在数据库中打开视图时也报错,类似: mysql 1449 : The user specified as a ...
-
CodeForces - 946D Timetable (分组背包+思维)
题意 n天的课程,每天有m个时间单位.若时间i和j都有课,那么要在学校待\(j-i+1\)个时间.现在最多能翘k节课,问最少能在学校待多少时间. 分析 将一天的内容视作一个背包的组,可以预处理出该天内 ...
-
struts2验证规则validation配置文件命名方式总结
1.Action级别校验命名格式: ActionClassName-validation.xml 2.Action中某个方法的校验命名格式: ActionClassName-ActionAliasNa ...