如何配置PcapPlusPlus使PcapLiveDevice不忽略大于MTU的数据包
PcapPlusPlus TcpReassembly超MTU包丢弃问题解决方案
根因
PcapPlusPlus的TcpReassembly模块默认开启TCP最大段大小检查,默认阈值为1500字节,超过该阈值的报文会被直接丢弃,且不会更新内部序列号跟踪状态,最终导致后续流程一直等待已被丢弃的序列号对应的报文,出现执行停滞。
解决方法
- 调整TcpReassembly初始化配置
实例化TcpReassembly前,通过TcpReassemblyConfig结构体修改检查规则,可选两种配置:- 直接关闭最大段大小检查,完全不限制输入包长度
- 调高最大段大小阈值到适配业务场景的数值,比如设置为65535,覆盖常规巨帧、IP分片重组后的包长范围
- 新增IP分片预处理逻辑
如果抓包场景存在超过MTU的IP分片包,需要先将原始抓包送入IPReassembly模块完成分片重组,再将重组后的完整IP包喂给TcpReassembly,避免不完整的分片包被丢弃。
代码示例
#include "pcapplusplus/TcpReassembly.h" #include "pcapplusplus/IPReassembly.h" // 你的业务回调函数 void onMessageReadyCallback(int8_t side, const pcpp::TcpStreamData& tcpData, void* userCookie) { // 业务处理逻辑 } int main() { // 初始化TCP重组配置 pcpp::TcpReassemblyConfig reassemblyConfig; // 方案1:完全关闭段大小检查 reassemblyConfig.enableMaxSegmentSizeCheck = false; // 方案2:仅调大阈值,不关闭检查 // reassemblyConfig.maxSegmentSize = 65535; // 初始化IP分片重组模块,同时支持IPv4和IPv6 pcpp::IPReassembly ipReassembly(pcpp::IPReassembly::IPv4AndIPv6); // 初始化TcpReassembly实例 pcpp::TcpReassembly tcpReassembly(onMessageReadyCallback, nullptr, reassemblyConfig); // 后续抓包处理流程示例 pcpp::RawPacket rawPacket; while (/* 循环收包 */) { pcpp::Packet parsedPacket(&rawPacket); // 先处理IP分片 pcpp::Packet* reassembledIpPacket = ipReassembly.processPacket(&parsedPacket); if (reassembledIpPacket != nullptr) { // 重组完成的完整包送入TCP重组模块 tcpReassembly.reassemblePacket(reassembledIpPacket); // 释放重组产生的包内存 delete reassembledIpPacket; } } return 0; }
老版本兼容说明
如果你使用的是v22.11及更早的PcapPlusPlus版本,没有enableMaxSegmentSizeCheck配置项,直接将maxSegmentSize设置为足够大的数值即可生效。
内容的提问来源于stack exchange,提问作者rdx
相关产品推荐
相关产品推荐

