capture 1.2.0
这是一个基于 PcapPlusPlus、PF_RING 和 ClickHouse 构建的高性能网络流量分析系统,专注于实时流量捕获、解析与存储。
|
用于收集包统计信息的共享结构体 More...
#include <PacketStats.h>
Public Member Functions | |
PacketStats () | |
构造函数 - 初始化统计结构 | |
void | limit_csv_lines (const std::string &filename, size_t max_lines) |
限制CSV文件行数 | |
void | consumePacketPortTraffic (pcpp::Packet &packet) |
消费包的端口流量统计 | |
void | printPortTraffic (std::ostream &out) |
打印端口流量统计 | |
void | out_port_file () |
输出端口统计到文件 | |
void | detectHeartbeat (pcpp::Packet &packet) |
检测心跳包 | |
void | consumePacketProtocol (pcpp::Packet &packet) |
消费包的协议统计 | |
void | updateSessionStats (pcpp::Packet &packet, const long long &totalPacketCounts) |
更新会话统计 | |
void | clear () |
清空所有统计信息 | |
void | consumePacket5minute (pcpp::Packet &packet) |
收集5分钟粒度的包统计信息 | |
std::string | formatTimestamp (int timestamp) |
将时间戳转换为格式化字符串 | |
void | out_5min_file (const std::string &filename="/home/njust/program/pcapplusplus-23.09-ubuntu-20.04-gcc-9.4.0-x86_64/backend-demo/stats/trafficDetails.csv") |
输出流量统计到CSV文件:[时间],[数据量KB],[包数量],[请求数],[平均速率KB/s] | |
void | out_protocol_file () |
输出协议统计信息到CSV文件 |
Public Attributes | |
int | ipv4PacketCount = 0 |
IPv4包计数 | |
int | ipv6PacketCount = 0 |
IPv6包计数 | |
uint64_t | tcpPacketCount = 0 |
TCP包计数 | |
int | udpPacketCount = 0 |
UDP包计数 | |
int | dnsPacketCount = 0 |
DNS包计数 | |
int | httpPacketCount = 0 |
HTTP包计数 | |
int | sslPacketCount = 0 |
SSL包计数 | |
uint64_t | unknownTcpPacketCount = 0 |
未知TCP包计数 | |
long long | totalBits = 0 |
总比特数 | |
double | totalTime = 0.0 |
总传输时间(秒) | |
std::chrono::time_point< std::chrono::system_clock > | lastPacketTime |
上一个数据包的时间 | |
bool | firstPacket = true |
标记是否为第一个数据包 | |
std::array< long long, 24 *12 > | packetSize5minute = {0} |
数据量(字节) | |
std::array< long long, 24 *12 > | averageRate5minute = {0} |
平均速率(字节/秒) | |
std::array< long long, 24 *12 > | requestCount5minute = {0} |
请求数量(基于流的统计) | |
std::array< long long, 24 *12 > | periodStartTimestamp = {0} |
每个时间段的起始时间戳 | |
std::array< std::unordered_set< uint32_t >, 24 *12 > | activeFlows |
用于记录当前时间段的活跃流(五元组哈希值) | |
std::vector< int64_t > | packetCount5minute |
每五分钟的包计数 | |
std::vector< int64_t > | packetCounts |
每两个小时的包计数 | |
std::vector< int64_t > | packetCountsBits |
每两个小时的包比特数 | |
std::unordered_map< std::string, IpValueTuple > | Ip2IpValueTuple |
IP地址和价值度元组的映射 | |
std::mutex | mutex |
保护共享资源的互斥锁 | |
std::vector< int > | tcpHeartbeatCounts |
每两个小时的异常包数 | |
HashTableManager | manager |
条件编译: 启用服务器功能 | |
std::unordered_map< uint16_t, uint64_t > | portTrafficMap |
统计指定端口的总流量(单位:字节) | |
const std::unordered_set< uint16_t > | KNOWN_TCP_PORTS |
已知TCP端口白名单 | |
const size_t | MAX_LINES = 10000 |
CSV文件最大行数限制 |
用于收集包统计信息的共享结构体
包含各种网络协议的统计信息、流量分析、时间序列数据等, 支持多线程安全的统计数据收集和分析功能
|
inline |
构造函数 - 初始化统计结构
初始化各种统计向量和时间戳
|
inline |
清空所有统计信息
重置所有统计计数器到初始状态,线程安全操作
|
inline |
收集5分钟粒度的包统计信息
packet | 网络包引用 |
按5分钟时间段收集包统计信息,包括包数量、数据大小、流统计等
|
inline |
消费包的端口流量统计
packet | 网络包引用 |
统计特定端口的流量,包括TCP和UDP协议
|
inline |
消费包的协议统计
packet | 网络包引用 |
统计各种网络协议的包数量,包括已知和未知协议的识别
|
inline |
检测心跳包
packet | 网络包引用 |
检测网络中的心跳包模式(当前为空实现)
|
inline |
将时间戳转换为格式化字符串
timestamp | Unix时间戳 |
将Unix时间戳转换为可读的日期时间格式
|
inline |
限制CSV文件行数
filename | 文件名 |
max_lines | 最大行数 |
当CSV文件超过最大行数时,保留表头和最新的数据,删除最旧的数据
|
inline |
输出流量统计到CSV文件:[时间],[数据量KB],[包数量],[请求数],[平均速率KB/s]
filename | 输出文件路径,默认为"./backend-demo/stats/trafficDetails.csv" |
该函数每12秒执行一次,将5分钟粒度的流量统计数据写入CSV文件。 处理逻辑:
特性:
输出格式: Time Period,Data Size,Packet Count,Request Count,Average Rate [时间],[数据量KB],[包数量],[请求数],[平均速率KB/s]
|
inline |
输出端口统计到文件
将端口流量统计信息追加写入到CSV文件,并限制文件最大行数
|
inline |
输出协议统计信息到CSV文件
该函数将协议类型的统计信息(如TCP/UDP/ICMP等)追加写入到protocol_stats.csv文件 每12秒执行一次,记录各协议的包数量占比情况
特性:
输出格式: [时间戳],[协议类型1:数量],[协议类型2:数量],...
|
inline |
打印端口流量统计
out | 输出流 |
将端口流量统计信息格式化输出到指定流
|
inline |
更新会话统计
packet | 网络包引用 |
totalPacketCounts | 总包数 |
更新网络流的会话统计信息,使用哈希表管理器跟踪流状态
std::array<std::unordered_set<uint32_t>, 24 * 12> PacketStats::activeFlows |
用于记录当前时间段的活跃流(五元组哈希值)
std::array<long long, 24 * 12> PacketStats::averageRate5minute = {0} |
平均速率(字节/秒)
int PacketStats::dnsPacketCount = 0 |
DNS包计数
bool PacketStats::firstPacket = true |
标记是否为第一个数据包
int PacketStats::httpPacketCount = 0 |
HTTP包计数
std::unordered_map<std::string, IpValueTuple> PacketStats::Ip2IpValueTuple |
IP地址和价值度元组的映射
int PacketStats::ipv4PacketCount = 0 |
IPv4包计数
int PacketStats::ipv6PacketCount = 0 |
IPv6包计数
const std::unordered_set<uint16_t> PacketStats::KNOWN_TCP_PORTS |
已知TCP端口白名单
定义常见的TCP服务端口,用于识别已知协议
std::chrono::time_point<std::chrono::system_clock> PacketStats::lastPacketTime |
上一个数据包的时间
HashTableManager PacketStats::manager |
条件编译: 启用服务器功能
const size_t PacketStats::MAX_LINES = 10000 |
CSV文件最大行数限制
std::mutex PacketStats::mutex |
保护共享资源的互斥锁
std::vector<int64_t> PacketStats::packetCount5minute |
每五分钟的包计数
std::vector<int64_t> PacketStats::packetCounts |
每两个小时的包计数
std::vector<int64_t> PacketStats::packetCountsBits |
每两个小时的包比特数
std::array<long long, 24 * 12> PacketStats::packetSize5minute = {0} |
数据量(字节)
std::array<long long, 24 * 12> PacketStats::periodStartTimestamp = {0} |
每个时间段的起始时间戳
std::unordered_map<uint16_t, uint64_t> PacketStats::portTrafficMap |
统计指定端口的总流量(单位:字节)
std::array<long long, 24 * 12> PacketStats::requestCount5minute = {0} |
请求数量(基于流的统计)
int PacketStats::sslPacketCount = 0 |
SSL包计数
std::vector<int> PacketStats::tcpHeartbeatCounts |
每两个小时的异常包数
uint64_t PacketStats::tcpPacketCount = 0 |
TCP包计数
long long PacketStats::totalBits = 0 |
总比特数
double PacketStats::totalTime = 0.0 |
总传输时间(秒)
int PacketStats::udpPacketCount = 0 |
UDP包计数
uint64_t PacketStats::unknownTcpPacketCount = 0 |
未知TCP包计数