原文链接: 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 了链接.
以上就是通过抓包分析出现的问题原因, 最终完美解决! (不明觉厉!!!)
好, 出于上述的两个原因, 所以下面我们通过转包简单的分析一下 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
首先, 查看一下上面输入错误的密码:
下面是输入正确的密码连接成功后, 分析一下相关的数据包
先看 12,13,14 三行, TCP 的三次握手, 没什么可说的.
15 行, MySQL 协议: Server Greeting, 告诉客户端协议号和版本号.
服务器端状态
16 行, TCP 协议: 客户端的 ACK 响应, 表示收到了 15 分节的响应.
17 行, MySQL 协议: Login Request, 客户端登录请求, 并给出了登录用户名.
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 行的请求.
访问 mysql 的相关操作
use wjq;
select * from test2 limit 5;
exit;
28 行, MySQL 协议,SQL 操作请求 (use wjq)
1509 行, MySQL 协议,SQL 操作请求 (select * from test2 limit 5;)
1510 行, MySQL 协议, 返回给 SQL 操作的请求
TCP 挥手
文章评论