capture 1.2.0
这是一个基于 PcapPlusPlus、PF_RING 和 ClickHouse 构建的高性能网络流量分析系统,专注于实时流量捕获、解析与存储。
Loading...
Searching...
No Matches
PacketStats Struct Reference

用于收集包统计信息的共享结构体 More...

#include <PacketStats.h>

Collaboration diagram for PacketStats:
[legend]

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, IpValueTupleIp2IpValueTuple
 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文件最大行数限制

Detailed Description

用于收集包统计信息的共享结构体

包含各种网络协议的统计信息、流量分析、时间序列数据等, 支持多线程安全的统计数据收集和分析功能

Constructor & Destructor Documentation

◆ PacketStats()

PacketStats::PacketStats ( )
inline

构造函数 - 初始化统计结构

初始化各种统计向量和时间戳

Member Function Documentation

◆ clear()

void PacketStats::clear ( )
inline

清空所有统计信息

重置所有统计计数器到初始状态,线程安全操作

◆ consumePacket5minute()

void PacketStats::consumePacket5minute ( pcpp::Packet & packet)
inline

收集5分钟粒度的包统计信息

Parameters
packet网络包引用

按5分钟时间段收集包统计信息,包括包数量、数据大小、流统计等

◆ consumePacketPortTraffic()

void PacketStats::consumePacketPortTraffic ( pcpp::Packet & packet)
inline

消费包的端口流量统计

Parameters
packet网络包引用

统计特定端口的流量,包括TCP和UDP协议

◆ consumePacketProtocol()

void PacketStats::consumePacketProtocol ( pcpp::Packet & packet)
inline

消费包的协议统计

Parameters
packet网络包引用

统计各种网络协议的包数量,包括已知和未知协议的识别

◆ detectHeartbeat()

void PacketStats::detectHeartbeat ( pcpp::Packet & packet)
inline

检测心跳包

Parameters
packet网络包引用

检测网络中的心跳包模式(当前为空实现)

◆ formatTimestamp()

std::string PacketStats::formatTimestamp ( int timestamp)
inline

将时间戳转换为格式化字符串

Parameters
timestampUnix时间戳
Returns
格式化的时间字符串(例如:2024-12-24 14:30:00)

将Unix时间戳转换为可读的日期时间格式

◆ limit_csv_lines()

void PacketStats::limit_csv_lines ( const std::string & filename,
size_t max_lines )
inline

限制CSV文件行数

Parameters
filename文件名
max_lines最大行数

当CSV文件超过最大行数时,保留表头和最新的数据,删除最旧的数据

◆ out_5min_file()

void PacketStats::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")
inline

输出流量统计到CSV文件:[时间],[数据量KB],[包数量],[请求数],[平均速率KB/s]

Parameters
filename输出文件路径,默认为"./backend-demo/stats/trafficDetails.csv"

该函数每12秒执行一次,将5分钟粒度的流量统计数据写入CSV文件。 处理逻辑:

  1. 读取现有CSV文件内容到内存(map结构)
  2. 更新内存中的统计数据
  3. 将更新后的数据写回文件

特性:

  • 线程安全:使用mutex保护共享资源
  • 空文件处理:当没有数据时写入全0的一行
  • 数据更新:保留历史数据,只更新变化的部分

输出格式: Time Period,Data Size,Packet Count,Request Count,Average Rate [时间],[数据量KB],[包数量],[请求数],[平均速率KB/s]

◆ out_port_file()

void PacketStats::out_port_file ( )
inline

输出端口统计到文件

将端口流量统计信息追加写入到CSV文件,并限制文件最大行数

◆ out_protocol_file()

void PacketStats::out_protocol_file ( )
inline

输出协议统计信息到CSV文件

该函数将协议类型的统计信息(如TCP/UDP/ICMP等)追加写入到protocol_stats.csv文件 每12秒执行一次,记录各协议的包数量占比情况

特性:

  • 线程安全:使用mutex保护共享资源
  • 文件追加模式:不会覆盖已有数据
  • 行数限制:自动维护文件最大行数(MAX_LINES)

输出格式: [时间戳],[协议类型1:数量],[协议类型2:数量],...

◆ printPortTraffic()

void PacketStats::printPortTraffic ( std::ostream & out)
inline

打印端口流量统计

Parameters
out输出流

将端口流量统计信息格式化输出到指定流

◆ updateSessionStats()

void PacketStats::updateSessionStats ( pcpp::Packet & packet,
const long long & totalPacketCounts )
inline

更新会话统计

Parameters
packet网络包引用
totalPacketCounts总包数

更新网络流的会话统计信息,使用哈希表管理器跟踪流状态

Member Data Documentation

◆ activeFlows

std::array<std::unordered_set<uint32_t>, 24 * 12> PacketStats::activeFlows

用于记录当前时间段的活跃流(五元组哈希值)

◆ averageRate5minute

std::array<long long, 24 * 12> PacketStats::averageRate5minute = {0}

平均速率(字节/秒)

◆ dnsPacketCount

int PacketStats::dnsPacketCount = 0

DNS包计数

◆ firstPacket

bool PacketStats::firstPacket = true

标记是否为第一个数据包

◆ httpPacketCount

int PacketStats::httpPacketCount = 0

HTTP包计数

◆ Ip2IpValueTuple

std::unordered_map<std::string, IpValueTuple> PacketStats::Ip2IpValueTuple

IP地址和价值度元组的映射

◆ ipv4PacketCount

int PacketStats::ipv4PacketCount = 0

IPv4包计数

◆ ipv6PacketCount

int PacketStats::ipv6PacketCount = 0

IPv6包计数

◆ KNOWN_TCP_PORTS

const std::unordered_set<uint16_t> PacketStats::KNOWN_TCP_PORTS
Initial value:
= {
80,
443,
22,
25,
53,
21,
3389,
3306
}

已知TCP端口白名单

定义常见的TCP服务端口,用于识别已知协议

◆ lastPacketTime

std::chrono::time_point<std::chrono::system_clock> PacketStats::lastPacketTime

上一个数据包的时间

◆ manager

HashTableManager PacketStats::manager

条件编译: 启用服务器功能

◆ MAX_LINES

const size_t PacketStats::MAX_LINES = 10000

CSV文件最大行数限制

◆ mutex

std::mutex PacketStats::mutex

保护共享资源的互斥锁

◆ packetCount5minute

std::vector<int64_t> PacketStats::packetCount5minute

每五分钟的包计数

◆ packetCounts

std::vector<int64_t> PacketStats::packetCounts

每两个小时的包计数

◆ packetCountsBits

std::vector<int64_t> PacketStats::packetCountsBits

每两个小时的包比特数

◆ packetSize5minute

std::array<long long, 24 * 12> PacketStats::packetSize5minute = {0}

数据量(字节)

◆ periodStartTimestamp

std::array<long long, 24 * 12> PacketStats::periodStartTimestamp = {0}

每个时间段的起始时间戳

◆ portTrafficMap

std::unordered_map<uint16_t, uint64_t> PacketStats::portTrafficMap

统计指定端口的总流量(单位:字节)

◆ requestCount5minute

std::array<long long, 24 * 12> PacketStats::requestCount5minute = {0}

请求数量(基于流的统计)

◆ sslPacketCount

int PacketStats::sslPacketCount = 0

SSL包计数

◆ tcpHeartbeatCounts

std::vector<int> PacketStats::tcpHeartbeatCounts

每两个小时的异常包数

◆ tcpPacketCount

uint64_t PacketStats::tcpPacketCount = 0

TCP包计数

◆ totalBits

long long PacketStats::totalBits = 0

总比特数

◆ totalTime

double PacketStats::totalTime = 0.0

总传输时间(秒)

◆ udpPacketCount

int PacketStats::udpPacketCount = 0

UDP包计数

◆ unknownTcpPacketCount

uint64_t PacketStats::unknownTcpPacketCount = 0

未知TCP包计数


The documentation for this struct was generated from the following file: