mysql在传输层使用的TCP协议。一个TCP payload可能有多个mysql packet。如下图所示。

TCP head

TCP payload

(mysql packet1, mysql packet2,mysql packet 3...)

下面通过抓包分析其结构。

执行如下SQL语句,并抓包:

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

4 rows in set (0.00 sec)

client 请求包

PACKET: 75 bytes, wire length 75 cap length 75 @ 2018-10-10 16:17:44.545962 +0800 CST

- Layer 1 (04 bytes) = Loopback{Contents=[2, 0, 0, 0] Payload=[..71..] Family=IPv4}

- Layer 2 (20 bytes) = IPv4{Contents=[..20..] Payload=[..51..] Version=4 IHL=5 TOS=0 Length=71 Id=0 Flags=DF FragOffset=0 TTL=64 Protocol=TCP Checksum=0 SrcIP=172.24.232.150 DstIP=172.24.232.150 Options=[] Padding=[]}

- Layer 3 (32 bytes) = TCP{Contents=[..32..] Payload=[..19..] SrcPort=51905 DstPort=3306(mysql) Seq=1194291158 Ack=850183053 DataOffset=8 FIN=false SYN=false RST=false PSH=true ACK=true URG=false ECE=false CWR=false NS=false Window=9352 Checksum=10648 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:462864359/462163474 0x1b96bfe71b8c0e12)] Padding=[]}

- Layer 4 (19 bytes) = Payload19 byte(s)

tcp:&{{[202 193 12 234 71 47 111 214 50 172 195 141 128 24 36 136 41 152 0 0 1 1 8 10 27 150 191 231 27 140 14 18] [15 0 0 0 3 115 104 111 119 32 100 97 116 97 98 97 115 101 115]} 51905 3306(mysql) 1194291158 850183053 8 false false false true true false false false false 9352 10648 0 [202 193] [12 234] [TCPOption(NOP:) TCPOption(NOP:) TCPOption(Timestamps:462864359/462163474 0x1b96bfe71b8c0e12)] [] [{1 1 []} {1 1 []} {8 10 [27 150 191 231 27 140 14 18]} {0 0 []}] {}}

tcp payload:[15 0 0 0 3 115 104 111 119 32 100 97 116 97 98 97 115 101 115]

前4个字节是mysql packet head.

前3个字节表示mysql payload 长度15个字节:

15 0 0

第4个字节0,表示序列号0

第5个字节开始是mysql payload body,3表示查询COM_QUERY

接着后面的字节(ASCII码),就是具体的查询语句(即show databases):

115 104 111 119 32 100 97 116 97 98 97 115 101 115

mysql server返回的结果

首先是ACK,其中不包含mysql packet。

PACKET: 56 bytes, wire length 56 cap length 56 @ 2018-10-10 16:17:44.546001 +0800 CST

- Layer 1 (04 bytes) = Loopback{Contents=[2, 0, 0, 0] Payload=[..52..] Family=IPv4}

- Layer 2 (20 bytes) = IPv4{Contents=[..20..] Payload=[..32..] Version=4 IHL=5 TOS=0 Length=52 Id=0 Flags=DF FragOffset=0 TTL=64 Protocol=TCP Checksum=0 SrcIP=172.24.232.150 DstIP=172.24.232.150 Options=[] Padding=[]}

- Layer 3 (32 bytes) = TCP{Contents=[..32..] Payload=[] SrcPort=3306(mysql) DstPort=51905 Seq=850183053 Ack=1194291177 DataOffset=8 FIN=false SYN=false RST=false PSH=false ACK=true URG=false ECE=false CWR=false NS=false Window=12645 Checksum=10629 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:462864359/462864359 0x1b96bfe71b96bfe7)] Padding=[]}

tcp:&{{[12 234 202 193 50 172 195 141 71 47 111 233 128 16 49 101 41 133 0 0 1 1 8 10 27 150 191 231 27 150 191 231] []} 3306(mysql) 51905 850183053 1194291177 8 false false false false true false false false false 12645 10629 0 [12 234] [202 193] [TCPOption(NOP:) TCPOption(NOP:) TCPOption(Timestamps:462864359/462864359 0x1b96bfe71b96bfe7)] [] [{1 1 []} {1 1 []} {8 10 [27 150 191 231 27 150 191 231]} {0 0 []}] {}}

tcp payload:[]

接着,返回的是结果集。结果集中包括7个mysql packet。下面逐一分析。

PACKET: 215 bytes, wire length 215 cap length 215 @ 2018-10-10 16:17:44.546415 +0800 CST

- Layer 1 (04 bytes) = Loopback{Contents=[2, 0, 0, 0] Payload=[..211..] Family=IPv4}

- Layer 2 (20 bytes) = IPv4{Contents=[..20..] Payload=[..191..] Version=4 IHL=5 TOS=0 Length=211 Id=0 Flags=DF FragOffset=0 TTL=64 Protocol=TCP Checksum=0 SrcIP=172.24.232.150 DstIP=172.24.232.150 Options=[] Padding=[]}

- Layer 3 (32 bytes) = TCP{Contents=[..32..] Payload=[..159..] SrcPort=3306(mysql) DstPort=51905 Seq=850183053 Ack=1194291177 DataOffset=8 FIN=false SYN=false RST=false PSH=true ACK=true URG=false ECE=false CWR=false NS=false Window=12645 Checksum=10788 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:462864359/462864359 0x1b96bfe71b96bfe7)] Padding=[]}

- Layer 4 (159 bytes) = Payload159 byte(s)

tcp:&{{[12 234 202 193 50 172 195 141 71 47 111 233 128 24 49 101 42 36 0 0 1 1 8 10 27 150 191 231 27 150 191 231] [1 0 0 1 1 75 0 0 2 3 100 101 102 18 105 110 102 111 114 109 97 116 105 111 110 95 115 99 104 101 109 97 8 83 67 72 69 77 65 84 65 8 83 67 72 69 77 65 84 65 8 68 97 116 97 98 97 115 101 11 83 67 72 69 77 65 95 78 65 77 69 12 33 0 192 0 0 0 253 1 0 0 0 0 19 0 0 3 18 105 110 102 111 114 109 97 116 105 111 110 95 115 99 104 101 109 97 6 0 0 4 5 109 121 115 113 108 19 0 0 5 18 112 101 114 102 111 114 109 97 110 99 101 95 115 99 104 101 109 97 4 0 0 6 3 115 121 115 7 0 0 7 254 0 0 34 0 0 0]} 3306(mysql) 51905 850183053 1194291177 8 false false false true true false false false false 12645 10788 0 [12 234] [202 193] [TCPOption(NOP:) TCPOption(NOP:) TCPOption(Timestamps:462864359/462864359 0x1b96bfe71b96bfe7)] [] [{1 1 []} {1 1 []} {8 10 [27 150 191 231 27 150 191 231]} {0 0 []}] {}}

tcp payload:[1 0 0 1 1 75 0 0 2 3 100 101 102 18 105 110 102 111 114 109 97 116 105 111 110 95 115 99 104 101 109 97 8 83 67 72 69 77 65 84 65 8 83 67 72 69 77 65 84 65 8 68 97 116 97 98 97 115 101 11 83 67 72 69 77 65 95 78 65 77 69 12 33 0 192 0 0 0 253 1 0 0 0 0 19 0 0 3 18 105 110 102 111 114 109 97 116 105 111 110 95 115 99 104 101 109 97 6 0 0 4 5 109 121 115 113 108 19 0 0 5 18 112 101 114 102 111 114 109 97 110 99 101 95 115 99 104 101 109 97 4 0 0 6 3 115 121 115 7 0 0 7 254 0 0 34 0 0 0]

mysql packet 1

column count

1 0 0 1 1

前3个字节定义了payload长度为1。

1 0 0

第4个字节1,表示序列号1。

第5个字节开始是payload body,只有1个字节,为1,表示column count 为1.

mysql packet 2

75 0 0 2 3 100 101 102 18 105 110 102 111 114 109 97 116 105 111 110 95 115 99 104 101 109 97 8 83 67 72 69 77 65 84 65 8 83 67 72 69 77 65 84 65 8 68 97 116 97 98 97 115 101 11 83 67 72 69 77 65 95 78 65 77 69 12 33 0 192 0 0 0 253 1 0 0 0 0

列名Database相关信息。

ASCII码字符(Database)

68 97 116 97 98 97 115 101

mysql packet 3

19 0 0 3 18 105 110 102 111 114 109 97 116 105 111 110 95 115 99 104 101 109 97

类似,前4个字节定义了payload长度19和序列号3.

接着,payload中可解析出 row 值为 "information_schema"

mysql packet 4

6 0 0 4 5 109 121 115 113 108

类似,前4个字节定义了payload长度6和序列号4.

接着,payload中可解析出 row 值为 "mysql"

mysql packet 5

19 0 0 5 18 112 101 114 102 111 114 109 97 110 99 101 95 115 99 104 101 109 97

类似,前4个字节定义了payload长度19和序列号5.

接着,payload中可解析出 row 值为 "performance_schema"

mysql packet 6

4 0 0 6 3 115 121 115

类似,前4个字节定义了payload长度4和序列号6.

接着,payload中可解析出 row 值为 "sys"

mysql packet 7

7 0 0 7 254 0 0 34 0 0 0

类似,前4个字节定义了payload长度7和序列号7.

client ACK

不包含mysql packet

PACKET: 56 bytes, wire length 56 cap length 56 @ 2018-10-10 16:17:44.546457 +0800 CST

- Layer 1 (04 bytes) = Loopback{Contents=[2, 0, 0, 0] Payload=[..52..] Family=IPv4}

- Layer 2 (20 bytes) = IPv4{Contents=[..20..] Payload=[..32..] Version=4 IHL=5 TOS=0 Length=52 Id=0 Flags=DF FragOffset=0 TTL=64 Protocol=TCP Checksum=0 SrcIP=172.24.232.150 DstIP=172.24.232.150 Options=[] Padding=[]}

- Layer 3 (32 bytes) = TCP{Contents=[..32..] Payload=[] SrcPort=51905 DstPort=3306(mysql) Seq=1194291177 Ack=850183212 DataOffset=8 FIN=false SYN=false RST=false PSH=false ACK=true URG=false ECE=false CWR=false NS=false Window=9347 Checksum=10629 Urgent=0 Options=[TCPOption(NOP:), TCPOption(NOP:), TCPOption(Timestamps:462864359/462864359 0x1b96bfe71b96bfe7)] Padding=[]}

tcp:&{{[202 193 12 234 71 47 111 233 50 172 196 44 128 16 36 131 41 133 0 0 1 1 8 10 27 150 191 231 27 150 191 231] []} 51905 3306(mysql) 1194291177 850183212 8 false false false false true false false false false 9347 10629 0 [202 193] [12 234] [TCPOption(NOP:) TCPOption(NOP:) TCPOption(Timestamps:462864359/462864359 0x1b96bfe71b96bfe7)] [] [{1 1 []} {1 1 []} {8 10 [27 150 191 231 27 150 191 231]} {0 0 []}] {}}

tcp payload:[]

参考

抓包mysql协议_Mysql 通信协议抓包分析相关推荐

  1. xmpp协议抓包_xmpp协议使用iptool抓包工具分析

    下面是使用iptool工具抓包的协议,留作以后学习xmpp协议. s <?xml version="1.0"?> r <?xml version='1.0'?&g ...

  2. linux过滤端口抓包_TCP 协议三次握手抓包分析amp;查看状态

    关注爱因诗贤每天进步一点点导读 前面文章介绍了 TCP 报文头部的格式,TCP 协议是一个面向连接的协议,所以在使用 TCP 协议之前需要先建立连接,而建立连接就需要先 握手,在握手的时候就会有 TC ...

  3. mysql 协议的退出命令包及解析

    git https://github.com/sea-boat/mysql-protocol 概况 mysql客户端连接上mysql服务端后,当需要退出断开连接时则向服务端发送退出命令.服务端可以直接 ...

  4. mysql 协议的processInfo命令包及解析

    git https://github.com/sea-boat/mysql-protocol 概况 mysql客户端通过processInfo命令查询服务端活跃进程. mysql通信报文结构 类型 名 ...

  5. mysql源码包多大_MySQL源码包安装

    [root@node2 /]# groupadd -g 27 mysql [root@node2 /]# useradd -u 27 mysql -g mysql -s /sbin/nologin [ ...

  6. mysql 解压包怎么使用_mysql解压包的安装基础教程

    由于换了新电脑,所以的环境都要到新电脑去配置.突然发现mysql的配置忘了,然后百度又重新来一遍. 特地写一篇文章记录一下,让自己长长记性. 1.安装包下载 2.配置my.ini文件 配置信息如下: ...

  7. 方案 mysql 优点_mysql高可用方案分析

    低读低写并发.低数据量方案 方案一:双机高可用方案 1.数据库架构图 2.特点 一台机器A作为读写库,另一台B作为备份库:A库故障后B库作为读写库:A库恢复后A作为备库. 3.开发说明 此种情况下,数 ...

  8. mysql 切分_MySQL切分查询用法分析

    本文实例讲述了MySQL切分查询用法.分享给大家供大家参考,具体如下: 对于大查询有时需要'分而治之',将大查询切分为小查询: 每个查询功能完全一样,但只完成原来的一小部分,每次查询只返回一小部分结果 ...

  9. 分析mysql日志文件_MySQL日志文件与分析

    1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记 ...

最新文章

  1. 高校竞赛排行榜主办方数据上传 操作手册
  2. android view禁用,Android 禁止ViewPager的自带滑动效果
  3. php 文件迭代对象,通过PHP中的stdClass对象进行迭代
  4. 数据库表及字段命名、设计规范
  5. 程序员的爱情独白(转)
  6. 有意思的逻辑思维题(二)(hdu1052)
  7. pki和证书_PKI的位和字节
  8. QThread如何优雅实现暂停(挂起)功能
  9. 计算机信息检索自考知识点,计算机信息检索02139自考资料.doc
  10. 微信公众号服务器配置url,微信公众号平台设置服务器地址(URL)和令牌(Token)配对启用方法...
  11. matlab日期转儒略历,matlab儒略日转为日期
  12. 图像无损压缩:Pichi for Mac
  13. 前端跨域请求get_前端接收 get 请求,用jsonp 解决跨域问题, 需要服务端的response 也要jsonp 类型...
  14. 9月赠书活动名单公布啦!
  15. [机器学习] 训练过程中的train,val,test的区别
  16. python中安装gensim包
  17. useReducer
  18. GC_CONCURRENT freed 循环不停打印日志
  19. 幼儿园计算机应用研修日志,信息技术教师研修日志三篇
  20. element-ui中el-cascader级联选择器多选判断是否是全选

热门文章

  1. Python回归模型评估
  2. mysql group by having count_mysql中count(), group by, order by使用详解
  3. 使用py-faster-rcnn来训练voc2007数据集(Ubuntu)
  4. BitBlt和StretchBlt的区别
  5. Android广播的学习和使用
  6. c# 三种异步编程模型EAP(*)、 APM(*)和 TPL
  7. 从运维的角度理解Iaas、Paas、Saas云计算
  8. 02 oracle 创建用户和授权
  9. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读
  10. 宜兴电信成功跨界合作开拓农村物联网市场