基于连接元组异或的TCP流追踪方案可行性咨询(libpcap)
基于libpcap(pcap crate)的TCP流重建方案验证
我正在使用libpcap的Rust crate,需要从捕获的数据包中重建独立的TCP流。核心需求是用尽可能低的开销,把双向(客户端→服务器、服务器→客户端)的数据包匹配到对应的流——流由**4元组(源地址、目的地址、源端口、目的端口)**唯一标识。
我设计了以下方案:
- 创建哈希表,结构为(流键 → 数据包数组)
- 从libpcap获取下一个数据包
- 提取数据包的源/目的IP地址和端口号
- 计算流键:对(源IP与目的IP的异或结果,源端口与目的端口的异或结果)进行哈希运算
- 若流键已存在于哈希表,将当前数据包追加到对应条目;若不存在则新建条目
- 当检测到FIN或RST包时,删除对应哈希表条目,并处理收集到的该流所有数据包
这个方案无需关注数据包流向,也不用实现复杂的连接状态跟踪。我已经写了Rust测试代码验证,结果符合预期,但不确定这个方案是否具备普遍有效性。
测试代码如下:
use std::collections::hash_map::DefaultHasher; use std::{net::Ipv4Addr, str::FromStr}; use std::hash::{Hash, Hasher}; #[derive(Debug, PartialEq)] struct TestS { src_ip: Ipv4Addr, dst_ip: Ipv4Addr, src_port: u16, dst_port: u16 } impl Hash for TestS { fn hash<H: Hasher>(&self, state: &mut H) { let hashable_ip = u32::from(self.src_ip) ^ u32::from(self.dst_ip); let hashable_port = self.src_port ^ self.dst_port; hashable_ip.hash(state); hashable_port.hash(state); } } fn main() { let a_packet = TestS{ src_ip: Ipv4Addr::from_str("192.168.0.1").unwrap(), dst_ip: Ipv4Addr::from_str("127.0.0.1").unwrap(), src_port: 7879, dst_port:80 }; let another_packet = TestS{ src_ip: Ipv4Addr::from_str("127.0.0.1").unwrap(), dst_ip: Ipv4Addr::from_str("192.168.0.1").unwrap(), src_port: 80, dst_port: 7879 }; let mut hash_state = DefaultHasher::new(); a_packet.hash(&mut hash_state); let hash1 = hash_state.finish(); let mut hash_state2 = DefaultHasher::new(); another_packet.hash(&mut hash_state2); let hash2 = hash_state2.finish(); println!("{} -- {}", hash1, hash2); //hash1 and hash2 will be equal }
内容的提问来源于stack exchange,提问作者thek33per
相关产品推荐
相关产品推荐

