新架构

  Tcpcopy
  新架构的Tcpcopy进程的实现与旧架构相比差别不大,在线机器上面抓请求数据包默认采用raw socket input 接口,增加了采用pcap 接口抓包的功能。Libpcap是Packet Capture Libray的英文缩写,即数据包捕获函数库。该库提供的C函数接口用于捕捉经过指定网络接口的数据包,该接口应该是被设为混杂模式。常用的抓包软件Tcpdump是在Libpcap的基础上开发而成的。Libpcap提供的接口函数实现和封装了与数据包截获有关的过程,工作原理不赘述,详细可参考http://www.cnblogs.com/coder2012/archive/2013/04/13/3012390.html。根据使用手册上的描述,新架构一般推荐使用Pcap抓包,安装命令如下:
  ./configure --enable-advanced --enable-pcap
  make
  make install
  新架构和传统架构一样,默认使用Raw socket output 接口发包,采用Raw Socket命令发包命令如下: ./tcpcopy -x 80-测试机IP:测试机应用端口 -s 服务服务器IP -i eth0 。其中-i参数指定pcap从哪个网卡抓取请求包。
  此外,新架构还支持通过pcap_inject(编译时候增加--enable-dlinject)来发包。使用pcap_inject发包有两点好处:1.可以避开在线机器在IP层的防火墙设置,因为tcpcopy进程复制过来的包源IP还是线上客户端的IP,在线机器上可能会被直接扔掉,在不能改变防火墙设置的情况下,采用pacp_inject直接从数据链路层发包,可以避开IP层复杂的防火墙设置;2.在压力比较大的场合推荐使用pcap_inject 来发包,根据测试结果来看合理利用pcap_inject 来发包可提高30%的性能(详见使用手册),但是pcap_inject发包需要知道数据包从在线机器发出下一跳的网卡地址,这需要使用tcpdump工具抓包获取.
  Pcap发包命令:sudo ./tcpcopy -x 在线端口号@在线机器的出口网卡地址-测试机器的IP地址:测试机器的端口@下一跳网卡地址 -s 运行intercept的机器IP地址 -o 出口网卡设备 -i 抓包网卡设备。
  测试服务器
  新架构测试机部署上,需要更改其路由设置,目的是将测试应用程序的响应包路由到辅助测试服务器。以外网应用为例如下:
  删除测试服务器的外网IP的默认路由
  route del default gw 原外网网关IP
  添加辅助测试服务器IP作为测试服务器的默认路由
  route add default gw 辅助服务器的外网IP
  这里的意思是说,在测试服务器返回给客户端的响应走默认网关-辅助服务器的外网IP,但这台机器其实并没有开启路由模式,所以这些响应包到了辅助测试机后,会在ip层被drop掉,这样internet进程可以在辅助测试服务器的数据链路层抓到这些响应包
  辅助服务器
  辅助服务器主要是用于捕获测试服务器转发过来的响应包,辅助服务器要确保没有开启路由模式cat /proc/sys/net/ipv4/ip_forward,为0表示没有开启。辅助服务器上采用的也是pcap抓取响应包,安装命令如下:
  ./configure --enable-advanced --enable-pcap
  make
  make install
  辅助服务器intercept进程通过pcap抓取测试机应用程序的响应包,将头部抽取后发送给线上的tcpcopy进程,完成一次请求的复制。
  小结:
  Tcpcopy两种架构都是通过巧妙地应用一些网络工具和包实现其复制转发的功能,传统架构rawsocket+iptable+netlink,新架构pacp+route,通过对其深入的了解也拓展了许多网络知识,在之后遇到一些问题也可以比较清楚明白的去解释和分析。
  对比两种架构的原理和实践中遇到的问题可以得出,传统架构更容易实施,但是由于它借助于linux的IP_QUEUE模块,其性能完全依赖于系统,在压力较大时性能表现较差;而新架构将测试机和辅助服务器分离开来,性能有所提升,但是在部署实施受硬件条件制约,比如测试机和辅助测试服务器需在一个网段等,同时需要用到的网络知识更多。在使用时,结合条件选择合适的架构。