从CUBIC/BBR的TCP ACK失速说起
上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接:
TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK:
是的,这是我几年前关于Delay ACK的分析,如今看来有些许不足,有些空洞,有些学院派,所以本文试图就着这个问题来分析一个关于Delay ACK以及带来相似后果的聚集ACK,以及ACK丢失等等的具体的场景,即ACK失速问题,简称TCP失速。
之所以会在假期写这篇文章,还有两个原因,首先感谢fcicq大神的提示,其次…等我的生日过后再细说。
所谓失速,即TCP发送端由于拥塞窗口配额耗尽而无法继续发送的现象。本文我依然用tcptrace来分析。
先看一下tcptrace图的概览:
有点简陋了,详情参见:
在Wireshark的tcptrace图中看清TCP拥塞控制算法的细节(CUBIC/BBR算法为例):https://blog.csdn.net/dog250/article/details/53227203
接下来我们看一下TCP失速在CUBIC算法看来是如何解决的:
不得不说TCP基于ACK时钟驱动的AIMD模型是一个多么好的负反馈收敛模型,几乎不需要额外的任何事情,在ACK到来后,一个突发会迅速弥补失速带来的发送速率停滞。这完全是因为Reno/CUBIC算法基于cwnd来决定能发送多少数据。
然而,事情在BBR算法中起了变化,我们看一下BBR算法下类似的场景:
有点复杂了,但是仔细琢磨还是可以理解的。我们着重看一下BBR算法失速恢复过程:
问题非常明确,于是,给出我们的愿景:
仔细思考几分钟,有没有什么解决方案呢?其实不光是应对TCP失速,任何关于TCP优化的问题,归根结底都是减小图中那个小三角形面积的问题,不要试图把发送线变陡,因为带宽是大家的,不管你自己,然而一旦出现了图中的阴影三角形,那便是整个网络系统欠你的了,遗憾的是,这种债务需要你自己去理清和了结!
不多说,先给出解决方案:
…这里我给出的是省略号,和以往文章直接把答案暴露不同,这里我也没有标准的答案,就算有我也不想再写了。问题回归原点,你怎么预测ACK将会延迟聚集到达?
感谢fcicq大神总是在我闲着无所事事或者忙的焦头烂额的时候给我一些points让我思考从而可以动起来,fcicq大神提供了一个关于BBR最新进展的ppt,非常精彩:
BBR Congestion Control Work at Google IETF
上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接:
TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK:https://blog.csdn.net/dog250/article/details/52664508
是的,这是我几年前关于Delay ACK的分析,如今看来有些许不足,有些空洞,有些学院派,所以本文试图就着这个问题来分析一个关于Delay ACK以及带来相似后果的聚集ACK,以及ACK丢失等等的具体的场景,即ACK失速问题,简称TCP失速。
之所以会在假期写这篇文章,还有两个原因,首先感谢fcicq大神的提示,其次…等我的生日过后再细说。
所谓失速,即TCP发送端由于拥塞窗口配额耗尽而无法继续发送的现象。本文我依然用tcptrace来分析。
先看一下tcptrace图的概览:
有点简陋了,详情参见:
在Wireshark的tcptrace图中看清TCP拥塞控制算法的细节(CUBIC/BBR算法为例):https://blog.csdn.net/dog250/article/details/53227203
接下来我们看一下TCP失速在CUBIC算法看来是如何解决的:
不得不说TCP基于ACK时钟驱动的AIMD模型是一个多么好的负反馈收敛模型,几乎不需要额外的任何事情,在ACK到来后,一个突发会迅速弥补失速带来的发送速率停滞。这完全是因为Reno/CUBIC算法基于cwnd来决定能发送多少数据。
然而,事情在BBR算法中起了变化,我们看一下BBR算法下类似的场景:
有点复杂了,但是仔细琢磨还是可以理解的。我们着重看一下BBR算法失速恢复过程:
问题非常明确,于是,给出我们的愿景:
仔细思考几分钟,有没有什么解决方案呢?其实不光是应对TCP失速,任何关于TCP优化的问题,归根结底都是减小图中那个小三角形面积的问题,不要试图把发送线变陡,因为带宽是大家的,不管你自己,然而一旦出现了图中的阴影三角形,那便是整个网络系统欠你的了,遗憾的是,这种债务需要你自己去理清和了结!
不多说,先给出解决方案:
…这里我给出的是省略号,和以往文章直接把答案暴露不同,这里我也没有标准的答案,就算有我也不想再写了。问题回归原点,你怎么预测ACK将会延迟聚集到达?
感谢fcicq大神总是在我闲着无所事事或者忙的焦头烂额的时候给我一些points让我思考从而可以动起来,fcicq大神提供了一个关于BBR最新进展的ppt,非常精彩:
BBR Congestion Control Work at Google IETF 101 Update:https://datatracker.ietf.org/meeting/101/materials/slides-101-iccrg-an-update-on-bbr-work-at-google-00
其中有一个非常典型的问题分析,也是和TCP失速相关的,其解决方案偏向于我上述的方案2,是一种检测到ACK行为是聚集或者延迟到达的情况下,对cwnd有所增益,具体增益值就是一个和extra_acked相关的一个数字,具体解释如下图:
图中expected_acked是怎么算出来的呢?记住下面的等式即可:
acked×interval=send_rateacked×interval=send_rate
现在的问题就是求send_ratesend_rate了,在文档:
BBR Congestion Control:IETF 99 Update:https://www.ietf.org/proceedings/99/slides/slides-99-iccrg-iccrg-presentation-2-00.pdf
中的第13/14/15页给出了一个计算方法,同时详细的算法描述请参考:
Delivery Rate Estimation:https://tools.ietf.org/id/draft-cheng-iccrg-delivery-rate-estimation-00.html。
也许还记得我前年写的那篇《来自Google的TCP BBR拥塞控制算法解析》,记得那篇文章里讲send_ratesend_rate计算的时候,给出了一张比较复杂的图:
俱往矣,太low,因为大道至简,我那个太复杂了,事情本不该那么复杂,然而初学者总是喜欢把简单事情复杂化。现在看看简单的表示是什么,当然你也可以参见我给出的链接文档(draft-cheng-iccrg-delivery-rate-estimation-00)自己去琢磨:
现在提几个问题。
- 为什么ACK会聚集到达?
原因非常多,延迟ACK,ACK丢失,TSO,限速设备…发送归拥塞控制算法自行控制,然而ACK并不是,所以拥塞控制必须监控ACK到达的行为!BBR的cwnd增益为2,某种程度上就是为了应对这种多变的ACK到达情况。 - BBR为什么要”快速恢复”而不是等待ProbeMore去做?
BBR可以这么做,并且它也是这么做的。只是我并不认同这种做法。对于单条TCP流而言,它确确实实是一个负反馈系统,自闭环的,然而如果只有单独的一条流,那么也确实不会有什么反馈,拥塞总是来自他者!总之,我不相信在经历了BBR的6个Probe匀速周期(大约8个RTT)后,由于失速而损失的带宽还能留着还给它!一定有好的解法,只是我还没有想到,而已。
101 Update:https://
上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接:
TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK:https://blog.csdn.net/dog250/article/details/52664508
是的,这是我几年前关于Delay ACK的分析,如今看来有些许不足,有些空洞,有些学院派,所以本文试图就着这个问题来分析一个关于Delay ACK以及带来相似后果的聚集ACK,以及ACK丢失等等的具体的场景,即ACK失速问题,简称TCP失速。
之所以会在假期写这篇文章,还有两个原因,首先感谢fcicq大神的提示,其次…等我的生日过后再细说。
所谓失速,即TCP发送端由于拥塞窗口配额耗尽而无法继续发送的现象。本文我依然用tcptrace来分析。
先看一下tcptrace图的概览:
有点简陋了,详情参见:
在Wireshark的tcptrace图中看清TCP拥塞控制算法的细节(CUBIC/BBR算法为例):https://blog.csdn.net/dog250/article/details/53227203
接下来我们看一下TCP失速在CUBIC算法看来是如何解决的:
不得不说TCP基于ACK时钟驱动的AIMD模型是一个多么好的负反馈收敛模型,几乎不需要额外的任何事情,在ACK到来后,一个突发会迅速弥补失速带来的发送速率停滞。这完全是因为Reno/CUBIC算法基于cwnd来决定能发送多少数据。
然而,事情在BBR算法中起了变化,我们看一下BBR算法下类似的场景:
有点复杂了,但是仔细琢磨还是可以理解的。我们着重看一下BBR算法失速恢复过程:
问题非常明确,于是,给出我们的愿景:
仔细思考几分钟,有没有什么解决方案呢?其实不光是应对TCP失速,任何关于TCP优化的问题,归根结底都是减小图中那个小三角形面积的问题,不要试图把发送线变陡,因为带宽是大家的,不管你自己,然而一旦出现了图中的阴影三角形,那便是整个网络系统欠你的了,遗憾的是,这种债务需要你自己去理清和了结!
不多说,先给出解决方案:
…这里我给出的是省略号,和以往文章直接把答案暴露不同,这里我也没有标准的答案,就算有我也不想再写了。问题回归原点,你怎么预测ACK将会延迟聚集到达?
感谢fcicq大神总是在我闲着无所事事或者忙的焦头烂额的时候给我一些points让我思考从而可以动起来,fcicq大神提供了一个关于BBR最新进展的ppt,非常精彩:
BBR Congestion Control Work at Google IETF 101 Update:https://datatracker.ietf.org/meeting/101/materials/slides-101-iccrg-an-update-on-bbr-work-at-google-00
其中有一个非常典型的问题分析,也是和TCP失速相关的,其解决方案偏向于我上述的方案2,是一种检测到ACK行为是聚集或者延迟到达的情况下,对cwnd有所增益,具体增益值就是一个和extra_acked相关的一个数字,具体解释如下图:
图中expected_acked是怎么算出来的呢?记住下面的等式即可:
acked×interval=send_rateacked×interval=send_rate
现在的问题就是求send_ratesend_rate了,在文档:
BBR Congestion Control:IETF 99 Update:https://www.ietf.org/proceedings/99/slides/slides-99-iccrg-iccrg-presentation-2-00.pdf
中的第13/14/15页给出了一个计算方法,同时详细的算法描述请参考:
Delivery Rate Estimation:https://tools.ietf.org/id/draft-cheng-iccrg-delivery-rate-estimation-00.html。
也许还记得我前年写的那篇《来自Google的TCP BBR拥塞控制算法解析》,记得那篇文章里讲send_ratesend_rate计算的时候,给出了一张比较复杂的图:
俱往矣,太low,因为大道至简,我那个太复杂了,事情本不该那么复杂,然而初学者总是喜欢把简单事情复杂化。现在看看简单的表示是什么,当然你也可以参见我给出的链接文档(draft-cheng-iccrg-delivery-rate-estimation-00)自己去琢磨:
现在提几个问题。
- 为什么ACK会聚集到达?
原因非常多,延迟ACK,ACK丢失,TSO,限速设备…发送归拥塞控制算法自行控制,然而ACK并不是,所以拥塞控制必须监控ACK到达的行为!BBR的cwnd增益为2,某种程度上就是为了应对这种多变的ACK到达情况。 - BBR为什么要”快速恢复”而不是等待ProbeMore去做?
BBR可以这么做,并且它也是这么做的。只是我并不认同这种做法。对于单条TCP流而言,它确确实实是一个负反馈系统,自闭环的,然而如果只有单独的一条流,那么也确实不会有什么反馈,拥塞总是来自他者!总之,我不相信在经历了BBR的6个Probe匀速周期(大约8个RTT)后,由于失速而损失的带宽还能留着还给它!一定有好的解法,只是我还没有想到,而已。
r.ietf.org/meeting/101/ www.120xh.cn /slides-101-iccrg-an www.yongshiyule.cn -update-on-bbr-work-at-google-00
其中有一个非常典型的问题分析,也是和TCP失速相关的,其解决方案偏向于我上述的方案2,是一种检测到ACK行为是聚集或者延迟到达的情况下,对cwnd有所增益,具体增益值就是一个和extra_acked相关的一个数字,具体解释如下图:
图中expected_acked是怎么算出来的呢?记住下面的等式即可:
acked×interval=send_rateacked×interval=send_rate
现在的问题就是求send_ratesend_rate了,在文档:
BBR Congestion Control:IETF 99 Update:https://www.ietf.org/proceedings/99/slides/ www.mhylpt.com slides-99-iccrg-iccrg-presentation-2-00.pdf
中的第13/14/15页给出了一个计算方法,同时详细的算法描述请参考:
Delivery Rate Estimation:https://tools.ietf.org/id/draft-cheng-iccrg-delivery-rate- www.wanmeiyuele.cn estimation-00.html。
也许还记得我前年写的那篇《来自Google的TCP BBR拥塞控制算法解析》,记得那篇文章里讲send_ratesend_rate计算的时候,给出了一张比较复杂的图:
俱往矣,太low,因为大道至简,我那个太复杂了,事情本不该那么复杂,然而初学者总是喜欢把简单事情复杂化。现在看看简单的表示是什么,当然你也可以参见我给出的链接文档(draft-cheng-iccrg-delivery-rate-estimation-00)自己去琢磨:
现在提几个问题。
- 为什么ACK会聚集到达?
原因非常多,延迟ACK,ACK丢失,TSO,限速设备…发送归拥塞控制算法自行控制,然而ACK并不是,所以拥塞控制必须监控ACK到达的行为!BBR的cwnd增益为2,某种程度上就是为了应对这种多变的ACK到达情况。 - BBR为什么要”快速恢复”而不是等待ProbeMore去做?
BBR可以这么做,并且它也是这么做的。只是我并不认同这种做法。对于单条TCP流而言,它确确实实是一个负反馈系统,自闭环的,然而如果只有单独的一条流,那么也确实不会有什么反馈,拥塞总是来自他者!总之,我不相信在经历了BBR的6个Probe匀速周期(大约8个RTT)后,由于失速而损失的带宽还能留着还给它!一定有好的解法,只是我还没有想到,而已。
从CUBIC/BBR的TCP ACK失速说起的更多相关文章
- 跨境 TCP 传输优化实录 — 使用 BBR 解决 LFN 问题
背景 近期开通了一条访问美国机房的 1G 专线,用于提供行情数据备源,并基于 TCP 建立了一套数据传输服务.上线后发现一个严重的问题:应用程序发送队列中的数据大量积压,最终导致程序 OOM Kill ...
- TCP BBR - 如何安装、启动、停止BBR!
TCP BBR从Linux 4.9 内核开始,就作为它内核的一部分存在了,如果想使用BBR,那么首先就是判断内核版本是否大于4.9,如果符合版本标准,那么直接启动BBR就可以了,如果低于4.9,升级内 ...
- TCP BBR - 一键安装最新内核并开启 TCP BBR
原文地址: https://teddysun.com/489.html 最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经 ...
- 一站式学习Wireshark(四):网络性能排查之TCP重传与重复ACK
作为网络管理员,很多时间必然会耗费在修复慢速服务器和其他终端.但用户感到网络运行缓慢并不意味着就是网络问题. 解决网络性能问题,首先从TCP错误恢复功能(TCP重传与重复ACK)和流控功能说起.之后阐 ...
- Wireshark(四):网络性能排查之TCP重传与重复ACK
原文出处: EMC中文支持论坛 作为网络管理员,很多时间必然会耗费在修复慢速服务器和其他终端.但用户感到网络运行缓慢并不意味着就是网络问题. 解决网络性能问题,首先从TCP错误恢复功能(TCP重传与重 ...
- Linux和Windows上实现的异同-Linux的自适应ACK
上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接: TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK: 是的,这是 ...
- 浅谈TCP拥塞控制算法
TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入 ...
- TCP拥塞控制算法
转自浅谈TCP拥塞控制算法 本篇文章介绍了几种经典的TCP拥塞控制算法,包括算法原理及各自适用场景. 回顾上篇文章:浅谈 redis 延迟 前言 TCP 通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的 ...
- BBR加速 Centos
BBR是什么 BBR 是 Google 提出的一种新型拥塞控制算法,可以使 Linux 服务器显著地提高吞吐量和减少 TCP 连接的延迟. BBR项目地址 https://github.com/goo ...
随机推荐
- 右键添加git-bash
主要: 右键如果没有git-bash,如何给右键手动添加 前面对右键存在git-bash但使用出现问题的解决,也想到如果右键都没有,该如何给右键添加了,于是接着记录下如何添加的过程: 情形: 手动给右 ...
- jenkins邮件发送jmeter接口测试报告
在Jenkins中配置实现邮件通知,Jenkins提供了两种方式的配置. 一种是Jenkins内置默认的邮件通知,但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容.无法定义发送邮件的格式 ...
- PAT-B1032
1032 挖掘机技术哪家强(20) 输入格式: 输入在第1行给出不超过10^5^的正整数N,即参赛人数.随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号).及其比赛 ...
- spoj1026 favorite dice
#include <bits/stdc++.h> using namespace std; int n,t; ; double dp[N]; /* 甩一个n面的骰子,问每一面都被甩到的需要 ...
- python2.7入门---元组
这次我们来学习下python中的元组.首先,基础认知点是,Python的元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号.元组创建很简单,只需要在括号中添加元素, ...
- Django学习之天气调查实例(3):部署静态文件CSS、JS、images等(部署环境基于Ubuntu)
在设计登录界面时,采用了网上下载的登录模板,漂亮,简易.但是在测试和部署时,发现原来模板中采用的js文件和css文件,却着实让我折腾了好几天. 在以往的网页设计中,一般只要把测试站点开启后,网页中的静 ...
- ORB-SLAM 代码笔记(五)Frame类
Frame类的成员变量主要包含从摄像头获取的图像的 1. 特征点信息(关键点+描述字) 2. 尺寸不变特征所用金字塔信息,这些都定义在ORBextractor对象中 3. 词袋模型参数,用于跟踪失败情 ...
- Hibernate-ORM:07.Hibernate中的参数绑定
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲解Hibernate中的参数绑定,就是相当于sql语句中的where后面的条件 一,讲解概述: 1 ...
- unity3d NavMeshAgent 寻路画线/画路径
今天在群里看见有个小伙在问Game视图寻路时怎么画线 正好前几天写了个寻路,而且自己也不知道具体怎么在寻路时画线,所以决定帮帮他,自己也好学习一下 在百度查了一下资料,直接搜寻路画路径.寻路画线... ...
- AV Foundation 实现文字转语音
AV Foundation 主要框架 CoreAudio 音频处理框架 扩展学习:<Learning CoreAudio> CoreVideo 视频处理的管道模式,逐帧访问 CoreMed ...