
网络上的数据对电脑来说是一串串 0 和 1对人类来说基本是天书。但如果我们能把天书翻译成谁、在什么时间、跟谁、传了多少数据很多问题就变得清晰了。chensuiyi/packet是 MoonBit 语言的一个数据解析模块专门负责这个翻译工作。它输入一段原始网络数据输出一份人类能读懂的通信档案。一段网络数据里面藏着什么网络数据虽然看起来乱但其实是有固定格式的一层套一层。最外面一层记录了收发双方的硬件地址相当于快递单上的寄件人和收件人。中间一层记录了双方的 IP 地址相当于城市和街道。最里面一层记录了双方的端口号相当于具体到几号房间。packet模块做的事就是把这几层一层层拆开把里面的关键信息提取出来。提取出来的通信档案长什么样核心是一份五元组信息五个要素源 IP数据从哪个地址发出源端口数据从哪个程序发出目标 IP数据发往哪个地址目标端口数据发往哪个程序协议类型用的什么传输方式五个要素合在一起就能唯一确定一条通信连接。就像快递单上的寄件人、收件人、物品类型合在一起能唯一确定一单快递。如何下载安装MoonBit 是一门新的编程语言语法风格类似 Rust 但更简洁编译成 WebAssembly 后体积小、速度快主要面向云原生场景。语言文档https://docs.moonbitlang.com访问官方MoonBit 工具链在 Windows 上用 PowerShell 一条命令安装。安装完成后验证一下moon --version然后新建一个项目引入解析模块moon new packet-demo cd packet-demo moon add chensuiyi/packet一个完整示例调用一次解析函数传入一段原始网络数据和抓包时间就能拿到结果// data一段原始网络数据字节 // ts_sec、ts_usec抓包时间 // local_ips本机 IP 列表用于判断数据方向 match packet.parse(data, ts_sec, ts_usec, local_ips) { Some(p) println(p.tuple.to_string()) None println(解析失败) }实际解析一段以太网 IPv4 TCP三层结构的数据输出是192.168.1.1:443 - 192.168.1.2:1234 tcp意思是从192.168.1.1的443端口通过 TCP 方式发往192.168.1.2的1234端口。一段看不懂的十六进制数据就这样变成了人能读懂的通信档案。解析成功时还能拿到这些信息信息说明五元组谁、通过什么方式、跟谁通信方向数据是发出的、收到的还是本机内部的载荷长度真正传输的数据有多大总长度整个数据包有多大能做到什么效果要统计电脑流量的去向把每个数据包解析成五元组再按连接汇总就能得出每条通信连接传了多少数据。要做网络可视化展示解析出每一条连接画成图表或动画就能直观呈现网络的实时状态。要排查某个程序连不上服务器的问题解析数据包查看连接目标、端口和方向就能定位问题所在。这个模块有什么特点纯 MoonBit 实现不依赖任何外部库任何环境都能跑。支持 IPv4 和 IPv6 两种地址格式。支持 TCP、UDP、ICMP 等常见传输方式。遇到不完整或无法识别的数据直接跳过不会让程序崩溃。解析逻辑和数据抓取完全分离可以独立测试、独立复用。什么场景下会用到它需要看懂网络数据的程序都可以使用网络监控工具流量统计工具网络调试工具安全分析工具