【网络协议】mysql协议数据包分析

2,322 阅读3分钟

使用tcpdump抓取应用层mysql协议的数据包,然后使用wireshark工具对mysql协议数据包进行分析

一、tcpdump数据包

可以通过端口规则或mysql规则抓取对应的mysql数据包,接下来通过端口规则限定抓取mysql的数据包

1.1 查看mysql的端口

jdbc:mysql://swqa.lluozh.com:3487/lluozh?characterEncoding=UTF-8

即显然当前数据库的端口为3487

1.2 tcpdump数据包

根据端口信息抓取对应的数据包

tcpdump -i  any  port 3487 -w ceph.pcapng

二、mysql协议查看

抓取数据包后使用wireshark进行查看

2.1 打开数据包

使用wireshark打开抓取到的数据包 在这里插入图片描述 发现显示的是TCP请求,并未看到对应的MySQL协议信息,需要针对wireshark进行配置识别MySQL协议信息

2.2 协议查看配置

Wireshark -> Preferences(mac直接command+,) -> Protocols -> MySQL调出配置页面 在这里插入图片描述 MySQL TCP默认的端口是3306,业务中实际的MySQL的端口为3487,故需要将端口修改成3487,保存配置信息

2.3 MySQL协议查看

保存后自动刷新页面,可以自动识别MySQL协议的数据包 在这里插入图片描述

三、mysql协议信息

从抓取的mysql数据包中可以看出,具体传输的数据包有Request Query、Response、Response OK

3.1 Request Query

客户端执行sql语句 在这里插入图片描述

3.2 Response

服务器对客户端执行查询sql语句(Request Query)的回复 在这里插入图片描述

3.3 Response OK

服务器对客户端执行更新sql语句(Request Query)的回复 在这里插入图片描述

四、数据分析统计

由于抓取到的mysql请求数据包量很大,比如上面抓取的数据包约14800个,这样需要统计具体数据包请求的时间分布,用来分析具体的mysql处理的时间

4.1 Round Trip Time

RTT即往返时延,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延

  • 筛选MySQL请求响应包

由于数据包中有TCP的ACK包,故首先需要筛选MySQL请求响应包,便于接下来的响应时间曲线

  • RTT分析曲线

根据路径Statistics -> TCP Stream Graphs -> Round Trip Time打开RTT分析曲线图 在这里插入图片描述 可以使用Switch Direction切换源和目标的地址

  • 时间曲线验证

抽样验证一下RTT提供的时间是否正确 在这里插入图片描述 真实的数据包的响应时间是4.23ms ( = 19:55:57.530520 - 19:55:57.530097)

与RTT提供的数据严重不符

  • RTT By Sequence Number

勾选RTT By Sequence Number选项再次比对生成数据 在这里插入图片描述 真实的数据包的响应时间是36.358ms ( = 19:55:58.316878 - 19:55:58.280520),与曲线中数据基本吻合

查看响应时间曲线分析可以使用Round Trip Time的方式,但是要注意配置信息的勾选

4.2 time_delta

time_delta统计的是当前帧与上一帧的时间间隔

从语义解释上其实并不是数据包响应时间的统计数据,但在实践过程配置了该项数据,且目前从抽样数据包中并未证实该数据曲线是错误的,故Mark一下

根据路径Statistics -> I/O Graph打开页面

在这里插入图片描述

  • Display Filter

即筛选条件,设置为mysql.response_code,可以搜索mysql协议mysql执行的服务端响应包

  • Y Axis

设置AVG(Y Field),获取平均值