核心特性
从构建到嗅探 — goscapy 用简洁、地道的 Go API 覆盖完整的数据包生命周期。
🔨 Builder API
流畅的方法链式调用,实现类型安全、显式的数据包构建,编译时即可保证正确性。
⚡ 快捷函数
针对常用协议栈的一行式构建函数,内置合理默认值,一个函数调用即可构建数据包。
🔬 数据包解析与内省
将原始字节解析为结构化数据包,支持自动协议检测、分层提取,以及 Show()、Summary() 多格式展示。
📡 发送与接收
通过原始套接字在 L2(以太网)和 L3(IP)层级发送和接收数据包,支持批量收发、零拷贝、io_uring 异步 IO。
👃 数据包嗅探
支持回调和通道两种方式的实时流量捕获,内置 BPF 过滤器支持,以及 Linux PacketMMAP (TPACKET_V3) 高性能捕获。
✅ 自动校验和
IP、TCP、UDP、ICMP、ICMPv6 和 IPv6 校验和在序列化时自动计算,无需手动处理。
🔗 层绑定
相邻层之间自动推断字段 — IP 叠加在以太网上会自动设置 EtherType。
🧩 按需加载模块
Contrib 模块系统支持按需加载协议,减少二进制体积。导入所需协议包并调用 contrib.Load() 即可。
🔍 p0f 指纹识别
通过被动分析 TCP SYN 包特征(窗口大小、TTL、选项布局等)识别远程操作系统,内置签名数据库。
💾 PCAP 读写
纯 Go 实现的 PCAP/pcapng 文件读写,无需 libpcap 依赖,支持离线数据包分析与存储。
🔄 TCP 流重组
跟踪 TCP 会话、按序重组数据段、处理重叠与重传,暴露双向字节流用于应用层分析。
💻 跨平台
支持 macOS(Darwin)和 Linux,使用平台特定的原始套接字实现,零 CGO 依赖。
三种方式写 Ping — 感受 goscapy 的简洁
同样的任务 — 构建 ICMP 回显请求、发送、接收回复 — 分别用 Python Scapy、goscapy 和 Go 标准库实现。看看 goscapy 如何将 Scapy 的优雅带入 Go。
from scapy.all import * # 一行搞定:构建 + 发送 + 接收 ans = sr1(IP(dst="8.8.8.8") / ICMP(), timeout=3) ans.show()
// 构建 + 发送 + 接收第一个回复 pkt := goscapy.NewIP(). DstIP("8.8.8.8"). Over(goscapy.NewICMP(). Type(8).Code(0)). Packet() _, resp, _ := sendrecv.SendRecv1( pkt, "en0", 3*time.Second) fmt.Println(resp.Summary())
// 手动构造 ICMP 头 type icmpMsg struct { Type uint8 Code uint8 Chksum uint16 ID uint16 Seq uint16 } // 手动序列化二进制... // 手动计算校验和... // 用 net.ListenPacket 打开原始套接字... // 处理平台差异... // 手动解析响应二进制... // 约 30 行样板代码 // 无分层解析 // 无自动校验和 // 无跨平台抽象
| 特性 | 🐍 Scapy | 🦎 goscapy | 🔵 Go 标准库 |
|---|---|---|---|
| 构建 ICMP 包 | 1 行 | 1 条链式调用 | 手动结构体 + 序列化 |
| 校验和 | 自动 ✅ | 自动 ✅ | 手动 ❌ |
| 发送 + 接收 | sr1() |
SendRecv1() |
套接字 + 读取循环 |
| 解析响应 | 自动 ✅ | 自动 ✅ | 手动解析 ❌ |
| 性能 | 解释执行 🐢 | 编译执行 ⚡ | 编译执行 ⚡ |
| 类型安全 | 动态类型 | 编译时检查 ✅ | 手动保证 |
与其他库的对比
goscapy 与 Go 生态中其他常用的网络库相比有哪些异同?以下是它们的核心能力对比和场景推荐,帮助你快速做出选择。
核心能力矩阵
| 能力 | 🦎 goscapy | 📦 gopacket | 🔵 golang.org/x/net |
|---|---|---|---|
| 包构建 (Builder API) | 链式 Builder + 快捷函数 | 需手写 SerializeTo() |
需手写 struct marshal |
| 包解析 (Dissector) |
packet.Dissect() 自动分层
|
强大的 DecodingLayerParser | 仅 icmp/ipv4 提供 Message 解析 |
| L2 收发 (Raw Socket) | ✅ Ethernet 层 | ❌ 依赖 libpcap | ❌ |
| L3 收发 (Raw Socket) | ✅ IP 层 (ip4:tcp/udp/icmp) | ❌ |
✅ icmp.ListenPacket /
ipv4.RawConn
|
| Sniffing 嗅探 | ✅ Channel + Callback + BPF | ✅ libpcap/afpacket/pfring | ❌ |
| PCAP 文件读写 | ✅ 纯 Go 实现(pcap/pcapng) | ✅ 依赖 libpcap | ❌ |
| TCP 流重组 | ✅ tcpstream + reassembly |
✅ tcpassembly | ❌ |
| 自动校验和 | ✅ IP/TCP/UDP/ICMP | ✅* IP/TCP/UDP (需手动关联网络层) | ❌ 手动计算 |
| 层绑定 (Auto Infer) | ✅ 邻层字段自动推断 | ❌ | ❌ |
| BPF 过滤器 | ✅ 生成 + 附加 | ✅ 生成 + 附加 | ✅ bpf.Assemble() 生成 |
| 协议覆盖 | 40+ 协议(核心 + contrib 按需加载) | 200+ 协议解码 | icmp, ipv4, bpf 等 |
| 跨平台 | ✅ Darwin + Linux | ✅ 多平台 | ✅ 多平台 |
| 设计哲学 | 类 Scapy,简洁优雅 | 完整解码体系,学术/分析 | 轻量标准库扩展 |
* 注:gopacket
支持自动计算校验和,但需要显式启用相关序列化选项,并手动关联网络层与传输层(例如调用
SetNetworkLayerForChecksum)。
场景推荐
🚀 快速构建与发送自定义包
推荐库:goscapy
Builder API + SendRecv 一行搞定,免去繁琐的样板代码。
📊 PCAP 分析与离线包解析
推荐库:goscapy
纯 Go 实现 PCAP/pcapng 读写,结合 TCP 流重组和 p0f 指纹识别,无需 libpcap 依赖。
⚡ 轻量级诊断与扫描
推荐库:goscapy
极度适合编写 ping、traceroute 等自定义诊断工具,内置自动计算校验和能力。
⚡ 高性能实时嗅探
推荐库:gopacket
支持 afpacket/pfring 等零拷贝技术,适合高吞吐量的包捕获环境。
🔵 仅需标准 ICMP 通信
推荐库:x/net/icmp
如果不需要其他复杂协议或分层,官方的
x/net 是最轻量且无额外依赖的方案。
🔬 协议逆向与研究分析
推荐库:gopacket
支持 200+ 协议解码,最适合作为深度的协议逆向分析框架。
📦 零 CGO 依赖
推荐库:goscapy 或 x/net
goscapy 是纯 Go 实现,无 CGO 或 libpcap 运行时依赖;而 gopacket 在许多平台上依赖 libpcap C 库。
支持的协议
全面覆盖网络协议栈各层,核心协议默认加载,扩展协议按需引入。
| 层级 | 协议 |
|---|---|
| 链路层 | Ethernet、ARP、Dot1Q (VLAN)、LLDP、Dot11 (WiFi 802.11) |
| 网络层 | IPv4、IPv6(含扩展头部 Hop-by-Hop/Routing/Fragment/DestOpts)、ICMP、ICMPv6、NDP(RS/RA/NS/NA/Redirect)、OSPF、GRE |
| 传输层 | TCP、UDP |
| 隧道/封装 | VXLAN、ERSPAN |
| 应用层 | DNS、DHCP、HTTP、NTP、BGP、SNMP、TLS、QUIC、RADIUS、LDAP、Kerberos |
| IoT / 无线 | Bluetooth/BLE、Zigbee、LoRaWAN、VoIP (RTP/RTCP/SIP) |
| 监控 / 流量 | Netflow/IPFIX |
几秒即可开始
只需一条命令即可将 goscapy 添加到你的项目中。
# 安装最新版本 go get github.com/smallnest/goscapy
一行代码构建数据包
🔨 Builder API
// Ethernet + IP + ICMP Echo Request pkt, err := goscapy.NewEthernet(). SrcMAC("aa:bb:cc:dd:ee:ff"). DstMAC("ff:ff:ff:ff:ff:ff"). Over(goscapy.NewIP(). SrcIP("192.168.1.1"). DstIP("8.8.8.8")). Over(goscapy.NewICMP(). Type(8).Code(0)). Build()
⚡ 快捷函数
// 同样的数据包,一行搞定 pkt, err := goscapy.EtherIPICMP( "ff:ff:ff:ff:ff:ff", "8.8.8.8", 8, 0, )
🔬 解析原始字节
// 将原始字节解析为结构化数据包 raw := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ...} pkt, err := packet.Dissect(raw, packet.DissectEthernet) // 一行摘要 fmt.Println(pkt.Summary()) // "IP 192.168.1.1 > 8.8.8.8 / ICMP echo-request" // 详细分层展示 pkt.Show()