Wireshark TS | MQ 传输缓慢问题

2023-09-22 08:43:28

问题背景

应用传输慢是一种比较常见的问题,慢在哪,为什么慢,有时候光从网络数据包分析方面很难回答的一清二楚,毕竟不同的技术方向专业性太强,全栈大佬只能仰望,而我们能做到的是在专注于自身的专业方向之外,尽量扩展知识面,学会找出问题的规律,并提出可能的解决建议。

就像本次 MQ 案例一样,说实话我对 MQ 一无所知,但并不会让我们在拿到相关数据包跟踪文件后无从下手,总还是有解题思路,并能找到一定规律的。

案例取自 SharkFest 2010《Wireshark in the Large Enterprise》


问题信息

跟踪文件基本信息如下:

λ capinfos B2BXfer.pcap
File name:           B2BXfer.pcap
File type:           Wireshark/tcpdump/... - pcap
File encapsulation:  Ethernet
File timestamp precision:  microseconds (6)
Packet size limit:   file hdr: 8192 bytes
Packet size limit:   inferred: 55 bytes
Number of packets:   810
File size:           57 kB
Data size:           702 kB
Capture duration:    162.247000 seconds
First packet time:   2007-09-26 17:16:57.337002
Last packet time:    2007-09-26 17:19:39.584002
Data byte rate:      4332 bytes/s
Data bit rate:       34 kbps
Average packet size: 867.85 bytes
Average packet rate: 4 packets/s
SHA256:              dfbebcc56cd4a5ccfa42ed455daaa8e3ad4e21bcf91be01f5069afbb5271ee15
RIPEMD160:           aac286e82a30280f229055b711810f9c27809305
SHA1:                0d23af488435de254906ad7be75485d0ad8101e9
Strict time order:   True
Number of interfaces in file: 1
Interface #0 info:
                     Encapsulation = Ethernet (1 - ether)
                     Capture length = 8192
                     Time precision = microseconds (6)
                     Time ticks per second = 1000000
                     Number of stat entries = 0
                     Number of packets = 810

跟踪文件在 linux 上通过 tcpdump 所捕获,数据包数量 810 个,长度截断为 55 字节,文件数据大小 702k 字节,捕获时长 162.247 秒,平均速率 34k bps。

专家信息如下,可以看到异常的简洁,没有 Warning 相关信息,可见传输缓慢的问题并不是常见的丢包导致重传所引起。

image.png


问题分析

展开数据包跟踪文件实际信息如下:

image.png

首先是 TCP 三次握手,IRTT 约0.099s,另通过 TTL 64 可知,捕获点在服务器端上或者靠近服务器端的地方。

image.png

由于数据包文件截断为 55 字节的原因,所以像是 TCP SYN 数据包中的 TCP Options 字段实际仅有 1 字节显示,这也是每个数据包会显示 [Packet size limited during capture] 的原因。而这样的设置其实也可大致判断,这个传输慢并非 TCP 窗口之类的问题,像是接收窗口满等。

image.png

既然说是传输缓慢,那么使用统计中的一些图形展示会更加清楚,如下所示可以看到 I/O 图,显示的传输速率在一定时间后呈现一条笔直的横线,约 35k bps,这说明整个 MQ 传输是以一个极其规律的方式来交互,慢也有慢的规律不是。。。

image.png

通过点选 I/O 图中的散点,定位到从 No.16 开始的传输规律,分析如下:

  1. 客户端 192.168.1.1 一次性会发送三个数据分段,长度分别为 1434、1434 和 1410,可大致判断出 MSS 为 1380(1434-54),因此是两个 MSS + 一个以 PSH 标记的数据分段(不到一个 MSS 长度);
  2. 服务器端 10.10.10.10 在连续收到两个 MSS 数据分段后,会立马触发出一个 ACK 确认,但在收到最后一个 PSH/ACK 的数据分段后,在有 Delayed ACK 的情况下,延迟确认约 99ms
  3. 在服务器端第二个 ACK 返回至客户端后,客户端会等待约 800ms(900ms - IRTT 约 100ms)才会再次发送下一次数据分段(1434、1434 和 1410),如此不断反复。

image.png

image.png

因此在整个数据传输交互过程中,可以看出有三个规律:

  1. 2 MSS + 1 小于 MSS,固定发送数据规律;
  2. 延迟确认 99ms 规律;
  3. 等待 800ms 间隔发送规律。

不要小看 ms,一次传输如此,次次传输也如此,时间一长,整体的传输效率自然相当低下。通过 Delta Time 从大到小排序,接近 160 个 900+ms 延迟(总数据包才 810 个,近 20%)。

image.png

通过 TCP Trace 图,更容易看到数据包的传输规律,一图胜千言。

image.png

问题总结

总之,网络数据包分析可以清楚传输缓慢问题所在,慢在哪,至于为什么是这样的传输规律(MQ 发送),这还得回归到 MQ 应用上的专业方向。还是那句话,最后可能无法确定根因,但网络数据包分析可以为我们指明正确的方向。

更多推荐

Qt day2

作业:点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提示信息为

面试算法3:前n个数字二进制形式中1的个数

题目输入一个非负数n,请计算0到n之间每个数字的二进制形式中1的个数,并输出一个数组。例如,输入的n为4,由于0、1、2、3、4的二进制形式中1的个数分别为0、1、1、2、1,因此输出数组[0,1,1,2,1]。分析1很多人在面试的时候都能想到直观的解法,使用一个for循环来计算从0到n的每个整数i的二进制形式中1的个

模拟实现C语言--memcpy函数和memmove函数

模拟实现C语言–memcpy函数和memmove函数文章目录模拟实现C语言--memcpy函数和memmove函数一、memcpy函数和memmove函数1.1memcpy函数是什么1.1memmove函数是什么二、使用示例2.1从起始位置复制2.2从任意位置复制三、模拟实现3.1模拟实现1--memcpy函数3.2针

MySQL数据库——索引(2)-B+Tree、Hash结构,索引分类(聚集索引、二级索引)

目录索引结构(2)B+TreeHash思考索引分类索引分类聚集索引&二级索引查找过程思考索引结构(2)B+TreeB+Tree是B-Tree的变种,我们以一颗最大度数为4的b+树为例,来看一下其结构示意图:我们可以看到两部分:绿色虚线圈起来的部分,是所引部分,仅仅起到索引数据的作用,不存储数据。红色虚线圈起来的部分,是

什么是HTML?

互联网上的应用程序被称为Web应用程序,Web应用程序使用Web文档(网页)来表现用户界面,而Web文档都遵循标准HTML格式。HTML5是最新的HTML标准。之前的版本HTML4.01于1999年发布。20多年过去了,互联网已经发生了翻天覆地的变化,原有的标准已经不能满足各种Web应用程序的需求。本篇带大家一起了解H

CSP-J 2023 入门级 第一轮 阅读程序(3)

【题目】CSP-J2023入门级第一轮阅读程序(3)#include<iostream>#include<cmath>usingnamespacestd;intsolve1(intn){returnn*n;}intsolve2(intn){intsum=0;for(inti=1;i<=sqrt(n);i++){if(n

Flutter插件开发流程

本文主要给大家介绍如何开发FlutterPlugin中Android的部分。有关Flutter以及FlutterPlugin的概念,感兴趣的可以从官网查看相关资料。一、简介笔者的环境是Mac下AndroidStudio进行的开发,AS也是谷歌官推的,安装flutter插件后,开发起来相对于其他IDE来说,方便很多,自带

使用Feign实现远程调用

目录概述1、引入依赖2、启用Feign3、创建Feign接口4、使用Feign客户端5、配置Feign客户端5.1、全局配置文件5.2、Feign客户端接口5.3、自定义配置类5.4、自定义属性文件总结概述Feign是一个基于注解的HTTP客户端库,它允许您将HTTP请求转换为声明式的Java接口。您可以使用类似于Sp

qt day2

完善登录框点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提示信

Docker容器网络安全性最佳实践:防止容器间攻击

Docker容器在现代应用开发和部署中扮演着重要的角色,但由于容器共享宿主机网络环境,容器网络的安全性变得尤为重要。为了防止容器间的攻击,并保护容器网络的安全,有一些最佳实践可以采用。下面将介绍一些重要的Docker容器网络安全性最佳实践。首先,一个基本的安全原则是使用可靠和受信任的容器镜像。确保从受信任的仓库中拉取和

Unity中Shader的模板测试

文章目录前言什么是模板测试1、模板缓冲区2、模板缓冲区中存储的值3、模板测试是什么(看完以下流程就能知道模板测试是什么)模板测试就是在渲染,后渲染的物体前,与渲染前的模板缓冲区的值进行比较,选出符合条件的部分,对后渲染的物体进行渲染前言Unity中Shader的模板测试什么是模板测试1、模板缓冲区2、模板缓冲区中存储的

热文推荐