目的:
了解php连接mysql时,具体过程
方法:
php-cli连接mysql
tcpdump抓包,wireshark分析
环境:
ubuntu18.04,php7.3, mysql5.7
脚本:
$db = new mysqli("127.0.0.1",'root','password','database');
if($db->connect_errno) {
exit("failed,errno:".$db->connect_errno."||".$db->connect_error);
}
$data = $db->query("select * from demo");
foreach($data as $item) {
var_dump($item);
}
$db->close();
抓包:
sudo tcpdump -i 2 -w db.log
wireshark过滤网络包:
image.png
分析:
分节No207~209,tcp协议的三次握手
No210,连接成功,mysql server发送一个greeting packet
No211,对No210的ACK,表示收到了No210 Packet
No212,client(php-cli)请求登录,packet信息包括账号、密码(加密后)、库名
No213,对No212的ACK
No214,mysql server 的response packet,表示client的账号、密码验证成功
No215,client发送查询命令
No216,mysql server返回查询结果
No217,client主动关闭连接(mysql_close)
No218~220,tcp连接断开,四次挥手(No219,server端的FIN和ACK包合并了)
对于mysql而言,
No210~No214,称为连接阶段;
No215~No217,称为命令阶段。
总结
通过tcpdump抓包配合wireshark,可以简单分析mysql协议的交互过程。
另外,数据包中包含了很多信息(文章末尾的两个链接可供参考)
Refer:
mysql协议
官网:https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_PROTOCOL.html
http://heguangyu5.github.io/mysql/1-protocol.html
https://www.cnblogs.com/davygeek/p/5647175.html
网友评论