tcpcopy 是一個分散式線上壓力測試工具,可以將線上流量拷貝到測試機器,實時的模擬線上環境,達到在程式不上線的情況下實時承擔線上流量的效果,儘早發現 bug,增加上線信心。
tcpcopy 的優勢在於其實時性及真實性,除了少量的丟包,完全拷貝線上流量到測試機器,真實的模擬線上流量的變化規律。
1、實驗我們在docker環境實驗TCPCopy:
首先編譯intercept。
./configure --prefix=/etc/softs/interceptmake && make install
然後編譯tcpcopy(採用離線回放)。
./configure --prefix=/etc/softs/tcpcopymake && make install
這樣相關程式都編譯完成。
進入執行階段:
先執行intercept,如下圖,其中-F引數設定了對響應包的過濾條件。
接著在測試伺服器設定路由,其中host是客戶端的IP地址。
61.135.255.86是從下面抓包檔案裡面提取的,第一個資料包顯示了客戶端61.135.255.86訪問xxx.xxx.176.161的18081服務。
這裡我們利用pcap檔案作為離線回放的資料來源。
下圖展示了tcpcopy是如何執行的。
執行tcpcopy以後,從測試伺服器端應用層日誌來看,已經有請求過來。
更加實用的方式是通過抓包來確定是否有流量過來,例如下圖:
在測試伺服器,利用netstat命令可以看到8080服務已經有ESTABLISHED連線,客戶端IP地址都是61.135.255.86。
tcpcopy所在的客戶端,卻沒有相應連線存在,這是因為tcpcopy傳送資料包(包括請求)預設是從IP層傳送,避開了核心TCP層。
2、TCPCopy概述TCPCopy是基於底層的請求複製工具。通過底層抓包(或者從pcap檔案獲取資料包),模擬上層應用互動,複製TCP流量到測試系統,從而達到線上流量測試的目的。
TCPCopy的精華在於如何從TCP資料流中模擬出客戶端的互動行為和如何成功把應用請求複製給測試系統。
TCPCopy技術主要涉及到TCP、伺服器領域知識、偽造技術和如何模擬上層應用互動行為。
3、TCPCopy原理圖下圖是傳統的TCP三次握手互動圖。
下圖是TCPCopy模擬的TCP三次握手互動圖。
對於Server端,三次握手資料包沒有差別,所不同的是第二次握手資料包會路由給另外一臺機器(intercept所在機器),而不是直接返回到tcpcopy機器。
這樣做的原因如下:
tcpcopy傳送的資料包中的客戶端IP地址,並不一定是tcpcopy機器所在的IP地址減輕tcpcopy處理壓力,tcpcopy只需處理客戶端方向的流量減輕tcpcopy機器壓力,降低響應包對線上的影響響應資料包路由給intercept所在的機器,可以提升捕獲響應包的能力intercept可以合併響應包中的有用資訊,例如只提取TCP/IP header資訊,一起傳送給tcpcopy,這樣提升了資訊傳遞的效率這種分離給分散式tcpcopy提供了可能,m個tcpcopy,n個intercept組合完成超大併發流量複製。tcpcopy,主要功能是監聽某一個應用的資料包,利用intercept返回的資料包資訊(第一次握手資料包不需要intercept返回資訊),修改源資料包內容,傳送給Server機器。
3.1 線上回放
TCPCopy複製線上流量的三次握手互動過程具體參考下圖:
圖中tcpcopy捕獲到線上的第一次握手資料包,修改目的地址,直接從IP層傳送第一次握手資料包。由於沒有經過tcpcopy機器所在的TCP層,所以並不佔用寶貴的TCP資源。TCPCopy一般會要求在測試伺服器端設定相應的路由,目的是讓響應包路由給輔助伺服器。測試伺服器端接收到第一次握手資料包,檢測合法,併發送第二次握手資料包。
第二次握手資料包到達輔助伺服器端的資料鏈路層,這時intercept程序會去捕獲第二次握手資料包,並通過專用的通道(類似IP tunnel)傳送給tcpcopy。輔助伺服器需要具備流量黑洞功能(即不能具備路由功能),所以第二次握手資料包會在輔助伺服器的IP層結束自己的旅程。
tcpcopy接收到intercept返回的第二次握手資料包資訊,提取出有用的資訊,並等待線上第三次握手資料包的到來。
下圖tcpcopy捕獲到了線上第三次握手資料包,修改第三次握手資料包的ack sequence序列號和目的地址,再次通過IP層發包介面傳送出去。第三次握手資料包到達測試伺服器後,相應的連線就建立成功。
3.2 離線回放
離線回放和線上回放的差別在於tcpcopy抓包介面,離線回放是從pcap獲取資料包,而線上回放是通過IP層提供的raw socket抓包介面。
由於離線回放並不需要線上服務,因此intercept和tcpcopy可以執行在同一臺伺服器。
下面展示了離線回放的情況。圖中tcpcopy從pcap檔案獲取第一次握手資料包,併發送給IP層。第一次握手資料包到達測試伺服器後,測試伺服器的TCP回覆第二次握手資料包,並路由給測試機器。
intercept截獲到第二次握手資料包後,傳送給tcpcopy。
tcpcopy從pcap檔案獲取第三次握手資料包,並利用第二次握手資料包中的sequence序列號來修改第三次握手資料包中的內容,通過IP層發包介面傳送給測試伺服器。
第三次握手資料包到達測試伺服器後,相應的連線就建立成功。
-
1 #
-
2 #
看起來跟tcpreply差不多
玩轉tcpcopy線上壓力測試--原理、使用(上)