Mysql 通信协议抓包分析
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) = Payload 19 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 []}] {<nil>}}
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 []}] {<nil>}}
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) = Payload 159 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 []}] {<nil>}}
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 []}] {<nil>}}
tcp payload:[]
参考
Mysql 通信协议抓包分析的更多相关文章
- Wireshark抓包分析TCP 3次握手、4次挥手过程
Wireshark简介 更多有关Wireshark的教程.软件下载等,请见:http://www.52im.net/thread-259-1-1.html,本文只作简要介绍. 1Wireshark 是 ...
- Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...
- WebSocket抓包分析
转载自:https://www.cnblogs.com/songwenjie/p/8575579.html Chrome控制台 (1)F12进入控制台,点击Network,选中ws栏,注意选中Filt ...
- WireShark抓包分析(二)
简述:本文介绍了抓包数据含义,有TCP报文.Http报文.DNS报文.如有错误,欢迎指正. 1.TCP报文 TCP:(TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP ...
- Http实战之Wireshark抓包分析
Http实战之Wireshark抓包分析 Http相关的文章网上一搜一大把,所以笔者这一系列的文章不会只陈述一些概念,更多的是通过实战(抓包+代码实现)的方式来跟大家讨论Http协议中的各种细节,帮助 ...
- Wireshark抓包分析/TCP/Http/Https及代理IP的识别
前言 坦白讲,没想好怎样的开头.辗转三年过去了.一切已经变化了许多,一切似乎从没有改变. 前段时间调研了一次代理相关的知识,简单整理一下分享之.如有错误,欢迎指正. 涉及 Proxy IP应用 原理/ ...
- HTTP2特性预览和抓包分析
背景 近年来,http网络请求量日益添加,以下是httparchive统计,从2012-11-01到2016-09-01的请求数量和传输大小的趋势图: 当前大部份客户端&服务端架构的应用程序, ...
- 抓包分析SSL/TLS连接建立过程【总结】
1.前言 最近在倒腾SSL方面的项目,之前只是虽然对SSL了解过,但是不够深入,正好有机会,认真学习一下.开始了解SSL的是从https开始的,自从百度支持https以后,如今全站https的趋势越来 ...
- 实战录 | 基于openflow协议的抓包分析
<实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...
随机推荐
- MFC 关于new出一个新对话框时,退出对话框内存泄漏的问题解决
问题: 在进行点击按钮弹出对话框时,我是用了new来生成一个新的对话框,但是在新对话框关闭的时候,经过检查发现,新对话框存在内存泄漏问题. 原因: 因为使用了new,但是当时没有找到地方进行delet ...
- Arduino+Avr libc制作Badusb原理及示例讲解
一. 前言 2014年美国黑帽大会上研究人员JakobLell和Karsten Nohl展示了badusb的攻击方法后,国内与badusb相关的文章虽然有了一些,但是大部分人把相关文章都阅读后还是会有 ...
- mysql字段添加修改删除
MySQL添加字段和修改字段 MySQL添加字段的方法并不复杂,下面将为您详细介绍MYSQL添加字段和修改字段等操作的实现方法,希望对您学习MySQL添加字段方面会有所帮助. 1添加表字段 alt ...
- js编写轮播图,广告弹框
1.轮播图 js编写轮播图,需要用到setInterval(计时器):先给一个div,里面放轮播图的图片,将轮播图的图片明明为相同样式的:如:banner1.jpg,banner2.jpg,banne ...
- Python 数据结构--查找
1 顺序查找O(n) def sequential_search(a_list, item): pos = 0 found = False while pos < len(a_list) and ...
- ISO-8859-1和GBK互转
String slogn = "极简主义"; byte[] bytes = slogn.getBytes("GBK");// 编码:字符串变成字节数组 输入 参 ...
- TEST mathjax
这里是第一个公式 $ F = ma^2 $ \[ \text{Reinforcement Learning} \doteq \pi_* \\ \quad \updownarrow \\ \pi_* \ ...
- [转][译] Closures in Lua - Lua中的闭包
http://www.cnblogs.com/plodsoft/p/5900270.html?utm_source=tuicool&utm_medium=referral 原文:(PDF) . ...
- makefile 使用 Tricks
.phony是表示目标是伪目标,并不生成相应的文件..phony标志的文件总是执行的. 1. 短横(-)与@ @(常用在 echo 之前):make 在执行编译打包等命令前会在命令行输出此命令,称之为 ...
- 安卓 dex 通用脱壳技术研究(四)
/* 当第一个类执行到此函数时,我们在dvmDefineClass执行之前,也就是第一个类加载之前 注入我们的dump代码:即DumpClass()函数 */ static void ...