capture 1.2.0
这是一个基于 PcapPlusPlus、PF_RING 和 ClickHouse 构建的高性能网络流量分析系统,专注于实时流量捕获、解析与存储。
Loading...
Searching...
No Matches
unifiedPacketAttr.h
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <vector>
14#include <queue>
15#include <unordered_map>
16#include <functional>
17#include <sstream>
18#include "TcpLayer.h"
19#include <UdpLayer.h>
20#include <IcmpLayer.h>
21#include "IPv4Layer.h"
22#include "PayloadLayer.h"
23#include "PacketUtils.h"
24#include "SystemUtils.h"
25#include <ctime>
26#include <fstream>
27#include <curl/curl.h>
28#include <clickhouse/client.h>
29
35#define MAX_QUEUE_LENGTH 20000
36
37using namespace clickhouse;
38
46{
47public:
48 // 流标识和基本信息
49 uint32_t hash_val;
50 uint32_t packet_len;
51 uint32_t tv_sec;
52 uint32_t tv_nsec;
53 std::string src_ip;
54 std::string dst_ip;
55
56 // IPv4层属性
57 uint8_t ttl;
58 uint8_t tos;
59 uint16_t id;
60 uint16_t offset;
61 uint16_t len_ip;
63 uint8_t protocol_ip;
64
65 // 传输层通用属性
66 uint8_t protocol;
67 uint16_t len_load;
68 uint16_t src_port;
69 uint16_t dst_port;
70 uint32_t ack_num;
71 uint32_t seq_num;
72
73 // TCP专用属性
74 uint16_t flag;
75 uint16_t window;
76
77 // UDP专用属性
78 uint16_t len_udp;
79
80 // ICMP专用属性
81 uint8_t icmp_type;
82 uint8_t icmp_code;
83
89 unifiedPacketAttr(pcpp::Packet *packet);
90
96};
97
107{
108 // 根据一个包的五元组,计算流ID
109 hash_val = pcpp::hash5Tuple(packet);
110
111 // 获取包长度 int->uint32_t
112 packet_len = static_cast<uint32_t>(packet->getRawPacket()->getRawDataLen());
113
114 // 获取时间戳
115 timespec timestamp = packet->getRawPacket()->getPacketTimeStamp();
116 tv_sec = timestamp.tv_sec;
117 tv_nsec = timestamp.tv_nsec;
118
119 pcpp::IPv4Layer* ipv4layer = packet->getLayerOfType<pcpp::IPv4Layer>();
120
121 // 获取包的五元组,存起来便于检索
122 src_ip = ipv4layer->getSrcIPAddress().toString();
123 dst_ip = ipv4layer->getDstIPAddress().toString();
124
125 // 获取IPv4层属性
126 pcpp::iphdr* ipv4hdr = ipv4layer->getIPv4Header();
127 tos = ipv4hdr->typeOfService;
128 id = ipv4hdr->ipId;
129 offset = ipv4hdr->fragmentOffset;
130 len_ip = ipv4hdr->totalLength;
131 ttl = ipv4hdr->timeToLive;
132 protocol_ip = ipv4hdr->protocol;
133
134 // 判断IP版本
135 if(ipv4hdr->ipVersion==4)
136 {
137 ip_version = 0;
138 }
139 else if(ipv4hdr->ipVersion==6)
140 {
141 ip_version = 1; // 其实传入已经判断过了
142 }
143
144 // 根据传输层协议类型解析相应属性
145 if (packet->isPacketOfType(pcpp::TCP))
146 {
147 protocol = 0; // TCP协议
148 pcpp::TcpLayer *tcpLayer = packet->getLayerOfType<pcpp::TcpLayer>();
149 pcpp::tcphdr *tcpHeader = tcpLayer->getTcpHeader();
150
151 // 获取端口信息
152 src_port = packet->getLayerOfType<pcpp::TcpLayer>()->getSrcPort();
153 dst_port = packet->getLayerOfType<pcpp::TcpLayer>()->getDstPort();
154
155 // 组装TCP标志位
156 flag = 0x00;
157 flag = (tcpHeader->finFlag << 7) | (tcpHeader->synFlag << 6) | (tcpHeader->rstFlag << 5) |
158 (tcpHeader->pshFlag << 4) | (tcpHeader->ackFlag << 3) | (tcpHeader->urgFlag << 2) |
159 (tcpHeader->eceFlag << 1) | (tcpHeader->cwrFlag << 0);
160
161 // 获取TCP序列号和确认号
162 seq_num = tcpHeader->sequenceNumber;
163 ack_num = tcpHeader->ackNumber;
164
165 // 获取负载长度和窗口大小
166 len_load = tcpLayer->getLayerPayloadSize();
167 window = tcpHeader->windowSize;
168 }
169 else if (packet->isPacketOfType(pcpp::UDP))
170 {
171 protocol = 1; // UDP协议
172
173 // 获取端口信息
174 src_port = packet->getLayerOfType<pcpp::UdpLayer>()->getSrcPort();
175 dst_port = packet->getLayerOfType<pcpp::UdpLayer>()->getDstPort();
176
177 pcpp::UdpLayer *udpLayer = packet->getLayerOfType<pcpp::UdpLayer>();
178 pcpp::udphdr *udpHeader = udpLayer->getUdpHeader();
179
180 // 获取UDP长度和负载长度
181 len_udp = udpHeader->length;
182 len_load = udpLayer->getLayerPayloadSize();
183 }
184 else if (packet->isPacketOfType(pcpp::ICMP))
185 {
186 protocol = 2; // ICMP协议
187 // ICMP没有端口概念,端口字段不设置
188
189 pcpp::IcmpLayer *icmpLayer = packet->getLayerOfType<pcpp::IcmpLayer>();
190 pcpp::icmphdr *icmpHeader = icmpLayer->getIcmpHeader();
191
192 // 获取ICMP类型和代码
193 icmp_code = icmpHeader->code;
194 icmp_type = icmpHeader->type;
195 }
196}
uint16_t len_load
负载长度
Definition unifiedPacketAttr.h:67
uint8_t protocol
传输层协议类型:TCP=0, UDP=1, ICMP=2
Definition unifiedPacketAttr.h:66
uint16_t len_ip
IP段总长度
Definition unifiedPacketAttr.h:61
uint8_t icmp_type
ICMP类型
Definition unifiedPacketAttr.h:81
uint32_t ack_num
确认号(UDP无此字段)
Definition unifiedPacketAttr.h:70
bool ip_version
IP版本号,0:IPv4, 1:IPv6.
Definition unifiedPacketAttr.h:62
uint16_t src_port
源端口(ICMP无此字段)
Definition unifiedPacketAttr.h:68
uint8_t protocol_ip
IP协议类型字段
Definition unifiedPacketAttr.h:63
uint8_t icmp_code
ICMP代码
Definition unifiedPacketAttr.h:82
uint32_t tv_sec
时间戳(秒)
Definition unifiedPacketAttr.h:51
unifiedPacketAttr(pcpp::Packet *packet)
构造函数
Definition unifiedPacketAttr.h:106
uint16_t dst_port
目的端口(ICMP无此字段)
Definition unifiedPacketAttr.h:69
uint32_t packet_len
包长度
Definition unifiedPacketAttr.h:50
uint8_t tos
服务类型(Type of Service)
Definition unifiedPacketAttr.h:58
uint8_t ttl
生存时间(Time To Live)
Definition unifiedPacketAttr.h:57
uint16_t len_udp
UDP长度字段
Definition unifiedPacketAttr.h:78
uint16_t flag
TCP标志位
Definition unifiedPacketAttr.h:74
std::string dst_ip
目的IP地址
Definition unifiedPacketAttr.h:54
uint16_t window
TCP窗口大小
Definition unifiedPacketAttr.h:75
std::string src_ip
源IP地址
Definition unifiedPacketAttr.h:53
uint32_t tv_nsec
时间戳(纳秒)
Definition unifiedPacketAttr.h:52
uint32_t seq_num
序列号(UDP无此字段)
Definition unifiedPacketAttr.h:71
uint16_t id
IP标识字段
Definition unifiedPacketAttr.h:59
uint32_t hash_val
五元组计算的流ID
Definition unifiedPacketAttr.h:49
uint16_t offset
片偏移字段
Definition unifiedPacketAttr.h:60
~unifiedPacketAttr()
析构函数
Definition unifiedPacketAttr.h:95