码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【计算机网络笔记】TCP的拥塞控制机制


    系列文章目录

    什么是计算机网络?
    什么是网络协议?
    计算机网络的结构
    数据交换之电路交换
    数据交换之报文交换和分组交换
    分组交换 vs 电路交换
    计算机网络性能(1)——速率、带宽、延迟
    计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率
    计算机网络体系结构概念
    OSI参考模型基本概念
    OSI参考模型中非端-端层(物理层、数据链路层、网络层)功能介绍
    OSI参考模型中端-端层(传输层、会话层、表示层、应用层)功能介绍
    TCP/IP参考模型基本概念,包括五层参考模型
    网络应用的体系结构
    网络应用进程通信
    网络应用对传输服务的需求
    Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)
    Cookie技术
    Web缓存/代理服务器技术
    传输层服务概述、传输层 vs. 网络层
    传输层——多路复用和多路分用
    传输层——UDP简介
    传输层——可靠数据传输原理之Rdt协议
    传输层——可靠数据传输之流水线机制与滑动窗口协议
    传输层——TCP特点与段结构
    传输层——TCP的可靠数据传输
    TCP连接管理(图解三次握手和四次挥手)
    传输层——拥塞控制原理与解决方法


    • 系列文章目录
    • TCP拥塞控制的基本原理
    • 加性增 —乘性减: AIMD
    • 慢启动: SS
    • 什么时候应该从SS切换到AIMD?
    • TCP拥塞控制算法总结
    • 例题


    TCP拥塞控制的基本原理

    • Sender限制发送速率。LastByteSent-LastByteAcked <= CongWin 让发送的最后一个Byte的序列号减去接收的最后一个确认的Byte的序列号小于等于CongWin。这样我们只需要修改CongWin这个值就可以限制发送速率。

      在这里插入图片描述

    • CongWin(拥塞窗口)的大小需要动态地调整。

    那需要能够感知和判断网络拥塞。怎么做呢?我们可以定义一个loss事件,当超时或者收到3个重复 ACK时往往意味着网络拥塞了,那发生这个事件的时候就降低速率。

    能够感知和判断网络拥塞之后需要合理地调整发送速率。这里有两个机制:

    • 加性增 —乘性减: AIMD
    • 慢启动: SS

    下面来看看这两种机制什么意思、怎么做的。

    加性增 —乘性减: AIMD

    原理:

    • 加性增:线性地、逐渐地增加发送速率谨慎探测可用带宽,直到发生loss事件;
    • 乘性减:一旦发生loss事件就要快速地降低速率。

    方法:AIMD

    • 加性增:每个RTT 将CongWin增大一个MSS(最大的段的长度)。这种思想是拥塞避免。
    • 乘性减:发生loss后将CongWin减半。

    TCP的拥塞控制在运行的时候可能如下图所示,想锯齿一样。

    在这里插入图片描述

    慢启动: SS

    TCP连接建立时,CongWin初始化为1,所以初始的速率很小很保守。那可用的带宽可能远远高于初始速率。那如果这时采用线性增长的话需要很长时间,这就是一种浪费。所以我们希望刚开始增长时候是快速地增长。这样就做到了虽然初始很慢,但是后面可以快速地将速率提高。

    所以原理是:

    • 当连接开始时,CongWin指数性增长。
    • 每个RTT 将CongWin翻倍
    • 收到每个ACK进行操作

    在这里插入图片描述

    什么时候应该从SS切换到AIMD?

    这需要依赖Threshold变量。它表示CongWin达到Loss 事件前值的1/2 时。

    实现方法:当SS指数性增长达到了Threshold的时候就转变成线性增长AIMD,进入拥塞避免机制。

    在这里插入图片描述

    更细致的考虑一下Loss事件的处理:

    • 收到3个重复ACKs:把CongWin切到一半,然后然后线性增长。比如上面图中的黑线。
    • 发生Timeout事件:将CongWin直接设为 1 个MSS,然后指数增长,达到threshold 后, 再线性增长。比如上面图中的蓝线。

    为什么处理方法不一样呢?因为Timeout事件表明拥塞更严重,那速率就要降地更多。

    TCP拥塞控制算法总结

    When CongWin is below Threshold, sender in slow-start phase, window grows exponentially;当拥塞窗口小于Threshold时,发送方位于慢启动阶段,拥塞窗口指数增长;

    When CongWin is above Threshold, sender is in congestion-avoidance phase, window grows linearly;当拥塞窗口大于Threshold时,发送方位于拥塞避免阶段,拥塞窗口线性增长;

    When a triple duplicate ACK occurs, Threshold set to CongWin/2 and CongWin set to Threshold;当收到三个重复ACK时,Threshold 被减为拥塞窗口的一半,拥塞窗口也减半;

    When timeout occurs, Threshold set to CongWin/2 and CongWin is set to 1 MSS. 当发生超时时,Threshold减为拥塞窗口的一半,并且拥塞窗口被置为1

    下面是一张更细致的图:

    在这里插入图片描述

    下面是TCP拥塞控制算法伪代码:

    在这里插入图片描述

    例题

    题目:一个TCP连接总是以1 KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为16 KB时发生了超时,如果接下来的 4 个RTT(往返时间)时间内的TCP段的传输都是成功的,那么当第 4 个RTT时间内发送的所有TCP 段都得到肯定应答时,拥塞窗口大小是多少?

    解答:发生超时事件后,threshold会降为拥塞窗口的一半也就是8KB,拥塞窗口CongWin会变为一个MSS最大段长度也就是1KB。这时发送方进入慢启动阶段也就是指数增长阶段,1 个RTT后, CongWin=2 KB,2 个RTT后, CongWin=4 KB ,3 个RTT后, CongWin=8 KB,这时到达threshold值了,所以这时慢启动就结束了,就进入了拥塞避免阶段也就是线性增长阶段,那么再发生一个RTT也就是4 个RTT后, CongWin=9 KB。

  • 相关阅读:
    在Vue中处理接口返回的二进制图片数据
    CSP2023 游记
    KT142C语音芯片ic使用开发中常见问题集锦FAQ
    Vue.js 动画与过渡效果实战
    JS中4种常见的内存泄漏
    华为FPGA工程师面试题
    Azure Synapse Analytics上创建用户并赋予权限
    git使用.md
    多目标哈里斯鹰优化 (MOHHO)(Matlab代码实现)
    二、帧模式 MPLS 操作
  • 原文地址:https://blog.csdn.net/m0_60511809/article/details/134162804
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号