Linux和Windows上实现的异同-Linux的自适应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 www.boshenyl.cn Work at Google IETF 101 Update:https://www.2636666.cn /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.yongshiyule.cn /proceedings/99/slides/ www.120xh.cn 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- www.wanmeiyuele.cn rate-estimation-00)自己去琢磨:
现在提几个问题。
- 为什么ACK会聚集到达?
原因非常多,延迟ACK,ACK丢失,TSO,限速设备…发送归拥塞控制算法自行控制,然而ACK并不是,所以拥塞控制必须监控ACK到达的行为!BBR的cwnd增益为2,某种程度上就是为了应对这种多变的ACK到达情况。 - BBR为什么要”快速恢复”而不是等待 www.cnzhaotai.com ProbeMore去做?
BBR可以这么做,并且它也是这么做的。只是我并不认同这种做法。对于单条TCP流而言,它确确实实是一个负反馈系统,自闭环的,然而如果只有单独的一条流,那么也确实不会有什么反馈,拥塞总是来自他者!总之,我不相信在经历了BBR的6个Probe匀速周期(大约8个RTT)后,由于失速而损失的带宽还能留着还给它!一定有好的解法,只是我还没有想到,而已。
Linux和Windows上实现的异同-Linux的自适应ACK的更多相关文章
- 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...
- windows上使用SecureCRT连接linux
前言: SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件.这样操作的时候不必进入到linux桌面,可以更方便的 ...
- JMC监控(Windows上远程连接监控Linux服务器的JVM)
Windows上远程连接监控Linux服务器的JVM:1.Linux服务器上配置:在Tomcat的tomcat-wms/bin/catalina.sh中添加CATALINA_OPTS="-X ...
- Windows上传文件到linux 使用winscp
Windows上传文件到linux 使用winscp, winscp下载目录 https://sourceforge.net/projects/winscp/postdownload?source=d ...
- windows上传文件到 linux的hdfs
一.windows上传文件到 linux的hdfs 1.先在 centos 上开启 hdfs, 用 jps 可以看到下面信息, 说明完成开启 2.在win上配置 hadoop (https://www ...
- 怎么在自己的windows上创建虚拟机(linux centos7)
怎么在自己的windows上创建虚拟机(linux centos7) 作为一个非科班出身自学的小白,踩过很多的坑,特此留下记录 宿主机:windows10系统 8G 64位操作系统 虚拟机:linux ...
- SSH 无密码访问其它机器 和 Windows 上 putty 无密码访问 Linux 机器
1. 从一台 Linux 机器(ubuntu1)上无密码访问其它机器(ubuntu2) (1)登录 ubuntu1 并切换到用户比如 s1 (2)运行 ssh-keygen -t rsa (3)运行c ...
- 如何解决Python脚本在Linux和Windows上的格式问题
python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...
- Xshell实现Windows上传文件到Linux主机
我是怎么操作的: 1.打开一台本地Linux虚拟机,使用mount 挂载Windows的共享文件夹到Linux上,然后拷贝数据到Linux虚拟机里面:(经常第一步都不顺利,无法挂载Windows的文件 ...
随机推荐
- 在Vue项目里面使用d3.js
之前写一个 Demo里面 有些东西要使用d3实现一些效果 但是在很多论坛找资源都找不到可以在Vue里面使用D3.js的方法,npm 上面的D3相对来说 可以说是很不人性化了 完全没有说 在webpac ...
- BC追踪
项目又要开始改造了,记录一下改造过程中碰到的坑和解决思路,避免以后回头看看自己的笔记都不知道写了什么. (一)敏感信息混淆 (二)活用ComponentScan (三)Swagger配置多项目共用 ( ...
- 微信小程序缓存
购物车数据加入缓存,相同的商品值修改数量,然后再次加入缓存中 修改购物车的数据的时候同理,都是修改缓存数据然后加入到缓存中. 具体的使用方法看官方文档,我只是提供思路
- MyBatis实现拦截器分页功能
1.原理 在mybatis使用拦截器(interceptor),截获所执行方法的sql语句与参数. (1)修改sql的查询结果:将原sql改为查询count(*) 也就是条数 (2)将语句sql进行拼 ...
- Java学习笔记一:三步搭建Java开发环境
Java开发环境搭建 一:安装JDK: 1.下载地址:http://www.oracle.com/technetwork/java/javase/downloads 非常显眼的下载界面 2.点击下载后 ...
- JSOI2018 R1 & 九省联考2018 滚粗记
在NOIP与PKUWC相继滚粗后,rp守恒定律似乎终于开始起作用了…… (尽管Day2依然滚粗?) Day1: 本着前40min不写代码的准则,先把三道题大致过了一遍,似乎都比较喜闻乐见? T1:对抗 ...
- 安装和配置Sentry(收录)
安装和配置Sentry 本文主要记录安装和配置Sentry的过程,关于Sentry的介绍,请参考 Apache Sentry架构介绍 . 1. 环境说明 系统环境: 操作系统:CentOs 6.6 H ...
- PRO*C 函数事例 1 -- 数据库连接、事务处理
1.程序结构 每一个Pro*C程序都包括两部分:(1)应用程序首部:(2)应用程序体 应用程序首部定义了ORACLE数据库的有关变量, 为在C语言中操纵ORACLE数据库做 ...
- RabbitMQ ddemo 费元星
http://blog.csdn.net/lmj623565791/article/details/37607165 转载请标明出处:http://blog.csdn.net/lmj623565791 ...
- vue2.0 watch
类型:string | Function | Object vue官网解释: 一个对象,键是需要观察的表达式,值是对应回调函数.值也可以是方法名,或者包含选项的对象.Vue 实例将会在实例化时调用 $ ...