探索PcapPlusPlus开源库:网络数据包处理与性能优化
文章目录
- 0. 本文概要
- 1. PcapPlusPlus介绍
- 1.1 概述
- 1.2主要特性和功能
- 1.3 PcapPlusPlus 主要模块关系和依赖
- 1.4 网络协议层处理过程
- 2. 实例
- 2.1 基于 PcapPlusPlus 的应用程序设计和封装流程:
- 2.2 多线程示例代码
- 2.3 代码说明:
- 3. 程序性能进一步优化
- 3.1 避免重复解析
- 3.2 减少内存分配
- 3.3 直接操作数据
- 3.4 利用硬件加速的方法
- 4. PcapPlusPlus 的优势与缺点
0. 本文概要
本文将详细探讨 PcapPlusPlus,介绍其功能特性、实际应用示例以及模块间的关系和依赖,以帮助 C++ 工程师更好地理解和利用该库进行网络应用程序开发。
1. PcapPlusPlus介绍
1.1 概述
PcapPlusPlus 是一个跨平台的 C++ 网络数据包处理库,提供高级抽象和易用的 API,使开发者能轻松进行网络数据包的捕获、解析和生成。
1.2主要特性和功能
-
数据包捕获和解析
- 支持多种网络捕获引擎,包括 libpcap、WinPcap、Intel DPDK 等。
- 提供简洁的 C++ 接口,实现快速捕获和实时数据包解析。
-
高级协议解析和构造
- 支持 Ethernet、IPv4、IPv6、TCP、UDP 等协议。
-
文件读写和离线分析
- 支持 PCAP 和 PCAPNG 格式的数据包文件读写,便于离线数据分析和处理。
-
跨平台支持
- 完全支持 Linux、MacOS和Windows 等多个平台。
-
高级网络安全功能
- 提供 TCP 重组、IP 碎片重组等高级功能,支持复杂的网络安全分析和流量监控需求。
1.3 PcapPlusPlus 主要模块关系和依赖
此图展示了 PcapPlusPlus 中各核心模块的依赖关系,以及它们与底层网络捕获引擎(如 libpcap、WinPcap、Npcap 等)及其他第三方库(如 Intel DPDK、PF_RING、eBPF AF_XDP 等)的关联。
1.4 网络协议层处理过程
此图详细描述了网络数据包在 PcapPlusPlus 中的捕获到处理的整个过程,包括各协议层的解析和处理步骤。
2. 实例
2.1 基于 PcapPlusPlus 的应用程序设计和封装流程:
- 初始化网络捕获设备:使用
PcapLiveDevice类初始化网络设备,准备开始捕获数据包。 - 设置捕获过滤器:通过
PcapLiveDevice::setFilter函数设置过滤器,以过滤出特定的数据包。 - 开始捕获数据包:调用
PcapLiveDevice::startCapture函数启动捕获过程,持续监听网络接口上的数据包到达。 - 捕获数据包:当有新的数据包到达时,通过注册的
onPacketArrives函数进行捕获并存储在缓冲区中。 - 解析数据包:使用
Packet::Packet类解析捕获到的数据包,提取数据包的各个协议层信息。 - 分发数据包:使用
PacketDispatcher类将解析后的数据包传递给处理模块。 - 处理数据包:通过
PacketHandler类对数据包进行进一步处理,如协议分析、安全检查等。 - 应用逻辑处理:通过
ApplicationLogic类执行特定的应用逻辑,如网络监控、流量分析或安全审计等。 - 生成响应或记录:使用
ResponseGenerator或Logger类根据处理结果生成响应或将数据记录到日志或数据库中。 - 继续捕获或结束:通过
DecisionMaker类根据应用需求决定是否继续捕获数据包或结束捕获过程。 - 关闭捕获设备:通过
PcapLiveDevice::stopCapture函数结束捕获过程,关闭网络捕获设备。
2.2 多线程示例代码
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include "Packet.h"
#include "PcapLiveDeviceList.h"
#include "PcapLiveDevice.h"
#include "IPv4Layer.h"using namespace std;
using namespace pcpp;// 全局变量
mutex mtx;
atomic<bool> stopCapture(false);
IPv4Layer* cachedIpLayer = nullptr;// 回调函数处理捕获到的数据包
void onPacketArrives(RawPacket* packet, PcapLiveDevice* dev, void* cookie) {// 异步处理数据包thread packetHandlerThread([packet]() {// 解析数据包Packet parsedPacket(packet);// 缓存解析结果cachedIpLayer = parsedPacket.getLayerOfType<IPv4Layer>();// 在这里可以进行更多的数据包处理,例如协议解析和业务逻辑处理if (cachedIpLayer) {// 在锁的作用域内进行输出,保证线程安全lock_guard<mutex> lock(mtx);cout << "捕获到数据包,源IP地址: " << cachedIpLayer->getSrcIpAddress().toString() << ", 目的IP地址: " << cachedIpLayer->getDstIpAddress().toString() << endl;}});packetHandlerThread.detach(); // 分离线程,允许异步运行
}int main() {// 获取设备列表vector<PcapLiveDevice*> devList = PcapLiveDeviceList::getInstance().getPcapLiveDevicesList();// 选择设备进行初始化PcapLiveDevice* dev = devList[0];if (!dev->open()) {cerr << "无法打开设备: " << dev->getLastError() << endl;return 1;}// 设置过滤器string filter = "ip"; // 过滤所有IP流量if (!dev->setFilter(filter)) {cerr << "无法设置过滤器: " << dev->getLastError() << endl;dev->close();return 1;}// 开始捕获数据包dev->startCapture(onPacketArrives, nullptr);// 捕获数据包一段时间后停止this_thread::sleep_for(chrono::seconds(10)); // 捕获10秒钟// 停止捕获并关闭设备dev->stopCapture();dev->close();return 0;
}
2.3 代码说明:
- 缓存解析结果:在
onPacketArrives回调函数中,使用cachedIpLayer全局变量缓存解析后的IPv4Layer对象。这样可以避免对每个数据包重复解析,节省CPU时间和内存开销。 - 采用多线程异步处理:使用C++的异步处理机制,在捕获到数据包后启动一个新的线程或任务来处理数据包。这样可以利用多核处理器的能力并行处理数据包,提高处理速度。
3. 程序性能进一步优化
合理使用缓存、内存池和零拷贝技术,可以有效地避免重复解析、减少内存分配并直接操作数据,从而提升程序的性能和效率
3.1 避免重复解析
重复解析数据包会消耗大量的CPU时间和内存资源。为了避免这种情况,可以使用以下方法:
-
缓存解析结果:在解析数据包后,将解析得到的关键信息(如协议头部字段)缓存起来,而不是每次都重新解析。这样可以避免多次访问数据包和重复执行解析操作。
-
延迟解析:仅在需要时才进行解析。例如,可以根据应用需求,只在收到特定类型的数据包或者需要处理特定协议信息时才执行解析操作。
3.2 减少内存分配
动态内存分配和释放操作是性能瓶颈之一,特别是在高频率的数据包处理中。以下是减少内存分配的方法:
-
使用内存池:预先分配一定数量的内存块,并在需要时从内存池中获取和释放内存,而不是每次都进行动态分配和释放。这样可以避免频繁的内存管理开销。
-
重复使用数据结构:对于固定大小的数据结构或缓冲区,可以重复使用,避免频繁地创建和销毁对象。
3.3 直接操作数据
直接在原始数据上操作可以显著降低内存和CPU消耗,特别是对于大型数据包的处理。以下是实现直接操作数据的方法:
-
使用零拷贝技术:在网络数据包处理中,尽量避免将数据从内核空间复制到用户空间的应用程序缓冲区。可以直接在网络接收缓冲区中操作数据,减少数据复制的开销和内存带宽消耗。
-
原地修改数据:尽可能在接收到数据时直接在原始数据上进行操作和修改,避免创建中间副本或额外的数据结构。
3.4 利用硬件加速的方法
-
选择适合的捕获引擎:
- Intel DPDK(Data Plane Development Kit):DPDK 提供了一个用户空间的数据包处理框架,可以利用支持 DPDK 的网卡直接从网络接口接收数据包,避免了数据包在内核空间和用户空间之间的复制,减少了 CPU 的负担和延迟。通过 DPDK,可以实现高性能的数据包捕获和处理。
-
启用 Offload 功能:
- TCP Offload Engine(TOE):TOE 是一种专用硬件或芯片,可以在网卡上执行 TCP 协议处理,包括连接管理、流量控制和数据包的发送和接收,从而减轻主机 CPU 的负担。
4. PcapPlusPlus 的优势与缺点
优势
-
高级抽象接口:PcapPlusPlus 封装了底层的网络捕获接口,提供了更高层次的抽象。
-
统一的API:不论是在 Windows 还是 Linux 等平台上,PcapPlusPlus 提供了统一的API,使得开发者可以编写跨平台的网络应用程序,而无需关心底层接口的细节。
-
丰富的功能扩展:PcapPlusPlus 提供了多种扩展功能,包括对 PCAP 和 PCAPNG 文件的完整支持、远程数据包捕获等。
-
协议解析能力:PcapPlusPlus 提供了强大的协议解析功能,支持解析多种网络协议(如 TCP/IP、UDP、ICMP 等),并且具有良好的扩展性。
缺点
- 学习曲线较陡:对于初学者来说,学习和掌握 PcapPlusPlus 的高级功能和API可能需要一定的时间和精力投入。
- 功能复杂性:对于简单的数据包捕获和处理需求,使用 PcapPlusPlus 可能显得有些“杀鸡用牛刀”,过于复杂。
相关文章:
探索PcapPlusPlus开源库:网络数据包处理与性能优化
文章目录 0. 本文概要1. PcapPlusPlus介绍1.1 概述1.2主要特性和功能1.3 PcapPlusPlus 主要模块关系和依赖1.4 网络协议层处理过程 2. 实例2.1 基于 PcapPlusPlus 的应用程序设计和封装流程:2.2 多线程示例代码2.3 代码说明: 3. 程序性能进一步优化3.1 避…...
深入理解SSH:网络安全的守护者
在当今数字化时代,网络安全已成为全球关注的焦点。随着网络攻击手段的不断升级,保护数据传输的安全性变得尤为重要。SSH(Secure Shell)作为一种安全的网络协议,为远程登录和网络服务提供了强大的安全保障,成…...
DDD学习笔记四
领域模型的构建 基础领域模型的基本组成有名称、属性、关联、职责、事件和异常 发掘领域概念3种策略: 1)学习已有系统,重用已有模型 2)使用分类标签。分类标签来源于领域,需要我们研究一些资料并做一些提炼。从采用5W…...
Head First设计模式中的典型设计模式解析与案例分析
Head First设计模式中的典型设计模式解析与案例分析 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 《Head First设计模式》是一本广受欢迎的书籍,…...
iptables 防火墙(一)
iptables 防火墙(一) 一、Linux 防火墙基础防火墙分类 二、iptables 的表、链结构规则表规则链数据包过滤的匹配流程 三、编写防火墙规则iptables 的安装iptables的基本语法规则的匹配条件通用匹配隐含匹配显式匹配 四、总结 在网络安全的世界里…...
数据库物理结构设计-定义数据库模式结构(概念模式、用户外模式、内模式)、定义数据库、物理结构设计策略
一、引言 如何基于具体的DBMS产品,为数据库逻辑结构设计的结果,即关系数据库模式,制定适合应用要求的物理结构 1、在设计数据库物理结构前,数据库设计人员首先 要充分了解所用的DBMS产品的功能、性能和特点,包括提供…...
QT加载安装外围依赖库的翻译文件后翻译失败的现象分析:依赖库以饿汉式的形式暴露单例接口导致该现象的产生
1、前提说明 VS2019 QtClassLibaryDll是动态库,QtWidgetsApplication4是应用程序。 首先明确:动态库以饿汉式的形式进行单例接口暴露; 然后,应用程序加载动态库的翻译文件并进行全局安装; // ...QTranslator* trans = new QTranslator();//qDebug() << trans->…...
13_旷视轻量化网络--ShuffleNet V2
回顾一下ShuffleNetV1:08_旷视轻量化网络--ShuffleNet V1-CSDN博客 1.1 简介 ShuffleNet V2是在2018年由旷视科技的研究团队提出的一种深度学习模型,主要用于图像分类和目标检测等计算机视觉任务。它是ShuffleNet V1的后续版本,重点在于提供更高效的模…...
Linux系统编程--进程间通信
目录 1. 介绍 1.1 进程间通信的目的 1.2 进程间通信的分类 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步骤--以父子进程通信为例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代码 2.2.5 读写特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…...
docker-本地部署-后端
前置条件 后端文件 这边是一个简单项目的后端文件目录 docker服务 镜像文件打包 #命令行 docker build -t author/chatgpt-ai-app:1.0 -f ./Dockerfile .红框是docker所在文件夹 author:docker用户名chatgpt-ai-app:打包的镜像文件名字:1.0 &#…...
TLS + OpenSSL + Engine + PKCS#11 + softhsm2 安全通信
引擎库路径只有在 /lib 下才能被 "LOAD" 识别到,OpenSSL的ReadMe给的示例在/lib,大概是在构建OpenSSL时默认的configure指定了lib路径 // #define PKCS11_ENGINE_PATH "/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so" #define …...
Unity实现简单的MVC架构
文章目录 前言MVC基本概念示例流程图效果预览后话 前言 在Unity中,MVC(Model-View-Controller)框架是一种架构模式,用于分离游戏的逻辑、数据和用户界面。MVC模式可以帮助开发者更好地管理代码结构,提高代码的可维护性…...
【简单讲解下OneFlow深度学习框架】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
FastGPT 调用Qwen 测试Hello world
Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录, 点击右上角的 新建 点击 这里,配置AI使用本地 ollama跑的qwen模型 问题:树上有3只鸟,开了一枪&#…...
Golang-GMP
GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的,为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的,为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率,但多进程、多线程都存在局限性。比如多进程通过时…...
【PythonWeb开发】Flask自定义模板路径和静态资源路径
在大型的 Flask 项目中,确实可能会有多个子应用(Blueprints),每个子应用可能都有自己的静态文件和模板。为了更好地管理和组织这些资源,可以使用static_folder 和template_folder 属性来统一管理。必须同时设置好主应用…...
Java对象创建过程
在日常开发中,我们常常需要创建对象,那么通过new关键字创建对象的执行中涉及到哪些流程呢?本文主要围绕这个问题来展开。 类的加载 创建对象时我们常常使用new关键字。如下 ObjectA o new ObjectA();对虚拟机来讲首先需要判断ObjectA类的…...
Does a vector database maintain pre-vector chunked data for RAG systems?
题意:一个向量数据库是否为RAG系统维护预向量化分块数据? 问题背景: I believe that when using an LLM with a Retrieval-Augmented Generation (RAG) approach, the results retrieved from a vector search must ultimately be presented…...
Rust-11-错误处理
Rust 将错误分为两大类:可恢复的(recoverable)和 不可恢复的(unrecoverable)错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 b…...
自动化测试:使用Postman进行接口测试与脚本编写
Postman 是一种流行的 API 测试工具,广泛应用于开发和测试过程中。它不仅可以用于手动测试,还支持自动化测试和脚本编写,以确保 API 的可靠性和性能。本文将详细介绍如何使用 Postman 进行接口测试与脚本编写,帮助你更高效地进行自…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
