当前位置: 首页 > news >正文

计算机网络——22TCP拥塞

TCP拥塞

TCP拥塞控制机制

端到端的拥塞控制机制

  • 路由器不向主机有关拥塞的反馈信息
    • 路由器的负担较轻
    • 符合网络核心简单的TCP/IP架构原则
  • 端系统根据自身得到的信息,判断是否发生拥塞,从而采取动作

拥塞控制的几个问题

  • 如何检测拥塞
    • 轻微拥塞
    • 拥塞
  • 控制策略
    • 在拥塞发送时如何动作,降低速率
      • 轻微拥塞,如何降低
      • 拥塞时,如何降低
    • 在拥塞缓解时如何动作,增加速率

TCP拥塞感知

发送端如何探测到拥塞

  • 某个段超时了(丢失事件 ):拥塞
    • 超时时间到,某个段的确认没有来
    • 原因1:网络拥塞(某个路由器缓冲区没空间了,被丢弃)概率大
    • 原因2:出错被丢弃了(各级错误,没有通过校验,被丢弃)概率小
    • 一旦超时,就认为拥塞了,有一定误判,但是总体控制方向是对的

在这里插入图片描述

  • 有关某个段的3次重复ACK:轻微拥塞
    • 段的第1个ack,正常,确认绿段,期待红段
    • 段的第2个重复ack,意味着红段的后一段收到了,蓝段乱序到达
    • 段的第2、3、4个ack重复,意味着红段的后第2、3、4个段收到了 ,橙段乱序到达,同时红段丢失的可能性很大(后面3个段都到了, 红段都没到)
    • 网络这时还能够进行一定程度的传输,拥塞但情况要比上面好

TCP速率控制方法

如何控制发送端发送的速率

  • 维持一个拥塞窗口的值(主要手段) :CongWin (表示发送方往网络中的注入字节数)
  • 发送端限制 已发送但是未确认 的数据量(的上限): LastByteSent - LastByteAcked ≤ CongWin
  • 从而粗略地控制发送方的往网络中注入的速率

在这里插入图片描述

  • CongWin是动态的,是感知到的网络拥塞程度的函数
    • 超时或者3个重复ack,CongWin下降
      • 超时时:CongWin降为1MSS,进入SS阶段然后再倍增到 CongWin(原) / 2(每个RTT),从而进入CA阶段
      • 3个重复ack :CongWin降为CongWin/2,CA阶段
    • 否则(正常收到Ack,没有发送以上情况):CongWin跃跃欲试上升(这是为了满足“在不发生拥塞的情况下提高吞吐率”的目的)

TCP拥塞控制和流量控制的联合动作

联合控制的方法

  • 发送端控制发送但是未确认的量同时也不能超过接收窗口,满足流量控制要求
    • SendWin = min { CongWin , RecvWin }
    • 同时满足 拥塞控制和流量控制要求

TCP慢启动

  • 连接刚建立, CongWin = 1 MSS
    • 如: MSS = 1460bytes & RTT = 200 msec
    • 初始速率 = 58.4kbps
  • 可用带宽可能 >> MSS/RTT
    • 应该尽快加速,到达希望的速率
  • 当连接开始时,指数性增加发送速率,直到发生丢失的事件
    • 启动初值很低
    • 但是速度很快
  • 当连接开始时,指数性增 加(每个RTT)发送速率 直到发生丢失事件
    • 每一个RTT, CongWin加倍
    • 每收到一个ACK时, CongWin加1(相当于每个RTT,CongWin加倍)
    • 慢启动阶段:只要不超时或 3个重复ack,一个RTT, CongWin加倍

在这里插入图片描述

  • 总结:
    • 初始速率很慢,但是加速却是指数性的
    • 指数增加,SS时间很短,长期来看可以忽略

AIMD

  • 乘性减: 丢失事件后将CongWin降为1(ss阶段通常可忽略,故相当于直接减少到 CongWin/2 ),将CongWin/2作为阈值,进入慢启动阶段(倍增直到 CongWin/2)
  • 加性增: 当 CongWin >阈值时,一个 RTT 如没有发生丢失事件,将 CongWin 加1MSS : 探测(也就是主键添加,探测是否到达阈值)

在这里插入图片描述

改进

  • Q:什么时候应该将指数性增长变成线性?
  • A:在超时之前,当CongWin变成上次发生超时的窗口的一半

在这里插入图片描述

实现:

  • 变量:Threshold
  • 出现丢失(超时或者3个ACK),Threshold设置成CongWin的1/2

总结:TCP拥塞控制

  • 当CongWin<Threshold, 发送端处于慢启动阶段( slow-start), 窗口指数性增长.
  • 当CongWin > Threshold, 发送端处于拥塞避免阶段 (congestion-avoidance), 窗口线性增长.
  • 当收到三个重复的ACKs (triple duplicate ACK), Threshold设置成 CongWin/2, CongWin=Threshold+3.
  • 当超时事件发生时timeout, Threshold=CongWin/2 CongWin=1 MSS,进入SS阶段

TCP发送端拥塞控制

事件状态TCP发送端行为解释
以前没有收到ACK的data,被ACKed慢启动(SS)CongWin = CongWin + MSS,If (CongWin > Threshold),状态变成“CA”每一个RTT CongWin 加倍
以前没有收到ACK的data,被ACKed 拥塞避免(CA)CongWin = CongWin+MSS * (MSS/CongWin)线性增加, 每一个RTT对CongWin 加一个1 MSS
通过收到3个重复的ACK,发现丢失的事件SS or CAThreshold = CongWin/2, CongWin = Threshold+3, 状态变成“CA”快速重传, 实现乘性的减,CongWin 没有变成1MSS.
超时SS or CAThreshold = CongWin/2,CongWin = 1 MSS,状态变成“SS”进入slow start
重复的ACKSS or CA对被ACKed 的segment, 增加重复ACK的计数CongWin and Threshold不变

TCP拥塞控制FSM

在这里插入图片描述

TCP吞吐量

TCP的平均吞吐量是多少,使用窗口window尺寸W和RTT来 描述?
(忽略慢启动阶段,假设发送端总有数据传输)

  • W:发生丢失事件时的窗口尺寸(单位:字节)
    • 平均窗口尺寸(#in-flight字节):3/4W
    • 平均吞吐量:一个RTT时间吞吐3/4W, avg TCP thruput = 3/4 * (W/RTT) bytes/sec
      由下图所示,w/2→w所需要的时间是2RTT

在这里插入图片描述

因此 T = (w/2 + w) / (2*RTT) = 3w/4RTT

在这里插入图片描述

TCP 公平性

公平性目标: 如果 K个TCP会话分享一个链路带宽为R的 瓶颈,每一个会话的有效带宽为 R/K

2个竞争的TCP会话:

在这里插入图片描述
在这里插入图片描述

公平性和 UDP

  • 多媒体应用通常不是用 TCP
    • 应用发送的数据速率希望 不受拥塞控制的节制
  • 使用UDP:
    • 音视频应用泵出数据的速率是恒定的, 忽略数据的丢失
      也就是UDP会抢占TCP的资源

公平性和并行TCP连接

  • 2个主机间可以打开多个并行的TCP连接
  • 例如: 带宽为R的链路支持了 9个连接;
    • 如果新的应用要求建1个TCP连接,获得带宽R/10
    • 如果新的应用要求建11个TCP连接,获得带宽R/2

相关文章:

  • uniapp中导入css和scss的区别
  • Fastjson:高效、便捷的Java语言JSON解析器和生成器
  • 出海遇见SOCKS5:电商与游戏的网络安全奇航
  • C语言的reverse函数
  • MATLAB环境下脑电信号EEG的谱分析
  • C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码
  • SpringBoot+Vue实战:打造企业级项目管理神器
  • 【前端素材】推荐优质后台管理系统 Adminity平台模板(附源码)
  • mysql学习
  • java009 - Java面向对象基础
  • day06_菜单管理(查询菜单,添加菜单,添加子菜单,修改菜单,删除菜单,角色分配菜单,查询菜单,保存菜单,动态菜单)
  • 【Android安全】Windows 环境下载 AOSP 源码
  • Node.js_基础知识(http模块)
  • 【Go 快速入门】协程 | 通道 | select 多路复用 | sync 包
  • 物体检测-系列教程19:YOLOV5 源码解析9 (Focus模块、Model类构造函数)
  • 2017年终总结、随想
  • 4个实用的微服务测试策略
  • Computed property XXX was assigned to but it has no setter
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java比较器对数组,集合排序
  • mysql innodb 索引使用指南
  • node入门
  • Spark RDD学习: aggregate函数
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue学习第二天
  • 高性能JavaScript阅读简记(三)
  • 来,膜拜下android roadmap,强大的执行力
  • 浏览器缓存机制分析
  • 批量截取pdf文件
  • 如何使用 JavaScript 解析 URL
  • 深度解析利用ES6进行Promise封装总结
  • 跳前端坑前,先看看这个!!
  • 微信开放平台全网发布【失败】的几点排查方法
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 鱼骨图 - 如何绘制?
  • 再次简单明了总结flex布局,一看就懂...
  • 再谈express与koa的对比
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • ( 10 )MySQL中的外键
  • (42)STM32——LCD显示屏实验笔记
  • (5)STL算法之复制
  • (arch)linux 转换文件编码格式
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (篇九)MySQL常用内置函数
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Sublime Text3配置Lua运行环境
  • .Net中wcf服务生成及调用
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @RequestBody与@ResponseBody的使用
  • [ 数据结构 - C++] AVL树原理及实现
  • [ 转载 ] SharePoint 资料
  • [android] 请求码和结果码的作用
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [CCIE历程]CCIE # 20604