PcapFile.IO - 高性能数据包文件读写库

一个用 Rust 编写的高性能数据包文件处理库,提供完整的数据包文件读写功能。本库使用自定义的 PCAP 格式,专为高性能数据采集和回放设计。
✨ 核心特性
- 🚀 高性能: 零拷贝操作和编译时优化
- 🔒 内存安全: Rust 的内存安全保证
- 🧵 线程安全: 内置线程安全支持
- 📦 易于使用: 简洁直观的 API 设计
- ⚙️ 灵活配置: 丰富的配置选项
- ✅ 数据完整性: 内置 CRC32 校验和验证
- 🛡️ 错误恢复: 支持跳过损坏数据包继续处理
- 🌍 跨平台: 支持 Windows、Linux、macOS
📦 安装
在 Cargo.toml 中添加依赖:
[dependencies]
pcapfile-io = "0.1.0"
chrono = "0.4"
🚀 快速开始
基本读写操作
use pcapfile_io::{PcapReader, PcapWriter, DataPacket};
use pcapfile_io::business::config::{ReaderConfig, WriterConfig};
use chrono::Utc;
fn main() -> Result<(), Box<dyn std::error::Error>> {
{
let config = WriterConfig::default();
let mut writer = PcapWriter::new("./data", "my_dataset", config)?;
let data = b"Hello, World!".to_vec();
let packet = DataPacket::from_datetime(Utc::now(), data)?;
writer.write_packet(&packet)?;
writer.flush()?;
}
{
let config = ReaderConfig::default();
let mut reader = PcapReader::new("./data", "my_dataset", config)?;
while let Some(validated_packet) = reader.read_packet()? {
if validated_packet.is_valid() {
println!("读取到有效数据包: {} 字节", validated_packet.packet_length());
println!("时间戳: {}", validated_packet.capture_time());
} else {
println!("读取到损坏数据包: {} 字节 (继续处理)", validated_packet.packet_length());
}
}
}
Ok(())
}
仅读取数据(不关心校验结果)
use pcapfile_io::{PcapReader, DataPacket};
use pcapfile_io::business::config::ReaderConfig;
fn read_data_only() -> Result<(), Box<dyn std::error::Error>> {
let config = ReaderConfig::default();
let mut reader = PcapReader::new("./data", "my_dataset", config)?;
while let Some(packet) = reader.read_packet_data_only()? {
println!("读取到数据包: {} 字节", packet.packet_length());
}
Ok(())
}
批量操作
use pcapfile_io::{PcapWriter, DataPacket};
use pcapfile_io::business::config::WriterConfig;
use chrono::Utc;
fn batch_operations() -> Result<(), Box<dyn std::error::Error>> {
let config = WriterConfig::default();
let mut writer = PcapWriter::new("./data", "batch_dataset", config)?;
let mut packets = Vec::new();
for i in 0..1000 {
let data = format!("数据包 #{}", i).into_bytes();
let packet = DataPacket::from_datetime(Utc::now(), data)?;
packets.push(packet);
}
writer.write_packets(&packets)?;
writer.flush()?;
Ok(())
}
📖 API 文档
核心类型
DataPacket - 数据包
pub struct DataPacket {
pub header: DataPacketHeader,
pub data: Vec<u8>,
}
impl DataPacket {
pub fn from_datetime(capture_time: DateTime<Utc>, data: Vec<u8>) -> Result<Self, String>;
pub fn from_timestamp(timestamp_seconds: u32, timestamp_nanoseconds: u32, data: Vec<u8>) -> Result<Self, String>;
pub fn capture_time(&self) -> DateTime<Utc>;
pub fn packet_length(&self) -> usize;
pub fn checksum(&self) -> u32;
pub fn is_valid(&self) -> bool; }
ValidatedPacket - 带校验结果的数据包
pub struct ValidatedPacket {
pub packet: DataPacket,
pub is_valid: bool, }
impl ValidatedPacket {
pub fn is_valid(&self) -> bool;
pub fn is_invalid(&self) -> bool;
pub fn packet_length(&self) -> usize;
pub fn capture_time(&self) -> DateTime<Utc>;
pub fn get_timestamp_ns(&self) -> u64;
pub fn checksum(&self) -> u32;
}
读取器 API
PcapReader - 数据集读取器
pub struct PcapReader { }
impl PcapReader {
pub fn new<P: AsRef<Path>>(base_path: P, dataset_name: &str, config: ReaderConfig) -> PcapResult<Self>;
pub fn read_packet(&mut self) -> PcapResult<Option<ValidatedPacket>>;
pub fn read_packets(&mut self, count: usize) -> PcapResult<Vec<ValidatedPacket>>;
pub fn read_packet_data_only(&mut self) -> PcapResult<Option<DataPacket>>;
pub fn read_packets_data_only(&mut self, count: usize) -> PcapResult<Vec<DataPacket>>;
pub fn reset(&mut self) -> PcapResult<()>;
pub fn get_dataset_info(&mut self) -> PcapResult<DatasetInfo>;
}
写入器 API
PcapWriter - 数据集写入器
pub struct PcapWriter { }
impl PcapWriter {
pub fn new<P: AsRef<Path>>(base_path: P, dataset_name: &str, config: WriterConfig) -> PcapResult<Self>;
pub fn write_packet(&mut self, packet: &DataPacket) -> PcapResult<()>;
pub fn write_packets(&mut self, packets: &[DataPacket]) -> PcapResult<()>;
pub fn flush(&mut self) -> PcapResult<()>;
pub fn get_dataset_info(&self) -> DatasetInfo;
}
配置选项
ReaderConfig - 读取器配置
pub struct ReaderConfig {
pub common: CommonConfig,
pub read_timeout: u64, }
impl ReaderConfig {
pub fn default() -> Self;
pub fn high_performance() -> Self; pub fn low_memory() -> Self; }
WriterConfig - 写入器配置
pub struct WriterConfig {
pub common: CommonConfig,
pub max_packets_per_file: usize, pub file_name_format: String, pub auto_flush: bool, pub write_timeout: u64, pub index_flush_interval: u64, }
impl WriterConfig {
pub fn default() -> Self;
pub fn high_performance() -> Self; pub fn low_memory() -> Self; pub fn fast_write() -> Self; }
CommonConfig - 通用配置
pub struct CommonConfig {
pub buffer_size: usize, pub max_packet_size: usize, pub enable_compression: bool, pub index_cache_size: usize, pub enable_index_cache: bool, pub temp_directory: PathBuf, }
🔧 高级功能
数据校验与错误处理
本库提供了灵活的数据校验和错误处理机制:
- 自动校验: 每个数据包都包含 CRC32 校验和,读取时自动验证
- 损坏数据处理: 遇到校验失败的数据包时,不会中断读取过程
- 校验结果反馈: 通过
ValidatedPacket 类型获取校验结果
let mut reader = PcapReader::new("./data", "dataset", config)?;
let mut valid_count = 0;
let mut invalid_count = 0;
while let Some(validated_packet) = reader.read_packet()? {
if validated_packet.is_valid() {
valid_count += 1;
process_packet(&validated_packet.packet);
} else {
invalid_count += 1;
log::warn!("发现损坏数据包,时间戳: {}", validated_packet.capture_time());
if should_use_corrupted_data() {
process_packet(&validated_packet.packet);
}
}
}
println!("处理完成: {} 有效, {} 损坏", valid_count, invalid_count);
性能优化配置
let high_perf_config = WriterConfig::high_performance();
let low_mem_config = ReaderConfig::low_memory();
数据集信息查询
let mut reader = PcapReader::new("./data", "my_dataset", config)?;
let info = reader.get_dataset_info()?;
println!("数据集: {}", info.name);
println!("文件数: {}", info.file_count);
println!("总数据包数: {}", info.total_packets);
println!("总大小: {} 字节", info.total_size);
println!("时间范围: {:?}", info.time_range());
println!("平均速率: {:.2} 包/秒", info.average_packet_rate());
📋 文件格式规范
自定义 PCAP 格式
本库使用自定义的 PCAP 格式,针对高性能场景优化:
文件头部(16 字节)
| 偏移量 |
长度 |
字段名 |
描述 |
| 0 |
4 |
Magic Number |
固定值 0xD4C3B2A1 |
| 4 |
2 |
Major Version |
主版本号 0x0002 |
| 6 |
2 |
Minor Version |
次版本号 0x0004 |
| 8 |
4 |
Timezone Offset |
时区偏移量(秒) |
| 12 |
4 |
Timestamp Accuracy |
时间戳精度(纳秒) |
数据包格式
每个数据包包含:
数据包头部(16 字节)
| 偏移量 |
长度 |
字段名 |
描述 |
| 0 |
4 |
Timestamp Seconds |
时间戳秒部分(UTC) |
| 4 |
4 |
Timestamp Nanoseconds |
时间戳纳秒部分(UTC) |
| 8 |
4 |
Packet Length |
数据包长度(字节) |
| 12 |
4 |
Checksum |
数据包校验和(CRC32) |
文件组织结构
dataset_name/
├── data_20231201_120000_123456789.pcap # 数据文件
├── data_20231201_120100_987654321.pcap # 数据文件
├── ...
└── dataset_name.pidx # 索引文件(自动生成)
🧪 测试
运行所有测试:
cargo test
运行特定测试:
cargo test test_data_consistency
cargo test test_large_dataset
运行基准测试:
cargo bench
📊 性能基准
在典型硬件配置下的性能表现:
| 操作 |
吞吐量 |
延迟 |
| 写入 1KB 数据包 |
~100MB/s |
<1ms |
| 读取 1KB 数据包 |
~150MB/s |
<0.5ms |
| 批量写入 (1000包) |
~200MB/s |
~10ms |
| 索引查询 |
~1M 查询/s |
<1μs |
🔍 错误处理
use pcapfile_io::foundation::error::{PcapError, PcapResult};
pub enum PcapError {
FileNotFound(String),
DirectoryNotFound(String),
InsufficientPermissions(String),
InvalidFormat(String),
CorruptedData(String),
InvalidPacketSize(String),
Io(std::io::Error),
}
pub type PcapResult<T> = Result<T, PcapError>;
📚 示例项目
查看 examples/ 目录中的完整示例:
cargo run --example dataset_usage
find examples -name "*.rs" -exec cargo run --example {} \;
🤝 贡献指南
我们欢迎各种形式的贡献!
开发环境设置
git clone https://github.com/username/pcapfile-io.git
cd pcapfile-io
cargo build
cargo test
cargo fmt --check
cargo clippy
提交规范
📄 许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
🔗 相关链接
PcapFile.IO - 让数据包文件处理变得简单高效! 🚀