tcpcopy简介
本文内容是整理自 王斌的博客(http://blog.csdn.net/wangbin579)和郑钧的博客(http://www.cnblogs.com/zhengyun_ustc),以便让自己可以有个宏观的认识。
Tcpcopy是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现bug,增加上线信心。
Tcpcopy是由网易技术部王斌(http://weibo.com/tcpcopy)在王波的工作基础上开发的,2011年9月开源的项目(https://github.com/session-replay-tools/tcpcopy https://github.com/wangbin579/tcpcopy ),目前最新版本 1.0.0 ,后续相关内容都是基于 1.0.0 的。
tcpcopy的工作原理
TCPCopy 是一种请求复制(复制基于 TCP 的 packets)工具 ,通过复制在线数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从而为欺骗上层应用打下坚实基础。
tcpcopy 不是基于应用层的复制,而是基于底层数据包的请求复制,这么做的好处是:可以做到无需穿透整个协议栈,路程最短的,可以从数据链路层抓请求包,从数据链路层发包,路程一般的,可以在IP层抓请求包,从IP层发出去,不管怎么走,只要不走TCP,对在线的影响就会小得多。
七层网络模型如下图:

tcpcopy 经历了三次架构调整,参考:http://blog.csdn.net/wangbin579/article/details/8949315
这三次架构的基本原理都一样,本质是利用在线数据包信息,模拟tcp客户端协议栈,欺骗测试服务器的上层应用服务。由于tcp交互是相互的,一般情况下需要知道测试服务器的响应数据包信息,才能利用在线请求数据包,构造出适合测试服务器的请求数据包,因此只要基于数据包的方式,无论怎么实现(除非是tcp协议改的面目全非),都需要返回响应包的相关信息。
三种架构的差别就在于在什么地方截获响应包。
具体这三种架构的差别请看上面文章,简单差别如下:
- 方案一:tcpcopy是从数据链路层(pcap接口)抓请求数据包,发包是从IP层发出去
- 方案二:tcpcopy默认从IP层抓包,从IP层发包
- 方案三:跟方案一一样,不过引入了独立的 intercept(assistant server)
后面的内容我们以第三套方案来展开。
tcpcopy 架构
tcpcopy运行需要intercept的支持,tcpcopy负责抓包和发包工作,而intercept负责截获应答包
它的数据流转和部署架构如下图:

tcpcopy代码下载地址:
git clone http://github.com/session-replay-tools/tcpcopy
configure:
./configure (默认raw socket方式抓包)
或者
./configure --pcap-capture (pcap方式抓包,在某些场景下,丢包率会高于raw socket方式抓包,这时候需要类似pf_ring的支持)
对于intercept:
代码下载地址:
git clone http://github.com/session-replay-tools/intercept
configure方式:
./configure
参考: http://blog.csdn.net/wangbin579/article/details/8950282
具体的生产环境和镜像环境数据传递流程图如下:

- TCPcopy 从数据链路层 copy 端口请求,然后更改目的 ip 和目的端口。
- 将修改过的数据包传送给数据链路层,并且保持 tcp 连接请求。
- 通过数据链路层从 online server 发送到 test server。
- 在数据链路层解封装后到达 nginx 响应的服务端口。
- 等用户请求的数据返回结果后,回包走数据链路层。
- 通过数据链路层将返回的结果从 test server 发送到 assistant server。注:test server 只有一条默认路由指向 assistant server。
- 数据到达 assistant server 后被 intercept 进程截获。
- 过滤相关信息将请求状态发送给 online server 的 tcpcopy,关闭 tcp 连接。
最新的1.0版本如何使用离线模式
https://github.com/session-replay-tools/tcpcopy/issues/215
对于tcpcopy,configure的时候加上--offline
--offline replay TCP streams from the pcap file
执行的时候,加上-i参数,用来指定pcap文件地址
对于intercept,不用变化
参考资料:
真刀真枪压测:基于TCPCopy的仿真压测方案
http://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html
如何利用pcap接口从数据链路层发包?
http://blog.csdn.net/wangbin579/article/details/10148247
利用tcpcopy引流做模拟在线测试
http://www.searchtb.com/2012/05/using-tcpcopy-to-simulate-traffic.html
tcpcopy简介的更多相关文章
- Tcpcopy简介与实战
码农博客 即将到期,现将博客中部分文章转载到博客园.本文发表与2012年,基于tcpcopy 0.6版本.转载时略有删减. Tcpcopy简介 TCPCopy是一种请求复制(所有基于tcp的packe ...
- [转]Tcpcopy简介与实战
Tcpcopy简介 TCPCopy是一种请求复制(所有基于tcp的packets)工具 ,其功能是复制在线数据包,修改TCP/IP头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从 ...
- 性能测试:tcpcopy
简介 TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去. 曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的 ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
随机推荐
- 201621123018《Java程序设计》第3周学习报告
Week03-面向对象入门 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系 ...
- AndroidStudio的一些快捷键的使用
1.返回上一次浏览快捷键的设置 https://blog.csdn.net/yingtian648/article/details/73277388 2.格式化代码的快捷键的设置 htt ...
- brew - 安装gradle
我安装完brew之后,马上开始安装gradle,但是shell总是卡在执行"brew update"这里,今天终于解决了,出现这样问题的原因是初次安装brew,它使用的源是国外的, ...
- 从负数开始 ,跟随别大人脚步 ---java
刚刚毕业 音乐生 目前在做 数据库测试和实施的相关工作 . 1个月前认识了别大人 , 打算边工作 ,边学习java 开启学习之路 . ..340多个G的java视频感觉解压完1T 足够我喝 ...
- web应用配置虚拟路径映射方式一配置不成功问题解决办法
配置过程图: 为了方便输入,先修改Tomcat的conf文件下的server.xml文件 默认端口修改为80 配置完成之后访问报404错误解决办法: 一.如果配置前已经开启了Tomcat服务器,配置完 ...
- Swift的Guard语句
与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行.与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码.你可以把guard近似的看做是Assert,但 ...
- 做了三年的菜鸟web前端的感悟
作为一名真正的菜鸟我想没有比我更加实在的了,三年之中,虽然做了一二三四五六七个项目,基本都是jQuery写的,但是还是一名不折不扣的菜鸟.这让我很尴尬啊,面对前端大量要学习的东西,真的是很头疼,技术更 ...
- photoshop切图介绍 && photoshop下载与破解
第一部分:界面设置 1.点击“文件-新建”(或者ctrl+n)打开一个新建对话框.名称可随意填写.“预设”设置为自定,“宽度”一般选择1920,“单位”选为像素.“高度”可选择为2000,“单位”选为 ...
- github的本地配置和项目创建
之前完成了github的安装和账号的注册,接下来要进行项目的创建和本地代码仓库的建立 1.创建项目 2.填写项目相关信息 注意:在给项目起名时,尽量起一些有意义的名字,否则会被管理员删除.因为服务器上 ...
- 安卓开发——ListView控件(初始化ListView、列表刷新、长按添加menu)
前言: ListView——列表,它作为一个非常重要的显示方式,不管是在Web中还是移动平台中,都是一个非常好的.不开或缺的展示信息的工具.在Android中,ListView控件接管了这一重担,在大 ...