TCP系列42—拥塞控制—5、Linux中的慢启动和拥塞避免(二)
在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上一篇一样对每个报文都进行讲解并随报文更新相关状态变量的值了。
一、wireshark示例
本篇示例的TCP测试仍然设置初始拥塞窗口为3,并关闭TSO、GSO等功能。同时设置wireshark使其不在info列显示TSopt的信息。
******@Inspiron:~$ sudo ip route add local 127.0.0.2 dev lo congctl reno initcwnd 3 #请参考本系列destination metric文章
******@Inspiron:~$ ip route show table all | grep 127.0.0.2
local 127.0.0.2 dev lo table local scope host initcwnd 3 congctl reno
******@Inspiron:~$ sudo ethtool -K lo tso off gso off #关闭tso gso以方便观察cwnd变化
client与server端建立连接后,先发送一个请求报文No4,server端则立即回复ACK确认包。server端在与client建立连接后休眠1000ms,然后每隔5ms发送50bytes的数据包,总共发送14次。client端则每收到两个报文的时候回复一个ACK确认包。最终TCP流如下图所示,图中in_flight列是wireshark对于目前还在传输中的数据量的估计,在这种简单场景下wireshark的估计与linux是一致的,可以作为参考
No9-No13:No9报文回复了No6和No7两个报文,server端收到No9报文后,直接更新cwn=cwnd+2=5,此时in_flight=packets_out=1,因此可以额外发出四个新的数据包,即No10-No13。从wireshark中也可以看到发送完No13后in_flight为250,正好是5个数据包的大小。
No14-No18:与No9-No13类似不再重复分析
No19-No22:server端收到No19后,只有150bytes三个数据包等待发送,因此最终只发出了No20-No22三个数据包。
2、慢启动与ABC、stretched ACK、ACK Compression
ABC(Appropriate Byte Count):是指接收端对于接收到的一个TCP报文,分段反馈多个有效的ACK确认包,如果发送端收到每个ACK确认包后都会更新cwnd,那么在慢启动阶段可能会导致cwnd增长异常迅速,而且超过链路的承载能力,最终降低TCP的性能。这种手段也称呼为ABC攻击。
stretched ACK:我们之前介绍延迟ACK时候介绍过,当以SMSS发送报文的时候,协议规定延迟ACK不能超过两个full-sized报文。但是如果接收端收到的ACK确认包中ack number确认了三个或者以上的full-sized的报文的时候,这个ACK就叫做stretched ACK。stretached ACK原因有多种,最常见的就是ACK报文丢失。
ACK compression:由于中间链路的缓存以及和其他TCP连接一起共享缓存等原因,可能会导致ACK报文成堆到达发送端。这种场景我们就称呼为ACK压缩。
对于ACK compression场景,reno拥塞控制就是逐个处理每个ACK报文,这样就会导致拥塞窗口突然增大,发送端突然发出大量的TCP报文,这种突然发出大量数据的行为我们称呼为burst,影响网络平稳。另外一方面ACK compression还会影响RTT估计,之前我们介绍过有些拥塞控制算法基于时延来来估计网络拥塞情况,因此 ACK compresion还会影响这类基于时延的拥塞控制算法的性能。
在这里我们仅演示一下linux慢启动对于ABC和stretched ACK的处理场景,拥塞避免阶段的处理与慢启动类似不在示例,如下图所示我高亮标出了一些ACK报文
No12:可以看到No12相对于No9报文Ack number一共反馈确认了三个数据包,这个就是我们说的stretched ACK。可以看到此处linux对于stretched ACK的处理上,直接更新了cwnd=cwnd+3,然后一共发出了No13-No18六个数据包。
No19-No21:可以看到No19相对于No12,ack number只反馈确认了30bytes的数据,并没有完整反馈No11这个数据包,No20同样也没有完整反馈No11这个数据包,linux在收到这两个ACK报文的时候,则会判断是否完整反馈了之前发出的No11数据包,当发现没有完整反馈No11数据包的时候并不会更新cwnd。直到linux收到No21这个数据包后,发现之前的No11这个数据包已经被完整反馈了,因此更新cwnd=cwnd+1,发出两个数据包。
3、多个数据包RTO超时
在之前的综合示例中我们看到过,一次RTO超时触发重传后,同一个报文的多次RTO超时并不会继续更新ssthresh,而随后的recovery point之前的慢启动重传也不会更新ssthresh。但是在recovery point之前的多个数据包触发的RTO超时则会重新更新ssthresh。一定要记得是不同TCP报文的RTO超时才会更新ssthresh,而linux只有一个RTO定时器。要分清慢启动重传和RTO超时重传的区别。
这个示例与综合示例非常类似,不同点在于这次RTO超时的是Seq为451的报文,而且No43对应的报文发生了两次RTO超时。下面总结一下这个示例相对于综合示例的几个注意点
No35:可以看到这个loss probe报文是个重传包,而之前综合示例中,loss probe报文是一个未发送过的报文,这里一定要分清,No35的重传是TLP超时触发的,而不是RTO超时触发。看不懂的前翻TLP的文章。
No43、No47、No48:No43是一个慢启动重传,并不是RTO超时触发的,因此不会更新ssthresh,而No47则是No43的RTO超时重传,因此会更新ssthresh = max(cwnd/2, 2),实际上在RTO超时发出No47之前,ssthresh=6,cwnd=4,而RTO超时发出No47报文后,则更新ssthresh=2,cwnd=1。No48同样是RTO超时重传,但是No48和No47是同一个数据包的多次连续RTO超时重传因此不会更新ssthresh。另外这里可以看到wireshark估计的in_flight的大小与linux的差异,例如在RTO超时重传No35后,linux计算的in_flight为1,大小实际为50bytes。之前我们已经介绍过多个linux和wireshark对数据包理解上的差异了。
TCP系列42—拥塞控制—5、Linux中的慢启动和拥塞避免(二)的更多相关文章
- TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)
一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...
- 牛客网Java刷题知识点之拥塞发生的主要原因、TCP拥塞控制、TCP流量控制、TCP拥塞控制的四大过程(慢启动、拥塞避免、快速重传、快速恢复)
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- TCP系列54—拥塞控制—17、AQM及ECN
一.概述 ECN的相关内容是在RFC3168中定义的,这里我简单描述一下RFC3168涉及的主要内容. 1.AQM和RED 目前TCP中多数的拥塞控制算法都是通过缓慢增加拥塞窗口直到检测到丢包来进行慢 ...
- TCP系列46—拥塞控制—9、SACK下的快速恢复与Limited transmit
一.概述 1.SACK下的特殊处理过程 SACK下的拥塞控制处理是linux中拥塞控制的实现依据,再次强调一遍RFC6675的重要性,linux中拥塞控制主体框架的实现是与RFC6675一致的,所以如 ...
- TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传
一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...
- TCP系列44—拥塞控制—7、SACK关闭的快速恢复
) return; delta = ssthresh - in_flight; prr_delivered += newly_acked_sacked; if (delta < 0 ...
- TCP系列43—拥塞控制—6、Congestion Window Validation(CWV)
一.概述 在RFC2861中,区分了TCP连接数据传输的三种状态 After sending a data segment: If tcpnow - T_last >= RTO ...
- TCP系列40—拥塞控制—3、慢启动和拥塞避免概述
本篇中先介绍一下慢启动和拥塞避免的大概过程,下一篇中将会给出多个linux下reno拥塞控制算法的wireshark示例,并详细解释慢启动和拥塞避免的过程. 一.慢启动(slow start) 一个T ...
- TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...
随机推荐
- 【深度优先搜索】NOIP2017_D2T1 洛谷3958奶酪
这道题的写法大体有两种:大法师DFS和并查集,两种算法都不难,本篇博客主要讲解DFS,而且测试数据特水,连个剪枝都不用都可以过. 题目描述[luogu传送门] 现有一块大奶酪,它的高度为 h,它的长度 ...
- spark 例子wordcount topk
spark 例子wordcount topk 例子描述: [单词计算wordcount ] [词频排序topk] 单词计算在代码方便很简单,基本大体就三个步骤 拆分字符串 以需要进行记数的单位为K,自 ...
- Linux入门进阶第四天——服务管理
以下均基于CentOS6.3,其中有部分命令已经过时,在CentOS7中不再使用,请注意 [更新]:CentOS7改变: CentOS .0中一个最主要的改变,就是切换到了systemd.它用于替代红 ...
- 20155230 2016-2017-2 《Java程序设计》第三周学习总结
---恢复内容开始--- 20155230 张瑞琦 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 1.使用浮点数时用equals()进行比较,否则会出错. ...
- 20155231 2016-2017-2 《Java程序设计》第2周学习总结
20155231 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 学习目标: 了解java编程风格 认识java的类型与变量 掌握java流程控制 第三章基础 ...
- 20155233 实验一 Java开发环境的熟悉(Linux + IDEA)
20155233 实验一 Java开发环境的熟悉(Linux + IDEA) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA编辑.编译.运行.调试Java程序. 实验步骤 ( ...
- 20155332 2016-2017-2《Java程序设计》课程总结
20155332 2016-2017-2<Java程序设计>课程总结 1.每周作业链接汇总 2.博客之最 3.实验链接汇总 博客链接汇总 预备作业1:那些年陪伴我的老师+我期待的师生关系 ...
- # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155336<信息安全技术>实验二——Windows口令破解 实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理 ...
- 20155337 2016-2017-2 《Java程序设计》第一周学习总结
20155337 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 我们主要学习的是JAVA SE平台也就是标准平台-Java SE四个组成部分:JVM .JR ...
- 4825: [Hnoi2017]单旋
4825: [Hnoi2017]单旋 链接 分析: 以后采取更保险的方式写代码!!!81行本来以为不特判也可以,然后就总是比答案大1,甚至出现负数,调啊调啊调啊调~~~ 只会旋转最大值和最小值,以最小 ...