| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP可靠传输-拥塞控制 -> 正文阅读 |
|
[网络协议]TCP可靠传输-拥塞控制 |
拥塞控制原理看到拥塞这个词,我们首先会想到什么呢? 在生活中,我们几乎每天都能听到早高峰、晚高峰引起的交通堵塞。那么引起堵塞的原因是什么呢?你肯定会说是这个时间段车流量过大,超出道路所能承受的车流量范围了。这是完全正确的,这里道路是一种资源,所有的车都需要这个资源,当需求大于可用资源时,自然就会引起堵塞。 那么在网络中我们提到的拥塞也就是这个意思。网络中对拥塞的定义是:在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能下降了。这种情况就叫拥塞。 这是很好理解的,条件关系式如下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??对资源的需求>可用资源
拥塞控制就是防止过多的数据注入到网络中,这样可以是网络中的路由器或链路不致过载。拥塞控制的前提是网络能够承受现有的网络负荷。 拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及降低与网络传输性能有关的所有因素。 TCP的拥塞控制方法TCP进行拥塞控制的算法有四种,即慢开始、拥塞避免、快重传和快恢复,这四种方法其实都是相互配合的,不是单独的解决问题 慢开始 这里所讨论的拥塞控制也叫做基于窗口的拥塞控制。为此,发送方维持一个叫做拥塞窗口的状态变量(即网络中能流畅传输的数据量),拥塞窗口的大小取决于网络的拥塞程度,并且动态的在变化。发送方让自己的发送窗口等于拥塞窗口。(就跟行车一样,地图会告诉你当前道路的拥塞程度,并且它是动态变化的) 发送方控制发送窗口的原则是:只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率,但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,缓解网络拥塞。 那么发送方又如何知道网络发送了拥塞呢? TCP规定,判断网络拥塞的依据就是出现了超时。 那么拥塞窗口的大小如何变化呢?
?举例:一开始先设置cwnd=1,发送方发送第一个报文段M1,接收方确认M1。cwnd由1增大2,发送方接着发送M2和M3两个报文段、接收方再发送两个确认,接着cwnd由2增大到4。因此,每一次确认时候,拥塞窗口都会增加一倍,如图: ? ?注意:这里是为了方便理解网络拥塞,将传输单位设置以报文段为单位,并非字节,所以这里不是对很多报文段进行一次确认,而是对每个报文段都进行确认(在报文段内部,仍然遵从滑动窗口的原则) 这里我们将每一轮往返叫做一个轮次,轮次的往返时间RTT是将本轮里边的所有报文段从发送出去到收到确认总共所经历的时间,不是单个报文段。另外,在实际运行中,轮次的划分并不是图解那样,发送方只要收到一个队新报文段的确认,其拥塞窗口就立即加1,并且立即发送新的报文段,而不需要等待这个轮次中所有确认都收到之后才发送新的报文段。 在介绍其它方法之前,在这里新引入一个新概念:慢开始门限(ssthresh),即:当拥塞窗口大到哪个程度时,会采取处理措施。用法如下:
拥塞避免和快重传和快恢复 在慢开始方法中,cwnd的增加是成倍增加的,这就可能因为增长过大而引起网络拥塞,而避免用塞算法就是为了避免这种情况产生。它的思路是这样:在cwnd大于某一个界定值后(后续讲解),之后每一轮次结束后,我们只将cwnd加1,而不是成倍增加。 现在用一个具体例子来说明cwnd是怎样变化的? 我们还是以报文段为单位,假定发送窗口等于拥塞窗口。 我们将慢开始门限的初始值设置为16个报文段,即ssthresh=16。现在开始执行慢算法,如图: ? ?根据ssthresh算法规定,现在达到了达到了设置的门限值,需要使用拥塞避免算法,如图: ?假如当拥塞窗口为24时,网络出现了超时,发送方判断为网络拥塞,于是调整门限值ssthresh=cwnd/2,即12,同时重启慢开始算法,设置cwnd为1,当拥塞窗口再达到十二时,再执行拥塞避免算法(和前面过程一样),如图: ?解释:有时,个别报文段会在网络中丢失,发送方迟迟收不到确认,就会产生超时,但是实际上网络并未发生拥塞,而TCP对网络拥塞的依据就是超时。这个时候就会错误的开启慢开始算法,直接将拥塞窗口将为1,大大降低了传输效率。 为了避免这个情况的发生,有了快重传算法,它的算法思想是:要让发送方尽快知到发生了个别报文段的丢失。
?现在假设cwnd=4,接受方收到了报文段M1和M2,并且及时的发出了确认信息,此时M3报文段丢失了,但是M4报文段却收到了。按照原来的办法,此时接收方什么都不做,静静等待发送方的超时重传就可以了,但是之前说了,我们为了避免重启慢开始算法,降低传输效率,这里不能等到超时,所以此时接收方必须立即发送对M2的重复确认(为什么要发M2的确认呢?之前讲过,发送的确认序号代表的是这个序号之前的数据我已经全部接收到了,这是我期望下次接收的数据起始序号),发送方收到了对M2的重复确认时,就会怀疑M3报文段是不是没有收到,,因为收到了两次确认信息,这是接受端接着发送M5和M6,接收方收到M5和M6之后,再分别发送对M2的确认信息。这个时候接受端已经收到了四次对M2的确认,其中三次是重复确认。快重传规定,只要发送方收到三个连续的重复确认,就知道接收方确认没有收到M3报文段,此时立即进行快重传。从而避免超时的情况。如图: ? 在执行快重传之后,我得使用快恢复算法进行恢复,快恢复指的是根据当前网络情况重新调整ssthresh,一般是将ssthresh调整为cwnd的一般,同时设置拥塞窗口等于门限值,并开始执行拥塞避免算法。如图: ? 注意:有些快恢复算法是将拥塞窗口设置的比原来大一点,增大三个MSS的长度。
?最后需要说明的是:我们所说的AIMD算法指的是加法增大AI,指的是拥塞避免算法因为它是线性增大的。而一旦收到了3个重复的确认,就改门限值为拥塞窗口的一般,称为乘法减小MD。 整体流程图如下: ?由此我们可以得出,发送方的发送窗口的大小取决于接收方窗口(rwnd)和拥塞窗口(cwnd)的联合限制,它的上限值是这两个值中较小的一个,即: ?主动队列管理AQM在前面的叙述中,我们所说的超时都是基于传输层的考虑,那么在网络层会不会也出现这样的问题呢?答案是会的 路由器的队列通常都是按先进先出(FIFO)的规则处理到来的分组。但是队列总是有限的,当队列已经满时,以后再到达的分组将会被丢弃,这叫做尾部丢弃策略,但是,路由器这种做法是非常不厚道的,你倒是一丢弃轻松了,但是你给通信双方造成了非常大的麻烦。如下:
为了避免这种全局同步现象,就有了主动队列管理AQM(Active Queue Management),其思想如下:
?附:丢弃概率p的处理是很难处理的,所以此方法已经不建议使用,但是对路由器进行主动队列管理AQM仍是必要的。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:25:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |