写点什么

实战解析丨如何对 Mysql 连接请求的 tcpdump 内容进行分析

发布于: 2020 年 09 月 10 日

摘要:tcpdump 是通过拦截发送和收到的网络连接中的 TCP/IP 和其他数据包,通过 tcpdump 工具帮助我们分析三次握手或者四次挥手的数据包情况,就能很容易的帮助我们分析出网络在哪一个步骤出的问题。


tcpdump 是通过拦截发送和收到的网络连接中的 TCP/IP 和其他数据包,通常在我们 WEB 开发中,我们提供 http 服务或者调用 http 服务的过程中经常会遇到 read time out/connect reset 等网络异常信息,通过 tcpdump 工具帮助我们分析三次握手或者四次挥手的数据包情况,就能很容易的帮助我们分析出网络在哪一个步骤出的问题。


接下来我们通过分析 Mysql 的连接请求,来了解网络的请求过程和协议的具体内容。


0x0000: 4500 0039 3881 4000 4006 7fcf c0a8 00d7

0x0010: c0a8 0047 a034 0cea 860b e11e c2fc 7f64

0x0020: 8018 296a 2b0e 0000 0101 080a 2de4 786b

0x0030: 3a4f 5980 0100 0000 0e


这样一份报文通常有 3 部分组成


1. IP 报头



2. TCP 协议



3. mysql 协议



逐行分析如下


4500 0039 3881 4000 4006 7fcf c0a8 00d7


  • 45 - 4 为 Version 5 为 Header Length,那么这个协议头的长度就是 5 字节


  我们读出接下来的5字节 00 0039 3881
复制代码


  • 00 Type Of Service 标识优先级 延迟要求 吞吐量信息等

  • 0039 Total Length 换算十进制结果是 57 与我们获取到的结果的字节数量一致

  • 3881 IP 报文头的 Identification

  • 4000 - 为 IP Flags 和 Fragment Offset

  • 000 IP Flags


  0 0100 0000 0000 Fragment :相对0原始报文头的偏移量
复制代码


  • 4006 - 40 为 TTL 一个协议访问的生存周期 06 代表 TCP 协议

  • 7fcf - Header Checksum 首部查错

  • c0a8 00d7 - 源主机 IP 地址段 c0(192) a8(168) 00(0) d7 (215)


c0a8 0047 a034 0cea 860b e11e c2fc 7f64


  • c0a8 0047 - 代表目标主机的 IP 地址 (到这里 IP 协议部分就结束了,恰好是 20 字节,接下来就要进入 TCP 部分解析了)

  • a034 - 源端口号 转换十进制 41012

  • 0cea - 目标端口 转换十进制 3306

  • 860b e11e - 序列号 2248925470

  • c2fc 7f64 - 确认号 3271327588


8018 296a 2b0e 0000 0101 080a 2de4 786b


  • 80 - 8 表示偏移 Offset 0 为保留位

  • 18 - tcp 的传说状态 1 Ack 8 表示 PUSH 这大概就是第一行 [P.]的由来把

  • 296a - 滑动窗口的大小 10602

  • 2b0e - TCP 部分的 Checksum

  • 0000 - TCP 部分的紧急指针


到 Options 部分


  • 0101 - NOP 填错没有实际意义

  • 080a - 代表开启 timestamp

  • 2de4 786b - 对应的具体时间戳的值 769947755


3a4f 5980 0100 0000 0e


  • 3a4f 5980 - 还是时间戳的一部分 ecr 值

  • 0100 00 - 表示具体内容长度 1 字节

  • 00 - 表示 seqid 递增

  • 0e - 通过查询 mysql 语义,代表 COM_PING 测试联通性


以下列举了所有在客户端请求部分 16 进制数代表的 mysql 语义,通过不同的语义需要进行不同的转换才能获得想要的内容,这里就不列举更多例子了


0x00 COM_SLEEP (内部线程状态)

0x01 COM_QUIT 关闭连接

0x02 COM_INIT_DB 切换数据库

0x03 COM_QUERY SQL 查询请求

0x04 COM_FIELD_LIST 获取数据表字段信息

0x05 COM_CREATE_DB 创建数据库

0x06 COM_DROP_DB 删除数据库

0x07 COM_REFRESH 清除缓存

0x08 COM_SHUTDOWN 停止服务器

0x09 COM_STATISTICS 获取服务器统计信息

0x0A COM_PROCESS_INFO 获取当前连接的列表

0x0B COM_CONNECT (内部线程状态)

0x0C COM_PROCESS_KILL 中断某个连接

0x0D COM_DEBUG 保存服务器调试信息

0x0E COM_PING 测试连通性

0x0F COM_TIME (内部线程状态)

0x10 COM_DELAYED_INSERT (内部线程状态)

0x11 COM_CHANGE_USER 重新登陆(不断连接)

0x12 COM_BINLOG_DUMP 获取二进制日志信息

0x13 COM_TABLE_DUMP 获取数据表结构信息

0x14 COM_CONNECT_OUT (内部线程状态)

0x15 COM_REGISTER_SLAVE 从服务器向主服务器进行注册

0x16 COM_STMT_PREPARE 预处理 SQL 语句

0x17 COM_STMT_EXECUTE 执行预处理语句

0x18 COM_STMT_SEND_LONG_DATA 发送 BLOB 类型的数据

0x19 COM_STMT_CLOSE 销毁预处理语句

0x1A COM_STMT_RESET 清除预处理语句参数缓存

0x1B COM_SET_OPTION 设置语句选项

0x1C COM_STMT_FETCH 获取预处理语句的执行结果


在 mysql 请求过程中还有产生其他类型协议包数据,故需要我们对 mysql 请求过程有基本的认识。


mysql 请求过程介绍


1.建立 tcp 连接三次握手


2.与 Mysql 服务器建立连接


  • Server --> Client: Handshake(握手)


1 字节:协议版本号

NullTerminatedString:数据库版本信息

4 字节:连接 MySQL Server 启动的线程 ID

8 字节:挑战随机数,用于数据库认证

1 字节:填充值(0x00)

2 字节:用于与客户端协商通讯方式

1 字节:数据库的编码

2 字节:服务器状态

13 字节:预留字节

12 字节:挑战随机数,用于数据库认证

1 字节:填充值(0x00)


  • Client --> Server: Authentication (认证)


4 字节:用于与客户端协商通讯方式

4 字节:客户端发送请求报文时所支持的最大消息长度值

1 字节:标识通讯过程中使用的字符编码

23 字节:保留字节

NullTerminatedString:用户名

LengthEncodedString:加密后的密码

NullTerminatedString:数据库名称(可选)


  • Server --> Client: 返回认证结果包


3.认证通过以后,服务器端接收客户端命令包,返回对应的响应包


点击关注,第一时间了解华为云新鲜技术~


发布于: 2020 年 09 月 10 日阅读数: 88
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
实战解析丨如何对Mysql连接请求的tcpdump内容进行分析