由于大型PCAP文件的数据包处理(统计计算,如IP分配,TTL分配等)相对较慢,我想将其并行化。
我使用C ++库libtins
进行数据包读取和处理:
数据包读取
FileSniffer sniffer(pcap_path);
for (const auto &pkt : sniffer) {
this->process_packets(pkt);
}
数据包处理(摘录)
void PcapProcessor::process_packets(const Packet &pkt) {
// packet count
packetCount++;
const PDU *pdu = pkt.pdu();
if (pdu->find_pdu<IP>()) {
const IP &ipLayer = pdu->rfind_pdu<IP>();
// IP distribution
ip_distribution[ipLayer.src_addr()]++;
ip_distribution[ipLayer.dst_addr()]++;
// TTL distribution
ttl_distribution[ipLayer.ttl()]++;
// Protocol distribution - layer 3
protocol_distribution["IP"]++;
}
// Protocol distribution - layer 4
PDU::PDUType p = pdu->inner_pdu()->pdu_type();
if (p == PDU::PDUType::TCP) {
protocol_distribution["TCP"]++;
}
if (p == PDU::PDUType::UDP) {
protocol_distribution["UDP"]++;
}
}
而process_packets
消耗大部分处理时间。如果可以并行调用多个数据包,那将非常节省时间。这通常是否可行,因为sniffer
中的数据包数量尚不清楚?如果是这样,std::unordered_map
中使用的int
和process_packets
变量是否必须更改为线程安全?
我尝试使用OpenMP,只需在循环之前添加#pragma openmp parallel for
,然后导致error: ‘pkt’ implicitly determined as ‘firstprivate’ has reference type #pragma omp task
。这根本不可并行吗?