Skip to content

L1w-Y/Message-Parser

Repository files navigation

数据库流量解析与转发工具

项目概述

基于C++实现的数据库流量解析与转发系统,能够捕获、解析和转发多种数据库协议的网络流量。系统采用模块化设计,支持MySQL、PostgreSQL、Hive等多种数据库协议,具备完整的数据包重组、协议识别和网络转发能力。

系统架构设计

1. 整体架构

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   PCAP文件      │───▶│   流量解析器      │───▶│   远程服务器    │
│  (网络捕获)     │    │ (PacketParser)   │    │  (TcpClient)    │
└─────────────────┘    └──────────────────┘    └─────────────────┘
                              │
                              ▼
                    ┌──────────────────┐
                    │   消息解码器     │
                    │ (MessageDecoder) │
                    └──────────────────┘

2. 核心组件

2.1 数据包解析器

  • 职责: 负责读取PCAP文件,解析TCP/IP数据包,管理会话状态
  • 核心功能:
    • PCAP文件读取和BPF过滤器应用
    • TCP会话状态管理(SYN/ACK/FIN处理)
    • 数据包重组和消息构建
    • 流ID生成和会话跟踪

2.2 消息解码器

  • 职责: 根据不同数据库协议解析消息长度和边界
  • 支持的协议:
    • MySQL: 基于消息长度的变长协议解析
    • PostgreSQL: 支持启动消息和认证阶段的特殊处理
    • Hive: 处理Hadoop生态系统的数据库协议

2.3 TCP客户端

  • 职责: 与远程服务器建立连接并发送解析后的消息
  • 特性:
    • 自动重连和错误处理
    • 分块发送大数据包
    • 连接状态管理

技术点

1. 多协议支持架构

系统采用策略模式设计,通过函数指针实现不同数据库协议的动态切换:

typedef int64_t (*MessageLengthDecoder)(DataStream* stream, bool from_server, 
                                       pcpp::Packet& parsed_packet, 
                                       int64_t length_already_read);

这种设计使得添加新的数据库协议支持变得简单,只需要实现对应的解码函数并注册到系统中。

2. 流状态管理

2.1 流ID生成算法

StreamId GetStreamId(const pcpp::IPAddress& src_ip, const pcpp::IPAddress& dst_ip, 
                    uint16_t src_port, uint16_t dst_port) const {
    // 使用哈希算法生成唯一的流标识符
    // 确保双向流量映射到同一个流ID
}

2.2 会话状态

  • 状态0: 连接建立阶段(处理SYN/ACK)
  • 状态1: 正常会话阶段(处理业务数据)
  • 状态转换: 基于TCP标志位和协议特定消息触发

3. 数据包重组机制

3.1 跨TCP分片重组

struct StreamBuffer {
    uint32_t total_length;      // 消息总长度
    uint32_t already_read_length; // 已读取长度
    std::vector<uint8_t> buffer; // 数据缓冲区
    bool completed;             // 是否完成重组
};

3.2 缓冲区管理

  • 自动检测分片消息(通过长度字段)
  • 动态缓冲区分配和释放
  • RAII设计

4. 高性能网络通信

4.1 零拷贝数据发送

int SendData(const void* data, size_t length) {
    // 分块发送,确保大数据包的完整传输
    // 错误重试和连接状态检查
}

4.2 内存对齐优化

#pragma pack(push, 1) // 1字节对齐,优化网络传输
struct SessionGenericMessage {
    uint8_t type;
    uint32_t length;
    uint64_t flow_id;
    // ...
};
#pragma pack(pop)

About

Offline packet analyzer built with PcapPlusPlus. Automatically parses MySQL, PostgreSQL, and Hive traffic, reassembles TCP streams, and forwards structured data to your analytics service.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors