Tcplayer介绍

Tcplayer是最近写的一个流量抓取、解析、放大、重放工具。


背景

通常真实流量相比手工构造的请求来说,更有利于测试。真实流量的回放大体上有以下三种方式:

  • 应用层

这种方式通常是在服务中耦合拷贝请求的代码。由于直接工作在应用层,截下来的流量是一个个完整的请求,所以其支持场景最多,实现也相对简单,但是需要耦合其他代码,也会给服务程序带来资源消耗。

  • 网络层

这种方式通常是抓取原始网络包,解析出IP报文,修改报文的目的IP和端口,伪造与测试机的TCP会话,回放到测试机。其优点是不需要处理传输层的TCP包排序,也不需要理解上层应用层的请求格式,但其缺点是配置相对复杂,且难以支持长连接。如果在长连接已经建立的情况下抓包回放,由于测试机并未经过任何SYN-SYN/ACK-ACK的请求建立过程,所以所有请求的TCP PUSH包都会被测试机RST丢掉。通常后端RPC服务都是长连接,所以这是一个比较大的问题。这里有一个工作在这一层的开源工具tcpcopy

  • 传输层

为了解决外部代码依赖以及长连接的问题,tcplayer基于TCP传输层,按照应用层请求格式解析出请求并重放。这种方式可以抓取到已经建立的长连接的请求,并且服务不需要耦合其他代码,但同时引入了解析和匹配应用层协议的复杂性。


Tcplayer

Tcplayer主要包含以下几个步骤:

  • libpcap抓取实时流量
  • tcp包重排序
  • 对于每一个tcp会话(flow),解析tcp包,尽量匹配应用层协议
  • 放大应用层请求,并与测试服务建立连接回放

目前支持的协议:

  • HTTP 1.x 短连接
  • Thrift strict mode binary protocol
  • GRPC部分支持
    • 这里由于GRPC基于HTTP2,而HTTP2的基本单元Frame没有固定的协议字段,所以无法匹配,导致无法解析到正确的HTTP2请求…

要给tcplayer添加其他自己定义的应用层协议很容易,可以参考代码factory/thrift

comments powered by Disqus