Tcpcopy两种架构原理详解 2
作者:网络转载 发布时间:[ 2014/6/16 14:45:56 ] 推荐标签:性能测试 Tcpcopy 测试技术
Tcpcopy传统架构在产品中实践遇到一些问题,要理解和解决问题深入了解Tcpcopy两种的架构的原理是必须的。当了解的越多发现它不仅仅是一个工具,而需要掌握不仅仅是简单的几个使用命令。
Tcpcopy传统架构与新架构大的区别:传统架构的intercept进程与测试服务器在同一台机器上,新架构的intercept进程从测试服务器上offload出来,单独部署在辅助服务器上。下面分别对两种结构的原理详细介绍。
传统架构
Tcpcopy
传统架构下,在线机器上面抓取请求数据包,默认采用raw socket input 接口。raw socket(原始套接字)可以接收本机网卡上的数据帧或者数据包,可监听网络的流量和分析。可以通过3种方式创建这类socket ,这里只详细讲tcpcopy使用的函数。Raw_socket的原理和其它使用方式,可参考 http://blog.sina.com.cn/s/blog_9599e95101010w2g.html
抓包函数:int sock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP)。 第一个参数表示协议簇, AF_INET 代表TCP/IP协议。第二个参数表示SOCKET类型。第三个参数表协议类型。该套接字可以接收协议类型为tcp(也可以设置其它协议类型)发往本机的IP数据包,不能收到非发往本机IP的数据包(IP软过滤会丢弃这些不是发往本机的数据包)。Tcpcopy利用Raw Socket只抓进来的包,而不能收到从本机发送出去的数据包这一特点,实现抓包的功能。系统在IP层会检查有没有进程创建这种类型的raw socket,如果有,这个包会被复制一份并发送到这个socket的缓冲区,Tcpcopy是通过这种方式来复制访问流量的。
在发包前,调用函数sock = socket(AF_INET, SOCK_RAW,IPPROTO_RAW),并且设置setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &n, sizeof(n)),这样IP数据包头部可以由用户自己编写(在不设置这个选项的情况下,IP协议会自动填充IP数据包的首部),Tcpcopy利用此函数将数据包的目的IP和端口改为测试机的IP和端口,如下:tcp_header->dest = remote_port;
ip_header->daddr = remote_ip;后调用sendto函数发送包到测试前端机:
send_len = sendto(sock,(char *)ip_header,tot_len,0,(struct sockaddr *)&toaddr,sizeof(toaddr));
Intercept
测试机上Intercept进程主要完成的是对复制请求的响应包进行处理。复制的请求到达测试机经应用程序处理后的响应包如果不经处理,将会返回给线上客户端。Tcpcopy传统架构的使用需要Iptable这一工具辅助实现对响应包的处理。
modprobe ip_queue
iptables -I OUTPUT -p tcp –sport 2080 -j QUEUE
以上iptable命令,表示OUTPUT链从2080端口发出的包在IP层会被匹配发往目标QUEUE,而QUEUE是由ip_queue模块实现(http://bbs.chinaunix.net/thread-1941806-1-1.shtml).因此在使用iptable命令前,内核需要使用modprobbe命令加载ip_queue模块。有了以上两个步骤, 所有匹配到iptable命令的报文将会调用IP Queue模块的相关函数。
Tcpcopy服务器端的Intercept进程用如下方式创建Netlink socket:
int sock = socket(AF_NETLINK,SOCK_RAW,NETLINK_FIREWALL);
Netlink详细介绍http://linux.chinaunix.net/techdoc/beginner/2008/11/12/1044982.shtml。
NETLINK_FIREWALL协议有三种消息类型:IPQM_MODE,IPQM_PACKET,IPQM_VERDICT.其中内核通过IPQM_PACKET消息将刚才截获的返回结果包发送到Inercept。Intercept给内核发送一个IPQM_VERDICT消息告诉内核对这个包的裁决结果(DROP,ACCEPT)。Tcpcopy通过这样的办法将测试机上应用返回的结果截获丢弃,并由Intercept返回一个Ip header。 Tcpcopy利用这个特点保留了一个允许访问的ip列表,因为默认情况下访问测试前端机上应用服务所得到的结果会在IP层被drop掉,造成在2080端口上无法访问应用服务。有了这个白名单,即使是设置了iptables规则,在白名单内的机器上也是可以正常访问测试前端机上的应用服务的。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11