1、MySQL抓包数据协议分析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
2、 Set Packet)4) 断开MySql连接a) 客户端往服务端发送退出命令包5) 四次握手断开tcp连接1.2 举例(使用tcpdump抓包)客户端在命令行模式下使用命令:mysqlu root pdbaudith 连上数据库抓取的数据包如下:1.2.1 登陆1)三次握手建立连接19:00:22.534342 IP S 8:8(0) win 8192 0x0000: 4500 0034 043f 4000 4006 0801 c0a8 5665 E.4.?.Ve 0x0010: c0a8 56ce e8de 0cea 364d 189e 0000 0000 .V.6M. 0x0020:
3、8002 2000 dbdd 0000 0204 05b4 0103 0302 . 0x0030: 0101 0402 .19:00:22.534390 IP S 77:77(0) ack 9 win 5840 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.5349
4、16 IP .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 P 1:79(78) ack 1 win 46 0x0000: 4508 0076 0d33 400
5、0 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./uFX&R 0x0040: 00ff f708 0200 0f80 1500 0000 0000 0000 . 0x0050: 0000 004b 6128 4049 2d46 565d 5366 2900
6、 .Ka(I-FVSf). 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 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
7、 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
8、.536748 IP .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 P 79:90(11) ack 63 win 46 0x0000: 4508 0033 0d35 4000 4006 ff03 c0a8 56ce E.3.5.V.
9、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 .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
10、 .V.6M. 0x0020: 5010 1105 48d9 0000 0000 0000 0000 P.H.1.2.2 客户端与服务端之间交互客户端输入:usemysql服务端返回:Database changed1)客户端向服务端发送一个命令包(类型为COM_QUERY)19:07:56.352167 IP P 1:3(22) ack 67 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:
11、 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 P 1:65(64) a
12、ck 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: 0
13、005 0000 03fe 0000 0200 0100 0004 fb05 . 0x0060: 0000 05fe 0000 0200 .3)客户端向服务端发送一个命令包(类型为COM_INIT_DB)19:07:56.353134 IP 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 0
14、26d 7973 P.U4.mys 0x0030: 716c ql4)服务端向客户端发送一个成功包(OK Packet)19:07:56.367217 IP 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)客户端向服务端发送一个包
15、(跟mysql没什么关系,包头为0000 0000)19:07:56.561717 IP .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.97
16、1933 IP P 3:9(16) ack 42 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.tables2)服务端向客户端发送一个普通的tcp包19:22:18.011368 IP .ack 16 win 46 0x0000:
17、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 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 e8
18、de c4d7 1df2 364d 190d .Ve.6M. 0x0020: 5018 002e 30a7 0000 0100 0001 0157 0000 P.0.W. 0x0030: 0203 6465 6612 696e 666f 726d 6174 696f .def.informatio 0x0040: 6e5f 7363 6865 6d61 0b54 4142 4c45 5f4e n_schema.TABLE_N 0x0050: 414d 4553 0b54 4142 4c45 5f4e 414d 4553 AMES.TABLE_NAMES 0x0060: 0f54 6162 6c
19、65 735f 696e 5f6d 7973 716c .Tables_in_mysql 0x0070: 0a54 4142 4c45 5f4e 414d 450c 0800 4000 .TABLE_NAME. 0x0080: 0000 fd01 0000 0000 0500 0003 fe00 0022 . 0x0090: 000d 0000 040c 636f 6c75 6d6e 735f 7072 .columns_pr 0x00a0: 6976 0300 0005 0264 620a 0000 0609 6462 iv.db.db 0x00b0: 5f6f 705f 6c6f 6706
20、 0000 0705 6576 656e _op_log.even 0x00c0: 7405 0000 0804 6675 6e63 0c00 0009 0b67 t.func.g 0x00d0: 656e 6572 616c 5f6c 6f67 0e00 000a 0d68 eneral_log.h 0x00e0: 656c 705f 6361 7465 676f 7279 0d00 000b elp_category. 0x00f0: 0c68 656c 705f 6b65 7977 6f72 640e 0000 .help_keyword. 0x0100: 0c0d 6865 6c70
21、5f72 656c 6174 696f 6e0b .help_relation. 0x0110: 0000 0d0a 6865 6c70 5f74 6f70 6963 0500 .help_topic. 0x0120: 000e 0468 6f73 7411 0000 0f10 6e64 625f .host.ndb_ 0x0130: 6269 6e6c 6f67 5f69 6e64 6578 0700 0010 binlog_index. 0x0140: 0670 6c75 6769 6e05 0000 1104 7072 6f63 .plugin.proc 0x0150: 0b00 001
22、2 0a70 726f 6373 5f70 7269 760d .procs_priv. 0x0160: 0000 130c 7072 6f78 6965 735f 7072 6976 .proxies_priv 0x0170: 0800 0014 0773 6572 7665 7273 0900 0015 .servers. 0x0180: 0873 6c6f 775f 6c6f 670c 0000 160b 7461 .slow_log.ta 0x0190: 626c 6573 5f70 7269 7605 0000 1704 7465 bles_priv.te 0x01a0: 7374
23、0600 0018 0574 6573 7431 0a00 0019 st.test1. 0x01b0: 0974 696d 655f 7a6f 6e65 1600 001a 1574 .time_zone.t 0x01c0: 696d 655f 7a6f 6e65 5f6c 6561 705f 7365 ime_zone_leap_se 0x01d0: 636f 6e64 0f00 001b 0e74 696d 655f 7a6f cond.time_zo 0x01e0: 6e65 5f6e 616d 6515 0000 1c14 7469 6d65 ne_name.time 0x01f0:
24、 5f7a 6f6e 655f 7472 616e 7369 7469 6f6e _zone_transition 0x0200: 1a00 001d 1974 696d 655f 7a6f 6e65 5f74 .time_zone_t 0x0210: 7261 6e73 6974 696f 6e5f 7479 7065 0500 ransition_type. 0x0220: 001e 0475 7365 7205 0000 1ffe 0000 2200 .user.4) 客户端向服务端发送一个普通的tcp包19:22:18.232503 IP .ack 521 win 4209 0x000
25、0: 4500 0028 046b 4000 4006 07e1 c0a8 5665 E.(.k.Ve 0x0010: c0a8 56ce e8de 0cea 364d 190d c4d7 1ffa .V.6M. 0x0020: 5010 1071 46ea 0000 0000 0000 0000 P.qF.1.2.3 退出客户端在命令行模式下输入命令:quit 退出数据库1)客户端向服务端发送一个退出的命令包15:50:46.533701 IP P 0:5(5) ack 79 win 4357 0x0000: 4500 002d 039d 4000 4006 08aa c0a8 5665 E
26、.-.Ve 0x0010: c0a8 56ce e58f 0cea 3176 44b4 c11e 6e97 .V.1vD.n. 0x0020: 5018 1105 d5e3 0000 0100 0000 0100 P.2)三次握手断开连接(断开连接不是四次握手吗?但实际情况下测试如果是正常的退出只有三次握手的过程)15:50:46.533733 IP F 5:5(0) ack 1 win 4357 0x0000: 4500 0028 039e 4000 4006 08ae c0a8 5665 E.(.Ve 0x0010: c0a8 56ce e58f 0cea 3176 44b9 c11e 6
27、e97 .V.1vD.n. 0x0020: 5011 1105 d7ea 0000 0000 0000 0000 P.15:50:46.533854 IP F 1:1(0) ack 6 win 46 0x0000: 4508 0028 648b 4000 4006 a7b8 c0a8 56ce E.(d.V. 0x0010: c0a8 5665 0cea e58f c11e 6e97 3176 44ba .Ve.n.1vD. 0x0020: 5011 002e e8c0 0000 P.15:50:46.534434 IP .ack 2 win 4357 0x0000: 4500 0028 03
28、9f 4000 4006 08ad c0a8 5665 E.(.Ve 0x0010: c0a8 56ce e58f 0cea 3176 44ba c11e 6e98 .V.1vD.n. 0x0020: 5010 1105 d7e9 0000 0000 0000 0000 P.2.MySql数据包结构的描述2.1 包头(Packet Header)每个数据包都有一个包头,具体格式如下:Bytes Name - - 3 Packet Length 1 Packet Number Packet Length: The length, in bytes, of the packetthat follows the Packet Header. Theremay be some special values in the mostsignificant byte. The maximum packet length is (2*24 -1),about 16MB. Packet Number: A serial number which can be used toensure that all packets are presentand in order. The first packet of aclient quer
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1