feat: gotls Upload sequence; Fix the issue where disorderly arrival c…#978
Conversation
|
目前这PR中,只看到内核代码增加了seq标识,但没有看到用户空间代码的排序使用。 另外,我原来的想法是,通过捕获的pcapng包+ keylog模式,做实时的网络包解密,这样,就可以规避这个问题了。 而且,目前的问题很依赖PID信息,用PID关联五元组。 很多时候无法还原准确的五元组信息。 |
|
d9640c4 to
95e380a
Compare
…auses the file content to be uninterpretable
663f78e to
309aa02
Compare
|
PR已更新 |
|
对于golang来说,keylog的捕获,可以HOOK func (c *Config) writeKeyLog(label string, clientRandom, secret []byte) error {
if c.KeyLogWriter == nil {
return nil
}
logLine := fmt.Appendf(nil, "%s %x %x\n", label, clientRandom, secret)
writerMutex.Lock()
_, err := c.KeyLogWriter.Write(logLine)
writerMutex.Unlock()
return err
} |
|
额外:handler推荐内置Write(GetData())输出原始二进制数据,方便组包 |
2c6d3fa to
86dfe17
Compare
|
请查收一下邮件,😃 |
cfc4n
left a comment
There was a problem hiding this comment.
改动量有点大,周末我详细看下。
楼主思维活跃,逻辑清晰,Linux内核、go底层经验丰富,强。
|
以下问题虽与本PR无直接关联,但在 review 过程中被提及,比较关心: “通过捕获的pcapng包+ keylog模式,做实时的网络包解密”: “目前的问题很依赖PID信息,用PID关联五元组。 很多时候无法还原准确的五元组信息”: |
|
性能问题: #829 未解决,你提到的 ringbuf 应该会有很大改善。不过,依旧面临低版本内核的兼容问题。 以下是 一、五元组为
|
| 问题类型 | 代表 Issue | 根本原因 |
|---|---|---|
| 连接销毁竞态 → tuple 为 0 | #739 | DestroyConn 事件先于数据事件被消费,connMap 已清除 |
| 内核 <5.2 不支持 GlobalVar | #908 | 内核版本过低,kretprobe/GlobalVar 不可用 |
| BIO 自定义导致 fd=0 | #822, #933 | 应用自定义 BIO,bio->num 中不写入 socket fd |
| IPv6 不支持 | #724 | eBPF hook 只处理 AF_INET,跳过 AF_INET6 |
| Android BoringSSL Tuple 未实现 | #774 | Android BoringSSL 路径的 Tuple 字段当时未实现 |
| --pid 过滤不准确 | #981 | connect 事件与 SSL 数据事件 PID 关联竞态 |



为了解决 多 CPU perf 读取乱序 导致的 HTTP/2 字节流拼接错误。

乱序的根本原因在于观测路径而非业务数据流:BPF 程序在每次
read()完成时,通过bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, ...)将明文副本写入当前 CPU 对应的 Perf ring buffer。所谓"不同 CPU",指的是多次 hook 触发时,BPF 程序可能在不同 CPU 核心上执行,导致样本被写入各自 CPU 对应的 Perf ring buffer 中,形成多生产者(多 CPU 各自 ring)单消费者(用户态合并读取)模型;合并时无法保证全局顺序等于探针触发顺序,在 HTTP/2 二进制帧与多路复用场景下(如文件上传)表现尤为明显。文档:
[ecapture] eBPF hook gotls 收包乱序根因分析
[eCapture] GoTLS Perf 事件有序下发
[ecapture] gotls:三种模式实现说明与上层应用职责
reorder可通过配置开启,lag=10ms 测试对比:
单元测试已通过:
