bcap/README.md
2026-03-24 23:39:55 +08:00

219 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# bcap
`bcap` 是一个轻量的 Go 报文解析库,重点提供两类能力:
- 统一提取报文事实
- 基于连续报文输出轻量协议提示
它适合作为抓包工具、离线诊断工具、CLI/TUI 浏览器的底层解析层,但并不试图替代完整协议栈、深度重组引擎或最终用户报告系统。
## 1. 核心定位
`bcap` 主包当前围绕 3 个对象展开:
- `Decoder`
- 无状态,只负责单包解码,输出 `Packet`
- `Tracker`
- 有状态,只负责基于连续报文做轻量跟踪,输出 `Observation`
- `Analyzer`
- `Decoder + Tracker` 的组合入口,适合大多数直接接入场景
分工可以直接理解为:
- `Decoder` 负责单包事实
- `Tracker` 负责跨包提示
- `Analyzer` 负责把两者串起来
## 2. 适用场景
`bcap` 主要适合:
- 在线抓包后的统一元数据提取
- 离线 pcap 遍历分析
- TCP/UDP/ICMP/ARP 的统一识别
- TCP 关键行为提示例如握手、挥手、重传、keepalive、RST
`bcap` 不直接负责:
- 诊断结论生成
- CLI/TUI 文案
- Excel / JSON / 报告拼装
- 动作编排与干预逻辑
- 工具侧业务状态缓存
## 3. 快速开始
安装:
```bash
go get b612.me/bcap
```
最常见的接入方式是直接使用 `Analyzer`
```go
package main
import (
"fmt"
"b612.me/bcap"
"github.com/gopacket/gopacket"
)
func consume(packet gopacket.Packet) error {
analyzer := bcap.NewAnalyzer()
defer analyzer.Stop()
obs, err := analyzer.ObservePacket(packet)
if err != nil {
return err
}
fmt.Println("flow:", obs.Flow.Stable)
fmt.Println("protocol:", obs.Packet.Transport.Kind)
fmt.Println("summary:", obs.Hints.Summary.Code)
if obs.Hints.TCP != nil {
fmt.Println("tcp event:", obs.Hints.TCP.Event)
}
return nil
}
```
如果你需要自行控制“解码”和“跟踪”两个阶段,也可以拆开使用:
```go
decoder := bcap.NewDecoder()
tracker := bcap.NewTracker()
defer tracker.Stop()
decoded, err := decoder.Decode(packet)
if err != nil {
return err
}
obs, err := tracker.Observe(decoded)
if err != nil {
return err
}
```
## 4. 支持范围
当前主包支持的主要识别范围:
- 链路层
- `Ethernet`
- `Linux SLL`
- `Linux SLL2`
- 网络层
- `IPv4`
- `IPv6`
- `ARP`
- 传输层 / 协议层
- `TCP`
- `UDP`
- `ICMPv4`
- `ICMPv6`
- `Unknown`
当前 TCP 轻量提示重点覆盖:
- 三次握手
- 四次挥手
- 普通 ACK
- 重传
- keepalive
- keepalive response
- RST
- ECE / CWR
## 5. 如何选接口
优先级建议:
- 大多数工具直接用 `Analyzer`
- 只要报文事实时用 `Decoder`
- 你已经有自己的输入管线,只缺轻量状态跟踪时用 `Tracker`
如果没有特殊理由,优先选择 `Analyzer`,接入成本最低。
## 6. 包结构
### 6.1 主包 `b612.me/bcap`
负责:
- 统一事实模型
- 统一 flow 模型
- 统一 hint 模型
- 轻量 TCP 跟踪
### 6.2 子包 `libpcap`
负责:
- 基于 pcap 的抓包输入适配
### 6.3 子包 `nfq`
负责:
- 基于 NFQUEUE 的输入适配
通常的组合方式是:
- `libpcap` / `nfq` 提供输入
- `bcap.Analyzer` 负责解析与提示
- 上层工具负责展示、统计、导出和策略
## 7. 文档导航
如果你只是要快速接入,看本 README 基本够用。
如果你要看完整 API、模型字段、配置项和迁移说明请继续阅读
- [`doc/api.md`](./doc/api.md)
如果你要看当前架构思路和设计边界,请看:
- [`doc/dev.md`](./doc/dev.md)
## 8. 迁移提示
`bcap` 主包已经移除了旧的胖接口,旧的以下模型不再推荐使用,并且主体已经删除:
- `Packets`
- `PacketInfo`
- `ParsePacket`
- `NewPackets`
- `NewPacketsWithConfig`
- `LegacyPacketInfoFromObservation`
- `GetStateDescription`
- `PrintStats`
- `ExportConnectionsToJSON`
新的迁移方向是:
- 单包事实解析改用 `Decoder`
- 报文观察结果改用 `Observation`
- TCP 轻量状态识别改用 `Tracker`
- 大多数场景直接改用 `Analyzer`
## 9. 测试
开发或改动后,至少建议执行:
```bash
go test ./...
```
## 10. License
本项目采用 Apache License 2.0。
完整协议文本见:
- [`LICENSE`](./LICENSE)