在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上一篇一样对每个报文都进行讲解并随报文更新相关状态变量的值了。

一、wireshark示例

本篇示例的TCP测试仍然设置初始拥塞窗口为3,并关闭TSO、GSO等功能。同时设置wireshark使其不在info列显示TSopt的信息。

  1. ******@Inspiron:~$ sudo ip route add local 127.0.0.2 dev lo congctl reno initcwnd 3 #请参考本系列destination metric文章
  2. ******@Inspiron:~$ ip route show table all | grep 127.0.0.2
  3. local 127.0.0.2 dev lo  table local  scope host  initcwnd 3 congctl reno
  4. ******@Inspiron:~$ sudo ethtool -K lo tso off gso off  #关闭tso gso以方便观察cwnd变化  
1、慢启动与延迟ACK

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中的慢启动和拥塞避免(二)的更多相关文章

  1. TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)

    一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...

  2. 牛客网Java刷题知识点之拥塞发生的主要原因、TCP拥塞控制、TCP流量控制、TCP拥塞控制的四大过程(慢启动、拥塞避免、快速重传、快速恢复)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  3. TCP系列54—拥塞控制—17、AQM及ECN

    一.概述 ECN的相关内容是在RFC3168中定义的,这里我简单描述一下RFC3168涉及的主要内容. 1.AQM和RED 目前TCP中多数的拥塞控制算法都是通过缓慢增加拥塞窗口直到检测到丢包来进行慢 ...

  4. TCP系列46—拥塞控制—9、SACK下的快速恢复与Limited transmit

    一.概述 1.SACK下的特殊处理过程 SACK下的拥塞控制处理是linux中拥塞控制的实现依据,再次强调一遍RFC6675的重要性,linux中拥塞控制主体框架的实现是与RFC6675一致的,所以如 ...

  5. TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传

    一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...

  6. TCP系列44—拥塞控制—7、SACK关闭的快速恢复

    ) return;    delta = ssthresh - in_flight;     prr_delivered += newly_acked_sacked; if (delta < 0 ...

  7. TCP系列43—拥塞控制—6、Congestion Window Validation(CWV)

    一.概述 在RFC2861中,区分了TCP连接数据传输的三种状态   After sending a data segment:       If tcpnow - T_last >= RTO ...

  8. TCP系列40—拥塞控制—3、慢启动和拥塞避免概述

    本篇中先介绍一下慢启动和拥塞避免的大概过程,下一篇中将会给出多个linux下reno拥塞控制算法的wireshark示例,并详细解释慢启动和拥塞避免的过程. 一.慢启动(slow start) 一个T ...

  9. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...

随机推荐

  1. STM32F4 SPI双机通讯调试总结

    1.如果查询方式进行数据收发,不管是Master,还是Slave,流程如下:(假设收发n+1个字节) a.等待TXE,写入一个字节 b.等待TXE,写入一个字节 c.等待RXNE,读取一个字节 循环b ...

  2. spring boot2整合dubbox全注解

    前题 dubbox是dubbo的一个升级版,简单说就是本来dubbo是阿里开发的,现在阿里不维护了,当当网拿过去继续开发.本来阿里的dubbo维护到2.6版本,而再高版本的都是当当网维护的就叫成dub ...

  3. linux几个重要的组合键

    我们在用Windows系统时,有没有感觉快键键让我们工作更有效率,在Linux系统中仍有很好用的快捷键,这些快捷键可以辅助我们进行指令的编写与程序的中断呢,下面介绍几个经常用到的快捷键. 一.Tab- ...

  4. 从“顶点小说”下载完整小说——python爬虫

    此程序只是单纯的为了练习而做,首先这个顶点小说非收费型的那种小说网站(咳咳,我们应该支持正版,正版万岁,✌).经常在这个网站看小说,所以就光荣的选择了这个网站.此外,其实里面是自带下载功能的,而且支持 ...

  5. go VS NET 字符串操作能力

    今天拿golang 与 NET4.0 做了在字符串方面的性能比较,看看谁牛! 一.读取txt文本文件 GO的代码: readbuf, _ := ioutil.ReadFile(userFile) st ...

  6. 20155313 实验三《Java面向对象程序设计》实验报告

    一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器>课程 2.完成实验.撰写实验报 ...

  7. 20155316 2015-2017-2 《Java程序设计》第4周学习总结

    教材学习内容总结 继承 多态 重新定义 java.lang.object 垃圾收集机制 接口与多态 接口枚举常数 学习笔记存放(部分) 标准类 继承 static与权限修饰 [请勿转载,谢谢] 教材学 ...

  8. 用sudo 运行命令的时候,环境变量用的是super用户的环境变量

    比如今天在~/.bashrc设置了JAVA_HOME, 而sudo运行命令的时候却显示没有设置可用的JAVA_HOME

  9. Drupal7重置密码方法

    Drupal版本 7.40 方法1: 根目录index.php添加 require_once 'includes/password.inc'; require_once 'includes/boots ...

  10. idea项目 run、debug变灰色的问题

    点击如图所示位置的下来三角按钮,然后选择Edit Configurations,或者点击菜单栏Run>Edit Configurations 2 在运行配置窗口,选择一条springboot的运 ...