TCPCopy是一种重放TCP流的工具,使用真实环境来测试互联网服务器上的应用程序。linux
1、描述:git
虽然真实的实时流量对于Internet服务器应用程序的测试很重要,可是因为生产环境中的状况很负责,测试环境很难彻底模拟线上环境。为了可以更真实的测试,咱们开发了一款线上流量复制工具-TCPCopy,它可使用线上真实的流量来对测试环境中的服务器进行测试。目前,TcpCopy技术已经在中国不少公司大量使用。github
2、使用场景:安全
1)分布式压力测试服务器
使用tcpcopy复制真实的数据来进行服务器的压力测试。有些bug只有在高并发的状况下才可以被发现。网络
2)仿真实验:session
被证实是稳定的新系统,其bug只能在真正使用的时候才能被发现并发
3)回归测试app
4)性能对比负载均衡
3、框架:
如Figure1中所示,tcpcopy包括两部分:tcpcopy(client)和intercept(server)(后文中统一将tcpcopy-client称为tcpcopy,将tcpcopy-server称为intercept),当tcpcopy运行在生产服务器并从生产服务器抓取请求时,inteceptor运行在辅助服务器上进行一些辅助工做,例如,响应tcpcopy。切记,测试应用程序应该运行在测试服务器上。
tcpcopy默认状况下使用socket输入技术在网络层抓取线上的数据包,作一些基本处理(包括:模拟TCP交互,网络控制,以及模拟传输层和应用层),使用socket输出技术发送数据包到测试服务器(如粉色箭头所示)
tcpcopy的测试服务器须要作的惟一操做是:设置适当的参数使响应信息发送到辅助服务器中(装intercept的服务器)(如绿色箭头所示)
intercept(默认)将响应信息传送给tcpcopy。经过抓取响应包,intercept提取响应头信息,并使用一个特殊的通道将响应头信息发送给tcpcopy(如紫色箭头所示)。当tcpcopy接受到响应头信息,它利用头信息修改在线打包器的属性并继续发送另外一个包。应当注意,来自测试服务器的响应被路由到应该充当黑洞的辅助服务器。
4、快速开始
一、获取intercept的两种方式:
1)Download the latest intercept release.
2)clone git://github.com/session-replay-tools/intercept.git
二、获取tcpcopy的两种方式
1)Download the latest tcpcopy release.
2)clone git://github.com/session-replay-tools/tcpcopy.git
5、获取安装在辅助服务器上的intercept
1)cd intercept
2)./configure
3)选择适当的配置参数
4)make
5)make install
6、intercept的配置参数
--single intercept运行在单机状况下
--with-pfring=PATH 将路径设置为PF_RING库源
--with-debug 以debug模式编译intercept(保存在日志文件中)
7、获取安装在生产服务器上的tcpcopy
1)cd tcpcopy
2)./configure
3)选择适当的配置参数
4)make
5)make install
8、tcpcopy的配置参数
--offline 从pcap文件重放TCP流
--pcap-capture 在数据链路层抓包(默认在网络层)
--pcap-send 在数据链路层发包(默认在网络层)
--with-pfring=PATH 将路径设置为PF_RING库源
--set-protocol-module=PATH 设置tcpcopy为外部协议模块工做
--single 若是intercept和tcpcopy都设置为单机模式,只有一个tcpcopy和一个intercept一块儿工做,将会得到更好的性能
--with-debug 以debug模式编译tcpcopy(保存在日志文件中)
9、运行tcpcopy
确保tcpcopy和intercept都配置为“./configure”
1)在运行应用程序的测试服务器上,正确设置路由命令以将响应数据包发送到辅助服务器上
例如:
假设61.135.233.161是辅助服务器的IP地址。 咱们设置如下route命令将全部对62.135.200.x的的响应路由到辅助服务器。
route add -net 62.135.200.0 netmask 255.255.255.0 gw 61.135.233.161
2)在运行intercept的辅助服务器上(须要root权限或者能使用socket通讯的权限)
./intercept -F <filter> -i <device,>
请注意,过滤器格式与pcap过滤器相同。
例如:./intercept -i eth0 -F 'tcp and src port 8080' -d
intercept将捕获基于TCP应用的响应,该应用监听在设备的8080端口上
3)生产服务器中(须要root权限或者能使用socket通讯的权限)
./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,>
[-c <ip range,>]
例如(假设61.135.233.160是目标服务器的IP地址):
./tcpcopy -x 80-61.135.233.160:8080 -s 61.135.233.161 -c 62.135.200.x
tcpcopy将抓取当前服务器上80端口的数据包,修改客户端IP地址为62.135.200.x,将这些数据包发送到ip地址为61.135.233.160,端口为8080的测试服务器,而且链接61.135.233.161,告诉intercept将响应数据包发送给它(tcpcopy)
虽然“-c”参数是可选的,但在此设置以便简化路由命令。
10、注意
1)只能在linux上测试(kernal 2.6 or above)
2)tcpcopy可能丢包,所以丢失请求
3)root权限或socket权限是必须的(例如 setcap CAP_NET_RAW = ep tcpcopy)
4)TCPCopy如今只支持客户端启动的链接
5)TCPCopy不支持使用SSL / TLS的服务器应用程序的重放
6)对于MySQL会话重放,请参考 https://github.com/session-replay-tools
7)不该该在辅助服务器上设置ip转发
8)请执行“./tcpcopy -h”或“./intercept -h”以获取更多详细信息
11、影响因素
有几个因素可能影响TCPCopy,将在如下部分中详细介绍:
1)抓包接口
tcpcopy默认使用套接字输入接口在网络层抓取生产服务器的数据包。在系统忙时,系统内核可能会丢包。
若是你配置tcpcopy的参数“--pcap-capture”,tcpcopy将在数据链路层抓包,也能够过滤内核中的数据包。在PF_RING资源中,当使用pcap捕获时,tcpcopy将丢失更少的数据包。
或许抓请求包的最好方式是经过交换机镜像入口的数据包,而后经过负载均衡器将巨大的流量划分到几台机器
2)发送接口
tcpcopy默认使用套接字输出接口在网络层发送数据包到测试服务器。若是你想避免IP链接跟踪问题或者得到更好的性能表现,配置tcpcopy的参数“--pcap-send”,设置适当的参数,tcpcopy能够在数据链路层发送数据包到测试服务器。
3)数据包在通往测试服务器的路上
当一个数据包被tcpcopy发送时,它可能在到达测试服务器前遭到不少挑战。因为数据包中的源IP地址依然是终端用户的IP地址(默认状况下)而不是生产服务器的IP地址,一些安全设备可能将该包削弱或当作伪造的包丢弃它。这种状况下,你在测试服务器使用tcp抓包工具,可能抓取不到指望的终端用户的数据包。要肯定你是否正处于这种状况下,你可使用同一网段下的测试服务器作个小测试。若是数据包能被成功的发送到同一网段的测试服务器,而不能发送到不一样网段的测试服务器,那么证实你的数据包在半路被丢弃了。
为了解决这个问题,咱们建议将tcpcopy、测试服务器、intercept部署在同一个网段内。在同一网段中有一个代理的帮助下还有另外一个解决方案,tcpcopy能够向代理发送数据包,而后代理会将相应的请求发送到另外一个网段中的测试服务器。
注意,在同一网段中的一个虚拟机上部署目标服务器应用程序可能面临上述问题
4)测试服务器的路由
测试服务器可能设置了反向过滤技术,能够检查包中源IP地址是不是被伪造的。若是是,则该包在网络层被丢弃。
若是在测试服务器中能用tcp抓包工具抓到包,可是测试服务器上的应用程序接收不到任何请求,你应该检查你是否有相似反向过滤技术的设置。若是设置了,你不得不移除相关的设置来让数据包经过网络层。
也有些其余缘由可能致使tcpcopy不能正常工做,例如防火墙设置问题。
5)测试服务器上的应用程序
测试服务器上的应用程序可能不能及时处理全部的请求。一方面,应用中的bug致使请求很长时间得不到响应;另外一方面,一些TCP层以上的协议只处理socket缓冲中的第一个请求,将剩下的请求留在socket缓冲中不处理。
6)辅助服务器的路由
你不该该设置ip转发为true或者辅助服务器不能做为一个黑洞工做。
12、历史版本
2014.09 v1.0 TCPCopy released
十3、错误和功能请求
有错误或功能请求?请打开一个新问题。 在打开任何问题以前,请搜索现有问题。
十4、版权和许可
版权全部2016根据BSD许可。