玩轉tcpcopy在線壓力測試--原理、使用(上)

tcpcopy 是一個分佈式在線壓力測試工具,可以將線上流量拷貝到測試機器,實時的模擬線上環境,達到在程序不上線的情況下實時承擔線上流量的效果,儘早發現 bug,增加上線信心。

tcpcopy 的優勢在於其實時性及真實性,除了少量的丟包,完全拷貝線上流量到測試機器,真實的模擬線上流量的變化規律。

1、實驗

我們在docker環境實驗TCPCopy:

首先編譯intercept。

./configure --prefix=/etc/softs/intercept
make && make install

然後編譯tcpcopy(採用離線回放)。

./configure --prefix=/etc/softs/tcpcopy
make && make install

這樣相關程序都編譯完成。

進入運行階段:

先運行intercept,如下圖,其中-F參數設置了對響應包的過濾條件。

玩轉tcpcopy在線壓力測試--原理、使用(上)

接著在測試服務器設置路由,其中host是客戶端的IP地址。

玩轉tcpcopy在線壓力測試--原理、使用(上)

61.135.255.86是從下面抓包文件裡面提取的,第一個數據包顯示了客戶端61.135.255.86訪問xxx.xxx.176.161的18081服務。

這裡我們利用pcap文件作為離線回放的數據源。

下圖展示了tcpcopy是如何運行的。

玩轉tcpcopy在線壓力測試--原理、使用(上)

運行tcpcopy以後,從測試服務器端應用層日誌來看,已經有請求過來。

玩轉tcpcopy在線壓力測試--原理、使用(上)

更加實用的方式是通過抓包來確定是否有流量過來,例如下圖:

玩轉tcpcopy在線壓力測試--原理、使用(上)

在測試服務器,利用netstat命令可以看到8080服務已經有ESTABLISHED連接,客戶端IP地址都是61.135.255.86。

玩轉tcpcopy在線壓力測試--原理、使用(上)

tcpcopy所在的客戶端,卻沒有相應連接存在,這是因為tcpcopy發送數據包(包括請求)默認是從IP層發送,避開了內核TCP層。

玩轉tcpcopy在線壓力測試--原理、使用(上)

2、TCPCopy概述

TCPCopy是基於底層的請求複製工具。通過底層抓包(或者從pcap文件獲取數據包),模擬上層應用交互,複製TCP流量到測試系統,從而達到在線流量測試的目的。

TCPCopy的精華在於如何從TCP數據流中模擬出客戶端的交互行為和如何成功把應用請求複製給測試系統。

TCPCopy技術主要涉及到TCP、服務器領域知識、偽造技術和如何模擬上層應用交互行為。

3、TCPCopy原理圖

下圖是傳統的TCP三次握手交互圖。

玩轉tcpcopy在線壓力測試--原理、使用(上)

下圖是TCPCopy模擬的TCP三次握手交互圖。

玩轉tcpcopy在線壓力測試--原理、使用(上)

對於Server端,三次握手數據包沒有差別,所不同的是第二次握手數據包會路由給另外一臺機器(intercept所在機器),而不是直接返回到tcpcopy機器。

這樣做的原因如下:

  1. tcpcopy發送的數據包中的客戶端IP地址,並不一定是tcpcopy機器所在的IP地址
  2. 減輕tcpcopy處理壓力,tcpcopy只需處理客戶端方向的流量
  3. 減輕tcpcopy機器壓力,降低響應包對在線的影響
  4. 響應數據包路由給intercept所在的機器,可以提升捕獲響應包的能力
  5. intercept可以合併響應包中的有用信息,例如只提取TCP/IP header信息,一起發送給
    tcpcopy,這樣提升了信息傳遞的效率
  6. 這種分離給分佈式tcpcopy提供了可能,m個tcpcopy,n個intercept組合完成超大併發流量複製。

tcpcopy,主要功能是監聽某一個應用的數據包,利用intercept返回的數據包信息(第一次握手數據包不需要intercept返回信息),修改源數據包內容,發送給Server機器。

3.1 在線回放

TCPCopy複製在線流量的三次握手交互過程具體參考下圖:

玩轉tcpcopy在線壓力測試--原理、使用(上)

圖中tcpcopy捕獲到在線的第一次握手數據包,修改目的地址,直接從IP層發送第一次握手數據包。由於沒有經過tcpcopy機器所在的TCP層,所以並不佔用寶貴的TCP資源。TCPCopy一般會要求在測試服務器端設置相應的路由,目的是讓響應包路由給輔助服務器。測試服務器端接收到第一次握手數據包,檢測合法,併發送第二次握手數據包。

第二次握手數據包到達輔助服務器端的數據鏈路層,這時intercept進程會去捕獲第二次握手數據包,並通過專用的通道(類似IP tunnel)發送給tcpcopy。輔助服務器需要具備流量黑洞功能(即不能具備路由功能),所以第二次握手數據包會在輔助服務器的IP層結束自己的旅程。

tcpcopy接收到intercept返回的第二次握手數據包信息,提取出有用的信息,並等待在線第三次握手數據包的到來。

下圖

tcpcopy捕獲到了在線第三次握手數據包,修改第三次握手數據包的ack sequence序列號和目的地址,再次通過IP層發包接口發送出去。第三次握手數據包到達測試服務器後,相應的連接就建立成功。

玩轉tcpcopy在線壓力測試--原理、使用(上)

3.2 離線回放

離線回放和在線回放的差別在於tcpcopy抓包接口,離線回放是從pcap獲取數據包,而在線回放是通過IP層提供的raw socket抓包接口。

由於離線回放並不需要在線服務,因此intercepttcpcopy可以運行在同一臺服務器。

下面展示了離線回放的情況。圖中tcpcopy從pcap文件獲取第一次握手數據包,併發送給IP層。第一次握手數據包到達測試服務器後,測試服務器的TCP回覆第二次握手數據包,並路由給測試機器。

玩轉tcpcopy在線壓力測試--原理、使用(上)

intercept截獲到第二次握手數據包後,發送給tcpcopy

tcpcopy從pcap文件獲取第三次握手數據包,並利用第二次握手數據包中的sequence序列號來修改第三次握手數據包中的內容,通過IP層發包接口發送給測試服務器。

玩轉tcpcopy在線壓力測試--原理、使用(上)

第三次握手數據包到達測試服務器後,相應的連接就建立成功。


分享到:


相關文章: