数据包守恒 TCP 拥塞控制

news2024/11/29 6:39:30

数据包守恒是包括拥塞控制在内的合理利用带宽的方法之基石,它维持了有效网络传输的稳定,过去 40 年是,未来还是。数据包守恒可以描述为:

  • 当带宽恰好满载时,receiver 收到 1 个数据包后 sender 才能发送 1 个数据包。
  • 当带宽尚未满载时,receiver 收到 1 个数据包后 sender 可以发送大于 1 个数据包。
  • 当带宽过载但未丢包时,receiver 收到 1 个数据包后 sender 可以发送 a(a < 1) 个数据包。
  • 当带宽过载且丢包时,receiver 收到 1 个数据包后 sender 可以发送 a - loss (a 为第 3 点的 a,loss 为丢包量平摊到 1 个数据包的份额)

解释一下第 4 点,因为拥塞导致了丢包,所以丢掉的这部分需要排除在正常容量之外,先减掉丢掉的这部分,获得满载容量,再以小于 1 的兑换比缓解拥塞,至于如何统计丢包数量,请信任拥塞控制算法。

其它的描述非常容易理解,不再解释。但 sender 如何获知 receiver 已经收到了数据包呢?

以 TCP 为例,receiver 主动告诉 sender 的方式类似于中断,ACK(可携带 SACK) 告知 sender 已经有数据包被接收并触发 sender 发送新的数据包,因此 ACK 也叫 ACK 时钟。

最终,数据的发送需要 ACK 触发,而 ACK 则需要发送新数据触发,形成了一个先有鸡还是先有蛋的环。对于 TCP 而言,上述 4 点就在这个环上做文章:

  • 作为 application-limited 的 TCP,如果应用速率恰好填满带宽,TCP 则按照等于 1 的兑换比执行数据包守恒。
  • 作为 capacity-seeking 的 TCP,AIMD 确保公平收敛,在 AI 阶段数据包守恒兑换比大于 1,在 MD 阶段执行 PRR(RFC6937) 过程,兑换比小于 1。
  • 作为 half-rate-based(后面解释)的 TCP BBR,检测到丢包后,从 inflight 扣掉 loss 数量后以兑换比 1 执行数据包守恒。

其中 AIMD PRR 和 BBR 需要额外解释。
AI 是一个兑换比大于 1 的过程,目的是 probe,当出现丢包时需要收敛,MD 过程的兑换比显然小于 1,PRR算法体现了这个过程:以 CUBIC 为例,当 receiver 收到了 delivered 这么多数据时,发送 0.7*delivered。
关于 PRR 的过程,这又是一道中学生几何习题,见下图:
在这里插入图片描述

可清晰观测到 cwnd 下降到 beta * cwnd 是多么平滑。可用下面的脚本具体观测数据:

"trace.bt" 29L, 752C                                                                                          
#!/usr/local/bin/bpftrace

#include <linux/tcp.h>

k:tcp_cwnd_reduction
{
        $tp = (struct tcp_sock *)arg0;
        printf("ssthresh:%llu pcwnd:%llu delivered:%llu this:%llu total:%llu ",
                $tp->snd_ssthresh,
                $tp->prior_cwnd,
                $tp->prr_delivered,
                arg1,
                $tp->prr_delivered + arg1);
        printf(" prr_out:%llu cwnd:%llu delta:%llu inflt:%llu\n",
                $tp->prr_out,
                $tp->snd_cwnd,
                $tp->snd_ssthresh*($tp->prr_delivered + arg1)/$tp->prior_cwnd - $tp->prr_out,
                $tp->packets_out - $tp->sacked_out - $tp->lost_out + $tp->retrans_out);
}

作为一个极端的对比,看一下在进入 fast retransmit 当时将 cwnd *= beta 会是什么样子:
在这里插入图片描述
可以看出来,非常糟糕。

下面主要看 BBR 的问题。

BBR 是一个半 rate-based 算法,“半 rate-based” 是因为目前 BBR 仅凭 rate-based 机制无法确保数据包守恒,换句话说,rate-based 机制无法精确控制自己发送的数据包对网络负载造成的影响。

完全的 rate-based 算法不依赖 ACK 时钟,全凭测量吞吐控制发送速率,至于测量方式,ACK 只是一种方式。完全的 rate-based 算法甚至根本无法信任 ACK 时钟,因为 ACK 时钟是事后的,按数据包守恒,收到 ACK 才触发发送。

对 rate-based 而言,拥塞不能提前预知,而反馈测量信号总是滞后(只能测量过去的事件),它需要按一定rate 持续发送,直到收到 “需要变化” 的信号,在发生拥塞情况下收到下一次测量信号前已经发送了过多数据,这部分数据可能恶化拥塞。

总之,ACK 时钟机制下,收到信号在先,触发发送在后,rate-based 则相反,发送在前,测量反馈在后,rate-based 算法没什么好方法执行数据包守恒。而不执行数据包守恒将使连接脱离拥塞控制。

因此,BBR 至少在检测到丢包时强制切换到数据包守恒模式,背后的依据是 “丢包大概率是发生了拥塞导致”,而这个时候是必须格外谨慎的,绝不能再多发送额外的数据而恶化拥塞。

但 BBR 在此处的数据包守恒也为自身带来了副作用。如果丢包是随机丢包,失去了 cwnd gain,数据包守恒的 BBR 没有足量的 inflight 进行 probe,而抗随机丢包恰恰就是 BBR 的承诺,显然,这里的数据包守恒违背了承诺。

不过这也是没有办法的事,BBR 的作者在实现这部分逻辑时写下了无奈的 TODO:

/* An optimization in BBR to reduce losses: On the first round of recovery, we
 * follow the packet conservation principle: send P packets per P packets acked.
 * ...
 * TODO(ycheng/ncardwell): implement a rate-based approach.
 */ 
 static bool bbr_set_cwnd_to_recover_or_restore(...

数据包守恒一直都在,可是当我们想进一步了解时,网上的资料几乎全部指向范雅各布森的经典论文,连解释引申一下都没有,可数据包守恒覆盖的范围不仅仅是个解释。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode链表OJ题目 代码+思路分享

目录 删除有序数组中的重复项合并两个有序数组移除链表元素 删除有序数组中的重复项 链接: link 题目描述&#xff1a; 题目思路&#xff1a; 本题使用两个指针dst和src一前一后 相同情况&#xff1a; 如果nums[dst]nums[src]&#xff0c;那么src 不相同情况&#xff1a; 此…

基于B/S架构SpringBoot+Bootstrap框架的中小医院信息系统

一、开源项目简介 基于B/S架构&#xff0c;SpringBootBootstrap框架的中小医院信息系统。简单实现了挂号收费&#xff0c;门诊管理&#xff0c;划价收费&#xff0c;药房取药&#xff0c;体检管理&#xff0c;药房管理&#xff0c;系统维护等基础功能。 二、功能概述 本系统是…

计算机网络学习04(应用层常见协议总结)

1、HTTP:超文本传输协议 超文本传输协议&#xff08;HTTP&#xff0c;HyperText Transfer Protocol) 是一种用于传输超文本和多媒体内容的协议&#xff0c;主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候&#xff0c;我们网页就是通过 …

电脑硬盘检测怎么操作?如何检查硬盘的健康情况?

案例&#xff1a;如何对电脑硬盘进行检测&#xff1f; 【我的电脑硬盘中有许多重要的数据&#xff0c;我想知道电脑硬盘的健康状况怎么样&#xff1f;有没有小伙伴知道电脑硬盘检测的方法&#xff1f;】 电脑硬盘是存储数据的关键组件&#xff0c;而随着时间的推移和使用频率…

JAVA IO 模型详解

什么是IO I/O&#xff08;Input/Outpu&#xff09; 即输入&#xff0f;输出 。 从计算机结构的视角来看的话&#xff0c; I/O 描述了计算机系统与外部设备之间通信的过程。 从应用程序的视角来看的话&#xff0c;我们的应用程序对操作系统的内核发起 IO 调用&#xff08;系统调…

RocketMq windows 安装

RocketMq安装步骤&#xff1a; 1、直接在官网下载。也可以从这里自取 https://rocketmq.apache.org/download/ 2、修改bin目录下的文件 runserver.cmd 和 runbroker.cmd文件。主要修改所占用内存的大小。 runserver.cmd 修改如下&#xff1a; runbroker.cmd 修改如下&#xff…

数据结构与算法(三):树论(树形结构、二叉树、二叉搜索树、红黑树、BtreeB+Tree、赫夫曼树、堆树)

树论&#xff08;树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树&#xff09; 树形结构概念 在树形结构里面重要的术语&#xff1a; 结点&#xff1a;树里面的元素。 父子关系&#xff1a;结点之间相连的边 子树&#xff1a;当结点大于1时&#xff0…

牛客网CM11 链表分割

CM11 链表分割 描述示例解题思路以及代码解法1解法2 描述 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 示例 解题…

JDBC详解(四):操作BLOB类型字段(超详解)

JDBC详解&#xff08;四&#xff09;&#xff1a;操作BLOB类型字段 前言一、MySQL BLOB类型二、向数据表中插入大数据类型三、修改数据表中的Blob类型字段四、从数据表中读取大数据类型 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴…

倾斜摄影超大场景的三维模型轻量化与三维展示效果的关系浅析

倾斜摄影超大场景的三维模型轻量化与三维展示效果的关系浅析 倾斜摄影超大场景的三维模型由于数据量庞大&#xff0c;直接进行渲染可能会导致计算资源和时间的浪费。因此&#xff0c;针对倾斜摄影超大场景的三维模型区域进行轻量化处理是一种有效的优化手段。但是&#xff0c;轻…

macOS 13.4Beta 3(22F5049e)With OpenCore 0.9.2开发版 and winPE双引导分区原版镜像

镜像特点 完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引导分区&#xff08;如有需要&#xff0c;可以自行直接替换opencore分区文件为clover引导文件&#xff09;备注…

Python3语法笔记(后篇)

文章目录 前言函数输入参数返回值装饰器&#xff08;decorator&#xff09;Lambda表达式&#xff08;匿名函数&#xff09;文档和注解 类类和实例特殊方法继承枚举类 错误和异常后记 前言 这篇文章主要用于记录Python3相关语法&#xff0c;方便自己查阅使用。 Python3语法笔记…

rsync之include、exclude使用

rsync之include、exclude使用 注意&#xff1a;exclude可单独使用&#xff0c;include必须和exclude配合使用 环境&#xff1a; 服务端&#xff1a; 在做同步之前必须要知道的含义&#xff1a; --exclude* 排除所有文件&#xff0c;包括目录&#xff0c;因为在linux一切皆…

自动拣货仓库亮灯方案

方案目标概叙&#xff1a; 系统在美团平台下单后&#xff0c;骑手会收到取货码&#xff0c;凭借取货码到指定的智能仓库去取货&#xff0c;仓库标签系统调取相应订单信息&#xff0c;执行亮灯指令&#xff08;屏幕显示订单信息及拣货数量&#xff0c;并亮灯&#xff09;&#…

window server dos命令集合

1、 删除任务管理器服务里的服务项&#xff0c;用管理员运行cmd, 再运行&#xff1a;sc delete ServiceName ServiceName从服务属性里查。

爬虫为什么需要ip

爬虫需要使用爬虫ip主要是为了解决以下问题&#xff1a; 1、反爬虫机制&#xff1a;许多网站会设置反爬虫机制来防止爬虫程序的访问&#xff0c;例如限制IP地址的访问频率、检测访问来源等。使用爬虫ip可以绕过这些限制&#xff0c;使得爬虫程序更难被检测到。 2、访问限制&a…

Figma快速转换为Sketch文件格式的方法

由于Sketch允许第三方插件&#xff0c;例如应用程序集成和数据提供&#xff0c;许多设计和开发人员喜欢将Figma文件导入Sketch&#xff0c;并将其转换为Sketch格式。 但是令人头痛的是&#xff0c;Figma只支持Sketch文件的导入&#xff0c;而不支持Sketch文件的导出。这篇文章…

vue项目引入字体样式

1、先下载好需要的字体样式&#xff0c;下载好的应该是个.ttf文件 2、在asset中创建fonts文件夹&#xff0c;将字体样式文件放进去&#xff0c;然后再到里面创建font.css文件 3、font.css文件里面进行引用 font-face {/* 重命名字体名 */font-family: HeFengShuDaoZhaoHe;/*…

无惧黑暗强光,纯视觉导航也能全天候作业

对于一台激光导航扫地机器人而言&#xff0c;全天候作业并非难事&#xff0c;那么纯视觉导航扫地机器人能做到吗&#xff1f; 无论对于人&#xff0c;还是机器人&#xff0c;光线环境的变化对“眼睛”的影响都是致命的。由于视觉传感器对于光线十分敏感&#xff0c;在家庭场景…

TDA4VM/VH 芯片 NAVSS0

请从官网下载 TD4VM 技术参考手册&#xff0c;地址如下&#xff1a; TDA4VM 技术参考手册地址 概述 (NAVSS0 的介绍在 TRM 的第10.2章节) NAVSS0 可以看作 MAIN 域的一个复杂外设域&#xff0c;实现如下功能&#xff1a; UDMASS: DMA 管理子系统&#xff1b;MODSS&#xf…