玩转tcpcopy在线压力测试--原理、使用(上)

tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。

tcpcopy 的优势在于其实时性及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。

1、实验

我们在docker环境实验TCPCopy:

首先编译intercept。

./configure --prefix=/etc/softs/intercept
make && make install

然后编译tcpcopy(采用离线回放)。

./configure --prefix=/etc/softs/tcpcopy
make && make install

这样相关程序都编译完成。

进入运行阶段:

先运行intercept,如下图,其中-F参数设置了对响应包的过滤条件。

玩转tcpcopy在线压力测试--原理、使用(上)

接着在测试服务器设置路由,其中host是客户端的IP地址。

玩转tcpcopy在线压力测试--原理、使用(上)

61.135.255.86是从下面抓包文件里面提取的,第一个数据包显示了客户端61.135.255.86访问xxx.xxx.176.161的18081服务。

这里我们利用pcap文件作为离线回放的数据源。

下图展示了tcpcopy是如何运行的。

玩转tcpcopy在线压力测试--原理、使用(上)

运行tcpcopy以后,从测试服务器端应用层日志来看,已经有请求过来。

玩转tcpcopy在线压力测试--原理、使用(上)

更加实用的方式是通过抓包来确定是否有流量过来,例如下图:

玩转tcpcopy在线压力测试--原理、使用(上)

在测试服务器,利用netstat命令可以看到8080服务已经有ESTABLISHED连接,客户端IP地址都是61.135.255.86。

玩转tcpcopy在线压力测试--原理、使用(上)

tcpcopy所在的客户端,却没有相应连接存在,这是因为tcpcopy发送数据包(包括请求)默认是从IP层发送,避开了内核TCP层。

玩转tcpcopy在线压力测试--原理、使用(上)

2、TCPCopy概述

TCPCopy是基于底层的请求复制工具。通过底层抓包(或者从pcap文件获取数据包),模拟上层应用交互,复制TCP流量到测试系统,从而达到在线流量测试的目的。

TCPCopy的精华在于如何从TCP数据流中模拟出客户端的交互行为和如何成功把应用请求复制给测试系统。

TCPCopy技术主要涉及到TCP、服务器领域知识、伪造技术和如何模拟上层应用交互行为。

3、TCPCopy原理图

下图是传统的TCP三次握手交互图。

玩转tcpcopy在线压力测试--原理、使用(上)

下图是TCPCopy模拟的TCP三次握手交互图。

玩转tcpcopy在线压力测试--原理、使用(上)

对于Server端,三次握手数据包没有差别,所不同的是第二次握手数据包会路由给另外一台机器(intercept所在机器),而不是直接返回到tcpcopy机器。

这样做的原因如下:

  1. tcpcopy发送的数据包中的客户端IP地址,并不一定是tcpcopy机器所在的IP地址
  2. 减轻tcpcopy处理压力,tcpcopy只需处理客户端方向的流量
  3. 减轻tcpcopy机器压力,降低响应包对在线的影响
  4. 响应数据包路由给intercept所在的机器,可以提升捕获响应包的能力
  5. intercept可以合并响应包中的有用信息,例如只提取TCP/IP header信息,一起发送给
    tcpcopy,这样提升了信息传递的效率
  6. 这种分离给分布式tcpcopy提供了可能,m个tcpcopy,n个intercept组合完成超大并发流量复制。

tcpcopy,主要功能是监听某一个应用的数据包,利用intercept返回的数据包信息(第一次握手数据包不需要intercept返回信息),修改源数据包内容,发送给Server机器。

3.1 在线回放

TCPCopy复制在线流量的三次握手交互过程具体参考下图:

玩转tcpcopy在线压力测试--原理、使用(上)

图中tcpcopy捕获到在线的第一次握手数据包,修改目的地址,直接从IP层发送第一次握手数据包。由于没有经过tcpcopy机器所在的TCP层,所以并不占用宝贵的TCP资源。TCPCopy一般会要求在测试服务器端设置相应的路由,目的是让响应包路由给辅助服务器。测试服务器端接收到第一次握手数据包,检测合法,并发送第二次握手数据包。

第二次握手数据包到达辅助服务器端的数据链路层,这时intercept进程会去捕获第二次握手数据包,并通过专用的通道(类似IP tunnel)发送给tcpcopy。辅助服务器需要具备流量黑洞功能(即不能具备路由功能),所以第二次握手数据包会在辅助服务器的IP层结束自己的旅程。

tcpcopy接收到intercept返回的第二次握手数据包信息,提取出有用的信息,并等待在线第三次握手数据包的到来。

下图

tcpcopy捕获到了在线第三次握手数据包,修改第三次握手数据包的ack sequence序列号和目的地址,再次通过IP层发包接口发送出去。第三次握手数据包到达测试服务器后,相应的连接就建立成功。

玩转tcpcopy在线压力测试--原理、使用(上)

3.2 离线回放

离线回放和在线回放的差别在于tcpcopy抓包接口,离线回放是从pcap获取数据包,而在线回放是通过IP层提供的raw socket抓包接口。

由于离线回放并不需要在线服务,因此intercepttcpcopy可以运行在同一台服务器。

下面展示了离线回放的情况。图中tcpcopy从pcap文件获取第一次握手数据包,并发送给IP层。第一次握手数据包到达测试服务器后,测试服务器的TCP回复第二次握手数据包,并路由给测试机器。

玩转tcpcopy在线压力测试--原理、使用(上)

intercept截获到第二次握手数据包后,发送给tcpcopy

tcpcopy从pcap文件获取第三次握手数据包,并利用第二次握手数据包中的sequence序列号来修改第三次握手数据包中的内容,通过IP层发包接口发送给测试服务器。

玩转tcpcopy在线压力测试--原理、使用(上)

第三次握手数据包到达测试服务器后,相应的连接就建立成功。


分享到:


相關文章: