MoonBit 协议解析层:Ethernet/IPv4/IPv6/TCP/UDP 头解析
只做头部解析与连接跟踪,不做流重组与应用层解析(YAGNI)。
moon add chensuiyi/packet// moon.pkg: import "chensuiyi/packet"
// 解析一个原始包(data 来自 pcap 层或任何 Bytes)
let ips : FixedArray[IpAddr] = ... // 本机 IP 列表(含回环 127.0.0.1 / ::1)
match packet.parse(data, ts_sec, ts_usec, ips) {
Some(p) => {
// p.tuple: 五元组(src_ip/src_port/dst_ip/dst_port/proto)
// p.direction: In / Out / Local
// p.payload_len / p.total_len: 载荷与包长
println(p.tuple.to_string())
}
None => () // 截断 / ARP / 未知协议
}let tracker = packet.ConnTracker::new(60L) // 60 秒无流量即清理
// 每个包:
tracker.update(p)
tracker.cleanup(p.ts_sec)
// 每秒输出一行 JSON 快照:
println(tracker.snapshot_json(ts))| 类型 / 函数 | 说明 |
|---|---|
| Proto | Tcp / Udp / Icmp / Icmpv6 / Other |
| Direction | In(入)/ Out(出)/ Local(本机到本机) |
| IpAddr::new(v4 : Bool, bytes : Bytes) | IP 地址(v4=4 字节,v6=16 字节) |
| FiveTuple::new(...) | 五元组(连接跟踪 key) |
| ParsedPacket | 解析结果:时间戳 + 五元组 + 方向 + 载荷/总长 |
| parse(data, ts_sec, ts_usec, local_ips) -> ParsedPacket? | 解析入口 |
| ConnTracker::new(idle_timeout) | 连接跟踪器 |
| ConnTracker::update(pkt) | 更新统计(Local 流量计入入方向) |
| ConnTracker::cleanup(now) | 清理空闲连接 |
| ConnTracker::snapshot(ts) / snapshot_json(ts) | 连接快照 / JSON 行 |
{"ts":1780000000,"conns":[{"src_ip":"1.2.3.4","src_port":443,"dst_ip":"5.6.7.8","dst_port":54321,"proto":"tcp","packets":12,"bytes_in":1024,"bytes_out":512,"first_seen":1780000000,"last_seen":1780000005}]}moon testpub struct ConnStats {
packets : Int
bytes_in : Int64
bytes_out : Int64
first_seen : Int64
last_seen : Int64
} derive(Default)pub(all) enum Direction {
In
Out
Local
}fn ParsedPacket::new(ts_sec : Int64, ts_usec : Int, tuple : FiveTuple, direction : Direction, payload_len : Int, total_len : Int) -> ParsedPacketfn parse(data : Bytes, ts_sec : Int64, ts_usec : Int, local_ips : FixedArray[IpAddr]) -> ParsedPacket?Install
Download zipMoonBit 协议解析层:Ethernet/IPv4/IPv6/TCP/UDP 头解析