今天准备写一篇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操作的请求
参考连接
https://www.cnblogs.com/ImBit/p/5513401.html
http://www.seanyxie.com/a/jisuanjijichu/wangluo/2019/0319/8.html