计网协议 | TCP(3-拥塞控制)
发布日期:2022-02-21 17:40:27 浏览次数:63 分类:技术文章

本文共 1191 字,大约阅读时间需要 3 分钟。

1 何为拥塞?

套用下百度百科:

网络拥塞(network congestion) 是指在分组交换网络中传送分组的数目太多时,由于存储转发节点的资源有限而造成网络传输性能下降的情况。

网络拥塞是一种持续过载的网络状态,此时用户对网络资源(包括链路带宽、存储空间和处理器处理能力等)的需求超过了固有的处理能力和容量。在Internet的体系结构中,拥塞的发生是其固有的属性。

总结来说就是:对资源需求的总结>可用资源

  1. 网络中有许多资源同时呈现供应不足
    ↓ (导致)
  2. 网络性能变坏
    ↓ (导致)
  3. 网络吞吐量将随输入负荷增大而下降

此时出现了拥塞控制,为了防止更多的数据注入到网络中,这是一个很严肃的全局性问题


2 拥塞控制和流量控制的区别?

拥塞控制和流量控制都是让发送方减慢自己的发送速率,那么这二者有什么区别呢?

2.1 拥塞控制

拥塞控制是一个发送方对多个接收方的情况,不同接收方返回的需要减少发送数据量的请求是不一致的,这是一个全局性的问题

在这里插入图片描述

2.2 流量控制

流量控制的话就是发送方和接收方一对一关系,只是端到端的问题,如果接收方来不及接受,他立马就知道反馈给哪个接收方

在这里插入图片描述


3 拥塞控制的四种算法

讲算法之前先做几个假定:

  1. 数据单方向传送,而另一个方向只传送确认
  2. 接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度
  • 发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd}

再确定两个概念:

  1. 接收窗口接收方根据接受缓存设置的值,并告知给发送方,反映接收方容量。
  2. 拥塞窗口: 发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。

3.1 慢开始 + 拥塞避免

可以先大概看一下图:

ZuG,size_20,color_FFFFFF,t_70,g_se,x_16)
这里面出现的概念:

  1. 传播轮次: 发送了一批报文段并收到它们的确认的时间。其实也就是往返时延RTT。
  2. 慢开始: 拥塞窗口的大小随着传播轮次的增加而增加,从1开始,每次*2,呈指数增长,直到ssthresh初始值,也就是慢开始门限值的时候。
    在这里插入图片描述
  3. 拥塞避免算法: 此时拥塞窗口cwnd值的增长由*2变为+1,变成线性增长,直到阈值(出现了网络拥塞)
    在这里插入图片描述
  4. 再次慢开始: 当出现拥塞后,cwnd立刻减为1,再执行之前重复过的慢开始算法,但是,此时的慢开始门限ssthresh值变为上一次产生拥塞的窗口值的一般也就是24/2=12
    在这里插入图片描述
    这就是慢开始+拥塞避免算法的过程,如此反复~

3.2 快重传 + 快恢复

在这里插入图片描述

  1. 快重传: 如果数据发生丢失,比如发送方给接收方按序发送A,B,C,D,E。然后A发送成功,B丢失,C,D,E发送成成功,但是在返回对CDE的确认的时候,接收方只会返回自己需要的B的报文,当该确认重复三次(冗余ACK)时,发生快重传。

  2. 快恢复: 当发生拥塞时,不会直接回到慢开始,而是直接将窗口大小cwnd设置为出现三次重复确认时窗口大小的二分之一,然后执行拥塞避免算法。

转载地址:https://blog.csdn.net/weixin_40597409/article/details/122761321 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:并发编程丨CountDownLatch的使用小demo
下一篇:计网协议 | TCP(1-可靠传输)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月01日 22时23分03秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【Leetcode刷题篇】leetcode207 课程表 2019-04-26
【Leetcode刷题篇】leetcode322 零钱兑换 2019-04-26
【Leetcode刷题篇】leetcode437 路径总和III 2019-04-26
【Linux篇】Linux常用命令之性能优化 2019-04-26
【面试篇】JVM体系 2019-04-26
【Leetcode刷题篇】leetcode406 根据身高重建队列 2019-04-26
【Leetcode刷题篇】leetcode581 最短无序连续子数组 2019-04-26
【Leetcode刷题篇】leetcode538 把二叉搜索树转换为累加树 2019-04-26
【多线程与高并发】线程的优先级是怎么回事? 2019-04-26
【多线程与高并发】Java守护线程是什么?什么是Java的守护线程? 2019-04-26
【Leetcode刷题篇/面试篇】-前缀树(Trie) 2021-06-29
【Leetcode刷题篇】leetcode337 打家劫舍III 2021-06-29
【Leetcode刷题篇】leetcode4 寻找两个正序数组的中位数 2021-06-29
【Leetcode刷题篇】leetcode316 去除重复字母 2021-06-29
【Leetcode刷题篇】leetcode1081 不同字符的最小子序列 2021-06-29
【面试篇】Java网络编程与IO流体系 2021-06-29
【大话Mysql面试】-Mysql的索引为什么要使用B+树,而不是B树,红黑树等之类? 2021-06-29
【大话Mysql面试】-如何通俗易懂的了解Mysql的索引最左前缀匹配原则 2021-06-29
【大话Mysql面试】-MYSQL的两种存储引擎MyISAM与InnoDB的区别是什么? 2021-06-29
【大话Mysql面试】-InnoDB可重复读隔离级别下如何避免幻读?MVCC和next-key是什么 2021-06-29