zoukankan      html  css  js  c++  java
  • 实战解析丨如何对Mysql连接请求的tcpdump内容进行分析

    摘要: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.认证通过以后,服务器端接收客户端命令包,返回对应的响应包

     

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

  • 相关阅读:
    [GXOI/GZOI2019] 旧词
    [HDU6756] Finding a MEX
    [洛谷P5110] 块速递推
    [CF739C] Alyona and towers
    1349. 修理牛棚
    L2-028 秀恩爱分得快 (25 分)
    L2-009 抢红包 (25 分)
    L1-043 阅览室 (20 分)
    2020年天梯赛-模拟赛 L1-6 检查密码 (15 分)
    L1-046 整除光棍 (20 分)
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/13646335.html
Copyright © 2011-2022 走看看