这就是Tcpcopy

TCPCOPY
1、 TCPCOPY简介
1.1、 什么是Tcpcopy
Tcpcopy是一个分布式压力测试工具,可以将线上流量拷贝到测试机器,实时模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现bug增加上线信心。
1.2、 Tcpcopy的工作原理
TCPCopy是一种请求复制(复制基于 TCP 的 packets)工具 ,通过复制在线数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从而为欺骗上层应用打下坚实基础。
1.3、 Tcpcopy的功能
1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug
2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线
3)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
4)流量放大功能,可以利用多种手段构造无限在线压力,满足中小网站压力测试要求
5)利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实
6)热备份
1.4、 Tcpcopy组成部分
1)TCPCopy Server(tcpcopy):部署在 测试服务器 ,用于接收复制的线上请求,github地址:https://github.com/session-replay-tools/tcpburn
2)TCPCopy Client(intercept):部署在 线上服务器 ,用于捕获线上请求,通过修改TCP/IP数据包,发送到TCPCopy Server进行稳定性测试,截获响应包,并传递响应包头信息给TCPCopy client,以完成TCP交互。
Github地址:https://github.com/session-replay-tools/intercept
1.5、 Tcpcopy工作过程
客户请求→线上服务器
→拷贝端口请求到TCP COPY,修改目的地址(测试服务器地址)和源地址
→测试服务器收到端口请求后,将按照修改后的源地址做路由转发给辅助服务器
→辅助服务器intercept,收到数据包,过滤相关信息
→发送请求状态给tcp copy,并关闭tcp
在这里插入图片描述

2、 TCPCOPY部署
2.1、 资源规划
主机名 ip地址 角色 内存 CPU 硬盘
线上服务器 172.26.73.127 Tcpcopy 4G 2核 40G
测试服务器 172.26.73.128 克隆生产环境 4G 2核 40G
辅助服务器 172.26.73.129 intercept 4G 2核 40G
2.2、 环境拓扑
所需所有软件包手动上传即可,无网环境亦可完成部署
系统版本:CentOS 7.4
Tcpcopy版本:1.0.0
intercept版本:1.0.0
2.3、 准备工作
2.3.1、 关闭防火墙和selinux
[root@SC ~]# systemctl stop firewalld
[root@SC ~]# systemctl disable firewalld
[root@SC~]# setenforce 0
[root@SC~]# sed -i s/enforcing/disabled/g /etc/selinux/config
另外两台主机同上
2.3.2、 时间同步
[root@SC ~]# yum -y install ntpdate
[root@SC ~]# ntpdate ntp1.aliyun.com
7 Jul 23:17:26 ntpdate[6074]: adjust time server 120.25.115.20 offset -0.008534 sec
另外两台主机同上
2.4、 线上机器安装Tcpcopy
2.4.3、 有网环境直接下载
[root@SC ~]# wget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gz
2.4.4、 无网环境上传并解压
[root@SC ~]# tar -zxvf 1.0.0.tar.gz -C/usr/local/
[root@SC ~]# cd /usr/local/tcpcopy-1.0.0/
2.4.5、 预编译
[root@SC tcpcopy-1.0.0]# ./configure --prefix=/opt/tcpcopy/
如遇到gcc报错安装依赖:yum -y install gcc gcc-c++ autoconf automake make
2.4.6、 编译并安装
[root@SC tcpcopy-1.0.0]# make && make install
2.5、 辅助机器安装intercept
[root@FZ ~]# yum -y install libpcap-devel
centos8执行会报错Error: Unable to find a match: libpcap
解决方法:wget https://vault.centos.org/centos/8/PowerTools/x86_64/os/Packages/libpcap-devel-1.9.1-5.el8.x86_64.rpm
rpm -ivh libpcap-devel-1.9.1-5.el8.x86_64.rpm --force –nodeps
2.5.7、 有网环境直接下载
[root@FZ ~]# wget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gz
[root@FZ ~]# tar -zxvf 1.0.0.tar.gz -C/usr/local/
[root@FZ ~]# cd /usr/local/intercept-1.0.0
2.5.8、 预编译
[root@FZ beta-ca intercept-1.0.0]# ./configure --prefix=/opt/tcpcopy/
如遇到gcc报错安装依赖:yum -y install gcc gcc-c++ autoconf automake make
2.5.9、 编译安装
[root@FZ beta-ca intercept-1.0.0]# make && make install
2.6、 部署
2.6.10、 线上主机测试主机开启http服务
为了简单期间,我们在线上和测试服务器上各启一个简单的http服务器,最简单的办法,不用apache和nginx,直接用python自带的模块。HTTP服务启动命令如下:
[root@SC Python-3.10.0]# python -m SimpleHTTPServer
[root@CS Python-3.10.0]# python -m SimpleHTTPServer
centos8执行:python3 -m http.server 8000
2.6.11、 辅助服务器开启intercep
(步骤不能错,没有intercep的话tcpcopy启动不起来)
[root@FZ ~]# /opt/tcpcopy/sbin/intercept -i eth0 -F ‘tcp and src port 8000’ -d
2.6.12、 线上服务器开启tcpcopy
[root@SC ~]# /opt/tcpcopy/sbin/tcpcopy -x 172.26.73.127:8000-172.26.73.128:8000 -s 172.26.73.129 -n 10 -d
注意:如果有防火墙,请再开启tcpcopy之前先加防火墙规则入下
-x, 是指本机8000端口的流量copy到192.168.88.66的8000端口
-s, 指定intercept机器的地址,tcpcopy要和intercept建立连接
-c 伪装地址,在把流量复制到测试服务器的时候,修改数据包的源地址为192.168.100.100,这样方便指定路由。也可以写成192.168.100.x,这样源地址就是指定网段中的地址了。
-n 流量放大倍数,如果不是压测目的就不用指定这个参数。
-d 以守护模式运行。
2.6.13、 测试服务器上开启路由
(切记辅助服务器要和测试服务器在一个子网里):
[root@CS ~]# route add -host 172.26.73.127 gw 172.26.73.129
3、 测试效果
3.1.1、 在另外一台机器上,向线上服务器发起请求,然后查看两个HTTP服务器的实时日志:
在这里插入图片描述

3.1.2、 线上服务器返回结果:
在这里插入图片描述

3.1.3、 测试服务器返回结果:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近有项目要做一个高性能网络服务器,去网络上搜到到的都是C++版本而且是英文或者简单的DEMO,所以自己动手写了C# 的DEMO。 网络上只写接收到的数据,没有说怎么处理缓冲区数据,本DEMO简单的介绍如何处理接收到的数据。简单易用,希望对大家有用. 1、在C#中,不用去面对完成端口的操作系统内核对象,Microsoft已经为我们提供了SocketAsyncEventArgs类,它封装了IOCP的使用。请参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1。 2、我的SocketAsyncEventArgsPool类使用List对象来存储对客户端来通信的SocketAsyncEventArgs对象,它相当于直接使用内核对象时的IoContext。我这样设计比用堆栈来实现的好处理是,我可以在SocketAsyncEventArgsPool池中找到任何一个与服务器连接的客户,主动向它发信息。而用堆栈来实现的话,要主动给客户发信息,则还要设计一个结构来存储已连接上服务器的客户。 3、对每一个客户端不管还发送还是接收,我使用同一个SocketAsyncEventArgs对象,对每一个客户端来说,通信是同步进行的,也就是说服务器高度保证同一个客户连接上要么在投递发送请求,并等待;或者是在投递接收请求,等待中。本例只做echo服务器,还未考虑由服务器主动向客户发送信息。 4、SocketAsyncEventArgs的UserToken被直接设定为被接受的客户端Socket。 5、没有使用BufferManager 类,因为我在初始化时给每一个SocketAsyncEventArgsPool中的对象分配一个缓冲区,发送时使用Arrary.Copy来进行字符拷贝,不去改变缓冲区的位置,只改变使用的长度,因此在下次投递接收请求时恢复缓冲区长度就可以了!如果要主动给客户发信息的话,可以new一个SocketAsyncEventArgs对象,或者在初始化中建立几个来专门用于主动发送信息,因为这种需求一般是进行信息群发,建立一个对象可以用于很多次信息发送,总体来看,这种花销不大,还减去了字符拷贝和消耗。 6、测试结果:(在我的笔记本上时行的,我的本本是T420 I7 8G内存) 100客户 100,000(十万次)不间断的发送接收数据(发送和接收之间没有Sleep,就一个一循环,不断的发送与接收) 耗时3004.6325 秒完成 总共 10,000,000 一千万次访问 平均每分完成 199,691.6 次发送与接收 平均每秒完成 3,328.2 次发送与接收 整个运行过程中,内存消耗在开始两三分种后就保持稳定不再增涨。 看了一下对每个客户端的延迟最多不超过2秒。
编辑推荐 “我在全国各地教授Cisc0联网课程.每本新的有名的数据通信的书我都听说了,因为我的学生们拿它们作为课程的参考书。Stevens的《TCP/IP详解卷1 协议》的到来如同一枚炸弹的爆炸……学生们被这本书所倾倒。我刚读完《TCP/IP详解卷2:实现》。如果说卷1像一枚炸弹,则卷2就是一枚重磅炸弹!” “在读完Stevens的《TCP/IP详解卷1协议》后,我认为很难再有另一本如此有用的书了,但卷2就是这样一本书。有些人可能会问,如果你不是一个专职的网络程序员,如何让这本书适合于你。因为在我最初使用UNIX的日子里,回答‘这到底是如何工作的?’的标准答案是‘看源代 码’。用这本书,你不仅能看源代码,还有一个最清晰的解释:它们是如何互相配合起来的。” 《TCP/IP详解》系列覆盖了TCP/IP的许多方面.提供了一个高效直观的方法来学习联网协议族。 《TCP/IP详解卷2:实现》详尽地说明了TCP/IP协议是如何实现的。目前还没有更多的 书——此卷是唯一一本书,本书全面讲解了来源于44BSD—Lite版本的事实上的标准实现.这个 实现是运行在世界上成千上万个系统上的TCP/IP实现的基础。 500个示例总共15000行代码都是真正正在使用的代码,《TCP/IP详解卷2:实现》使用一种举例说明的方法来帮助你精通TCP/IP的实现。你会掌握以下问题:插口API和协议族之间的关系,一个主机实现和一个路由器实现之间的区别等。另外本书覆盖了4.4BSD—Lite版本的最新特性,包括多播,长肥管道支持、窗口缩放、时间戳选项、防止序列号环绕及很多其他主题。 本书覆盖范围广,它基于一个当前正使用的标准,并且有详尽的示例,因此它是任何使用TCP/IP的人员一个不可缺少的资源。 内容简介 本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。本书适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 作者简介 Gary R.Wright 研究TCP/IP多年。他是Connix公司的董事长,这个公司的基地在康涅狄格州,它提供Internet接入和咨询服务。 W.Richard Stevens(1951-1999)是一位非常受人尊敬的专家,除了《TCP/IP详解》三卷本外,他还有其他两部最为畅销的作品;《UNIX环境高级编程》和《UNIX网络编程》(两卷本)。 目录 译者序 前言 第1章 概述  1.1 引言 1.2 源代码表示  1.2.1 将拥塞窗口设置为  1.2.2 印刷约定 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 网络实现概述 1.8 描述符 1.9 mbuf与输出处理 1.9.1 包含插口地址结构的mbuf 1.9.2 包含数据的mbuf 1.9.3 添力口IP和UDP首部 1.9.4 IP输出 1.9.5 以太网输出 1.9.6 UDP输出小结 1.10 输入处理 1.10.1 以太网输入 1.10.2 IP输入 1.10.3 UDP输入 1.10.4 进程输入 1.11 网络实现概述(续) 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第2章 mbuf:存储器缓存 2.1 引言 2.2 代码介绍 2.2.1 全局变量  2.2.2 统计  2.2.3 内核统计  2.3 mbuf的定义  2.4 mbuf结构  2.5 简单的mbuf宏和函数  2.5.1 m_get函数  2.5.2 MGET宏  2.5.3 m_retry函数  2.5.4 mbuf锁  2.6 m_devget和m_pullup函数  2.6.1 m_devget函数  2.6.2 mtod和dtom宏  2.6.3 m_pullup函数和连续的协议首部  2.6.4 m_pullup和IP的分片与重组  2.6.5 TCP重组避免调用m_pul lup  2.6.6 m_pullup使用总结  2.7 mbuf宏和函数的小结  2.8 Net/3联网数据结构小结  2.9 m_copy和簇引用计数  2.10 其他选择  2.11 小结 第3章 接口层 3.1 引言 3.2 代码介绍  3.2.1 全局变量   3.2.2 SNMP变量 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化  …… 第4章 接口:以太网 第5章 接口:SLIP和环回 第6章 IP编址 第7章 域和协议 第8章 IP:网际协议 第9章 IP选项处理 第10章 IP的分片与重装 第11章 ICMP:Internet控制报文协议 第12章 IP多播 第13章 ICMP:Internet组管理协议 第14章 IP多播选路 第15章 插口层 第16章 插口I/O 第17章 插口选项 第18章 Radix树路由表 第19章 选路请求和选路消息 第20章 选路插口 书摘插图 第1章 概述  1.1 引言   本章介绍伯克利(Berkeley)联网程序代码。开始我们先看一段源代码并介绍一些通篇要用的印刷约定。对各种不同代码版本的简单历史回顾让我们可以看到本书中的源代码处于什么位置。接下来介绍了两种主要的编程接口,它们在Unix与非Unix系统中用于编写TCP/IP协议。   然后我们介绍一个简单的用户程序,它发送一个UDP数据报给一个位于另一主机上的日期,时间服务器,服务器返回一个UDP数据报,其中包含服务器上日期和时间的ASCIl码字符串。这个进程发送的数据报经过所有的协议栈到达设备驱动器,来自服务器的应答从下向上经过所有协议栈到达这个进程。通过这个例子的这些细节介绍了很多核心数据结构和概念,这些数据结构和概念在后面的章节中还要详细说明。 本章的最后介绍了在本书中各源代码的组织,并显示了联网代码在整个组织中的位置。  1.2 源代码表示   1.2.1 将拥塞窗口设置为1   这是文件tcp—subr.c中的函数tcp—quench。这些源文件名引用4.4BSD-Lite发布的文件。4.4BSD在1.13节中讨论。每个非空白行都有编号。正文所描述的代码的起始和结束位置的行号记于行开始处,如本段所示。有时在段前有一个简短的描述性题头,对所描述的代码提供一个概述。   这些源代码同4.4BSD—Lite发行版一样,偶尔也包含一些错误,在遇到时我们会提出来并加以讨论,偶尔还包括一些原作者的编者评论。这些代码已通过了GNU缩进程序的运行,使它们从版面上看起来具有一致性。制表符的位置被设置成4个栏的界线使得这些行在一个页面中显示得很合适。在定义常量时,有些#ifdef语句和它们的对应语句#endif被删去(如:GATEWAY和MROUTING,因为我们假设系统被作为一个路由器或多播路由器)。   ……

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值