tcpdump抓包分析MySQL通信协议

2022年 5月 10日 71点热度 0人点赞

原文链接: https://cloud.tencent.com/developer/article/1796109

引言

今天准备写一篇 tcpdump 抓包分析方面相关的问题, 之所以写这篇文章, 主要有两个原因:

1, 面试中经常会被问到如下相关的问题

Q: 为什么要用数据库连接池?

A: 因为新建一个和数据库的连接的开销很大.

Q: 那为什么连接的开销很大呢? 或者是说, 新建数据库连接的开销主要在那些方面呢?

A:emmm……. 书上这么说 (我去去去去去..... 完全没想到过这个问题啊...)

Q: 你可以从内存, 系统调用,socket 连接考虑

A:(Orz……当时只想到了系统调用的开销)

2, 之间接到客户反馈的问题: 客户通过的 IDC 机房与腾讯云上 VPC 通过 ipsec vpn 建立连接, 从 IDC 机房能通过内网能成功连上腾讯云服务器上自建的 mysql, 但是连接云数据库 MYSQL 非常的慢, 直接就是卡死的状态;

最后这个问题解决是通过抓包分析, 最后找到原因: 抓包分析到有由于报文超过了 ipsec 隧道的 MTU 值, IPSEC 1500 导致长度 1464 可以进入隧道, 但是隧道加了头之后会超过 1500; 如果分片 IPSEC 头就会破坏, 所以通过 IPSEC strongswan 的解决方案 减少 TCP MSS 问题得到解决)

问题场景

通过抓取的数据包分析, 云数据库连续重传后 FIN/RESET 了链接.

file

file

file

以上就是通过抓包分析出现的问题原因, 最终完美解决! (不明觉厉!!!)

好, 出于上述的两个原因, 所以下面我们通过转包简单的分析一下 mysql 通信协议;

抓包分析

客户端 A:

[root@VM_54_118_centos ~]# tcpdump -i eth0 -s0 host 10.66.161.135 -w /tmp/cvm_conn_cdb.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

客户端 B:

[root@VM_54_118_centos ~]# mysql -h 10.66.161.135 -u root -XXXXX
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'10.105.54.118' (using password: YES)

注意: 上面输出的是错误的密码, 所以连接失败

[root@VM_54_118_centos ~]# mysql -h 10.66.161.135 -u root -pXXXXX

输入正确的密码, 连接成功, 执行如下的相关操作

root@10.105.54.118 [(none)]>use wjq;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

root@10.105.54.118 [wjq]>select * from test2 limit 5;
+----+-----------+-------+------+
| id | name      | count | age  |
+----+-----------+-------+------+
|  1 | 魏 XXXX   |   300 | NULL |
|  2 | 张三      |   500 | NULL |
|  3 | 李四      |   700 | NULL |
+----+-----------+-------+------+
3 rows in set (0.00 sec)

root@10.105.54.118 [wjq]>exit
Bye

首先, 查看一下上面输入错误的密码:

file

下面是输入正确的密码连接成功后, 分析一下相关的数据包

file

先看 12,13,14 三行, TCP 的三次握手, 没什么可说的.

15 行, MySQL 协议: Server Greeting, 告诉客户端协议号和版本号.

file

服务器端状态

file

16 行, TCP 协议: 客户端的 ACK 响应, 表示收到了 15 分节的响应.

17 行, MySQL 协议: Login Request, 客户端登录请求, 并给出了登录用户名.

file

18 行, TCP 协议: 服务器的 ACK 响应, 表示收到了 17 行的登录请求.

19 行, MySQL 协议:Response OK, 服务器对登录请求 (Login Request) 的回复, 经过验证, 账号密码均正确, 可以登录 OK.

20 行, MySQL 协议:Request Query, 客户端执行 sql 语句.

21 行, MySQL 协议:Response OK, 服务器对客户端执行 sql 语句 (Request Query) 的回复, 执行成功 OK.

24 行, TCP 协议: 客户端的 ACK 响应, 表示收到了上述 20-23 行的请求.

file

访问 mysql 的相关操作

use wjq;
select * from test2 limit 5;
exit;

28 行, MySQL 协议,SQL 操作请求 (use wjq)

file

1509 行, MySQL 协议,SQL 操作请求 (select * from test2 limit 5;)

file

1510 行, MySQL 协议, 返回给 SQL 操作的请求

file

TCP 挥手

file

参考连接

rainbow

这个人很懒,什么都没留下

文章评论