thrift copy

话说, 之前在研究比较新f q 软件 kcptun 的时候 顺便看了下 finalspeed 的源码,然后发现他用了个 pcap4j 的依赖
他封装了libpcap,可以像使用 tcpdump 一样得到 raw package,finalspeed 就是用它 监听自己的网卡发的包,实现了借发重包减少丢包的功能。

然后联合以前做thrift压测工具时(ps, 最终决定用gevent + 自定义数据做),看到的美团的压测工具 我就想,既然他可以这么做,那我加一个filter,不就可以 filter 自己要的请求包,然后可以无侵入的获取数据了吗?

于是三下五除二 写了个工具, 可以嗅探指定网卡的thrift协议,将并thrift 协议转发到指定的机器。

但是,写完后,想到个问题,一般这种rpc协议,设计都是差不多的,出于安全的原因(避免oom)/内存友好, 默认都用frame的protocol,以及用 magic 来校验是不是自己,那么是不是可以有一个更通用的方式可以弄, 或者已经有了 ?

为了确认下于是看了下最近比较火的 grpc,以及之前看过的tchannel

由于grpc 的最外面的协议是http2, 所以我直接看http2 了。

http2 的 frame 设计: http://httpwg.org/specs/rfc7540.html#FrameHeader

tchannel 的 frame 设计:https://github.com/uber/tchannel/blob/master/docs/protocol.md#framing

看下来感觉都是差不多的,然后找类似 net package copy 的工具的时候发现了 很早以前网易开源的 tcpcopy
由于他也是基于 libpcap 的,并且 libpcap 支持 BPF expression, 所以其实我只要写一个 n个 && 的BPF filter 配合 tcpcopy 就行了, orz。

可能是因为网上相关资料较少,貌似很少有人这么用,网上搜到的淘宝的搜索团队在用,不过搜索的业务基本都是 只读 的所以最多只要配置一个 ip port 的filter就行了。

不过由于现在我们自己业务由于环境原因, 以及历史原因,即使拿了线上的数据也不太好用。所以就不深入弄了。

以后应该可以弄一个 BPF generater 配合 tcpcopy 导指定的协议包的工具。

avatar

lelouchcr's blog