核心特性

从构建到嗅探 — 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。

🐍 Python Scapy ~3 行
python
from scapy.all import *

# 一行搞定:构建 + 发送 + 接收
ans = sr1(IP(dst="8.8.8.8") /
          ICMP(), timeout=3)
ans.show()
🦎 goscapy(本项目) ~3 行
go
// 构建 + 发送 + 接收第一个回复
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())
🔵 Go net(标准库) ~40+ 行
go
// 手动构造 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 添加到你的项目中。

bash
# 安装最新版本
go get github.com/smallnest/goscapy

一行代码构建数据包

🔨 Builder API

go
// 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()

⚡ 快捷函数

go
// 同样的数据包,一行搞定
pkt, err := goscapy.EtherIPICMP(
    "ff:ff:ff:ff:ff:ff",
    "8.8.8.8",
    8, 0,
)

🔬 解析原始字节

go
// 将原始字节解析为结构化数据包
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()