MySQL 抓包数据协议分析(客户端到服务端的通讯协议)
1 典型的 MySql 会话过程
描述
一次正常的过程如下:
1) 三次握手建立 tcp 连接
2) 建立 MySql 连接
a) 服务端往客户端发送握手初始化包(Handshake Initialization Packet)
b) 客户端往服务端发送验证包(Client Authentication Packet)
c) 服务端往客户端发送成功包
3) 客户端与服务端之间交互
a) 客户端往服务端发送命令包(Command Packet)
b) 服务端往客户端发送回应包(OK Packet, or Error Packet, or Result Set Packet)
4) 断开 MySql 连接
a) 客户端往服务端发送退出命令包
5) 四次握手断开 tcp 连接
1.2 举例(使用 tcpdump 抓包)
客户端在命令行模式下使用命令:mysql–u root –pdbaudit–h 192.168.86.206 连上数据库抓取
的数据包如下:
1.2.1 登陆
1)三次握手建立连接
19:00:22.534342 IP 192.168.86.101.59614 >localhost.localdomain.mysql: S
911022238:911022238(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
0x0000: 4500 0034 043f 4000 4006 0801 c0a8 5665 E..4.?@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 189e 0000 0000 ..V.....6M......
0x0020: 8002 2000 dbdd 0000 0204 05b4 0103 0302 ................
0x0030: 0101 0402 ....
19:00:22.534390 IP localhost.localdomain.mysql> 192.168.86.101.59614: S
3302432077:3302432077(0) ack 911022239 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7>
0x0000: 4500 0034 0000 4000 4006 0c40 c0a8 56ce E..4..@.@..@..V.
0x0010: c0a8 5665 0cea e8de c4d7 1d4d 364d 189f ..Ve.......M6M..
0x0020: 8012 16d0 02d3 0000 0204 05b4 0101 0402 ................
0x0030: 0103 0307 ....
19:00:22.534916 IP 192.168.86.101.59614 >localhost.localdomain.mysql: .ack 1 win 4380
0x0000: 4500 0028 0440 4000 4006 080c c0a8 5665 E..(.@@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 189f c4d7 1d4e ..V.....6M.....N
0x0020: 5010 111c 4959 0000 0000 0000 0000 P...IY........
2)服务端向客户諯发送握手初始化包(Handshake Initialization Packet)
19:00:22.535632 IP localhost.localdomain.mysql> 192.168.86.101.59614: P 1:79(78) ack 1 win 46
0x0000: 4508 0076 0d33 4000 4006 fec2 c0a8 56ce E..v.3@.@.....V.
0x0010: c0a8 5665 0cea e8de c4d7 1d4e 364d 189f ..Ve.......N6M..
0x0020: 5018 002e 2eed 0000 4a00 0000 0a35 2e35 P.......J....5.5
0x0030: 2e32 3100 8200 0000 2f75 2246 7b58 2652 .21...../u"F{X&R
0x0040: 00ff f708 0200 0f80 1500 0000 0000 0000 ................
0x0050: 0000 004b 6128 4049 2d46 565d 5366 2900 ...Ka(@I-FV]Sf).
0x0060: 6d79 7371 6c5f 6e61 7469 7665 5f70 6173 mysql_native_pas
0x0070: 7377 6f72 6400 sword.
3)客户端向服务端发送包含用户名密码的验证包(Client Authentication Packet)
19:00:22.536678 IP 192.168.86.101.59614 >localhost.localdomain.mysql: P 1:63(62) ack 79 win
4360
0x0000: 4500 0066 0441 4000 4006 07cd c0a8 5665 E..f.A@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 189f c4d7 1d9c ..V.....6M......
0x0020: 5018 1108 b2d0 0000 3a00 0001 85a6 0300 P.......:.......
0x0030: 0000 0001 0800 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 726f 6f74 ............root
0x0050: 0014 ce03 1683 429e cae8 cb93 5435 71f2 ......B.....T5q.
0x0060: 7439 d842 1922 t9.B."
4)服务端向客户端发送一个空包(普通的 tcp 包,跟 mysql 无关)
19:00:22.536748 IP localhost.localdomain.mysql> 192.168.86.101.59614: .ack 63 win 46
0x0000: 4508 0028 0d34 4000 4006 ff0f c0a8 56ce E..(.4@.@.....V.
0x0010: c0a8 5665 0cea e8de c4d7 1d9c 364d 18dd ..Ve........6M..
0x0020: 5010 002e 59bb 0000 P...Y...
5)服务端向客户端发送一个成功包(OK Packet)
19:00:22.536827 IP localhost.localdomain.mysql> 192.168.86.101.59614: P 79:90(11) ack 63 win
46
0x0000: 4508 0033 0d35 4000 4006 ff03 c0a8 56ce E..3.5@.@.....V.
0x0010: c0a8 5665 0cea e8de c4d7 1d9c 364d 18dd ..Ve........6M..
0x0020: 5018 002e 2eaa 0000 0700 0002 0000 0002 P...............
0x0030: 0000 00 ...
6)客户端向服务端发送一个包(跟 mysql 似乎无关,包头不符合协议标准)
19:00:22.734205 IP 192.168.86.101.59614 >localhost.localdomain.mysql: .ack 90 win 4357
0x0000: 4500 0028 0444 4000 4006 0808 c0a8 5665 E..(.D@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 18dd c4d7 1da7 ..V.....6M......
0x0020: 5010 1105 48d9 0000 0000 0000 0000 P...H.........
1.2.2 客户端与服务端之间交互
客户端输入:usemysql
服务端返回:Database changed
1)客户端向服务端发送一个命令包(类型为 COM_QUERY)
19:07:56.352167 IP 192.168.86.101.59614 >localhost.localdomain.mysql: P
911022301:911022323(22) ack 3302432167 win 4357
0x0000: 4500 003e 0450 4000 4006 07e6 c0a8 5665 E..>.P@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 18dd c4d7 1da7 ..V.....6M......
0x0020: 5018 1105 fe85 0000 1200 0000 0353 454c P............SEL
0x0030: 4543 5420 4441 5441 4241 5345 2829 ECT.DATABASE()
2)服务端向客户端发送一个结果包(ResultSet)
一个 ResultSet 包含了多个包,每个包都有自己的包头包体,
下面这个返回数据就包含了五个包(1 个 ResultSet Head Packet + 1 个 Field Packet + 1 个 EOF
Packet + 1 个 Row Data Packet + 1 个 EOF Packet)
19:07:56.352413 IP localhost.localdomain.mysql> 192.168.86.101.59614: P 1:65(64) ack 22 win
46
0x0000: 4508 0068 0d36 4000 4006 fecd c0a8 56ce E..h.6@.@.....V.
0x0010: c0a8 5665 0cea e8de c4d7 1da7 364d 18f3 ..Ve........6M..
0x0020: 5018 002e 2edf 0000 0100 0001 0120 0000 P...............
0x0030: 0203 6465 6600 0000 0a44 4154 4142 4153 ..def....DATABAS
0x0040: 4528 2900 0c08 0022 0000 00fd 0000 1f00 E()...."........
0x0050: 0005 0000 03fe 0000 0200 0100 0004 fb05 ................
0x0060: 0000 05fe 0000 0200 ........
3)客户端向服务端发送一个命令包(类型为 COM_INIT_DB)
19:07:56.353134 IP 192.168.86.101.59614 >localhost.localdomain.mysql: P 22:32(10) ack 65 win
4341
0x0000: 4500 0032 0451 4000 4006 07f1 c0a8 5665 E..2.Q@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 18f3 c4d7 1de7 ..V.....6M......
0x0020: 5018 10f5 5534 0000 0600 0000 026d 7973 P...U4.......mys
0x0030: 716c ql
4)服务端向客户端发送一个成功包(OK Packet)
19:07:56.367217 IP localhost.localdomain.mysql> 192.168.86.101.59614: P 65:76(11) ack 32 win
46
0x0000: 4508 0033 0d37 4000 4006 ff01 c0a8 56ce E..3.7@.@.....V.
0x0010: c0a8 5665 0cea e8de c4d7 1de7 364d 18fd ..Ve........6M..
0x0020: 5018 002e 2eaa 0000 0700 0001 0000 0002 P...............
0x0030: 0000 00 ...
5)客户端向服务端发送一个包(跟 mysql 没什么关系,包头为 0000 0000)
19:07:56.561717 IP 192.168.86.101.59614 >localhost.localdomain.mysql: .ack 76 win 4339
0x0000: 4500 0028 0455 4000 4006 07f7 c0a8 5665 E..(.U@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 18fd c4d7 1df2 ..V.....6M......
0x0020: 5010 10f3 4880 0000 0000 0000 0000 P...H.........
客户端输入:show tables
服务端返回:查询结果,当前数据库中所有的表
1)客户端向服务端发送一个命令包(类型为 COM_QUERY)
19:22:17.971933 IP 192.168.86.101.59614 >localhost.localdomain.mysql: P
911022333:911022349(16) ack 3302432242 win 4339
0x0000: 4500 0038 0466 4000 4006 07d6 c0a8 5665 E..8.f@.@.....Ve
0x0010: c0a8 56ce e8de 0cea 364d 18fd c4d7 1df2 ..V.....6M......
0x0020: 5018 10f3 1d24 0000 0c00 0000 0373 686f P....$.......sho
0x0030: 7720 7461 626c 6573 w.tables
2)服务端向客户端发送一个普通的 tcp 包
19:22:18.011368 IP localhost.localdomain.mysql> 192.168.86.101.59614: .ack 16 win 46
0x0000: 4508 0028 0d38 4000 4006 ff0b c0a8 56ce E..(.8@.@.....V.
0x0010: c0a8 5665 0cea e8de c4d7 1df2 364d 190d ..Ve........6M..
0x0020: 5010 002e 5935 0000 P...Y5..
3)服务端向客户端发送一个响应结果包(Result Packets)
19:22:18.031320 IP localhost.localdomain.mysql> 192.168.86.101.59614: P 1:521(520) ack 16
win 46
0x0000: 4508 0230 0d39 4000 4006 fd02 c0a8 56ce E..0.9@.@.....V.
0x0010: c0a8 5665 0cea e8de c4d7 1df2 364d 190d ..Ve........6M..
0x0020: 5018 002e 30a7 0000 0100 0001 0157 0000 P...0........W..