Skip to content

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

Notifications You must be signed in to change notification settings

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

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors