TCPCopy是一種重放TCP流的工具,使用真實環境來測試互聯網服務器上的應用程序。linux
1、描述:git
雖然真實的實時流量對於Internet服務器應用程序的測試很重要,可是因爲生產環境中的狀況很負責,測試環境很難徹底模擬線上環境。爲了可以更真實的測試,咱們開發了一款線上流量複製工具-TCPCopy,它可使用線上真實的流量來對測試環境中的服務器進行測試。目前,TcpCopy技術已經在中國不少公司大量使用。github
2、使用場景:安全
1)分佈式壓力測試服務器
使用tcpcopy複製真實的數據來進行服務器的壓力測試。有些bug只有在高併發的狀況下才可以被發現。網絡
2)仿真實驗:session
被證實是穩定的新系統,其bug只能在真正使用的時候才能被發現併發
3)迴歸測試app
4)性能對比負載均衡
3、框架:
如Figure1中所示,tcpcopy包括兩部分:tcpcopy(client)和intercept(server)(後文中統一將tcpcopy-client稱爲tcpcopy,將tcpcopy-server稱爲intercept),當tcpcopy運行在生產服務器並從生產服務器抓取請求時,inteceptor運行在輔助服務器上進行一些輔助工做,例如,響應tcpcopy。切記,測試應用程序應該運行在測試服務器上。
tcpcopy默認狀況下使用socket輸入技術在網絡層抓取線上的數據包,作一些基本處理(包括:模擬TCP交互,網絡控制,以及模擬傳輸層和應用層),使用socket輸出技術發送數據包到測試服務器(如粉色箭頭所示)
tcpcopy的測試服務器須要作的惟一操做是:設置適當的參數使響應信息發送到輔助服務器中(裝intercept的服務器)(如綠色箭頭所示)
intercept(默認)將響應信息傳送給tcpcopy。經過抓取響應包,intercept提取響應頭信息,並使用一個特殊的通道將響應頭信息發送給tcpcopy(如紫色箭頭所示)。當tcpcopy接受到響應頭信息,它利用頭信息修改在線打包器的屬性並繼續發送另外一個包。應當注意,來自測試服務器的響應被路由到應該充當黑洞的輔助服務器。
4、快速開始
一、獲取intercept的兩種方式:
1)Download the latest intercept release.
2)clone git://github.com/session-replay-tools/intercept.git
二、獲取tcpcopy的兩種方式
1)Download the latest tcpcopy release.
2)clone git://github.com/session-replay-tools/tcpcopy.git
5、獲取安裝在輔助服務器上的intercept
1)cd intercept
2)./configure
3)選擇適當的配置參數
4)make
5)make install
6、intercept的配置參數
--single intercept運行在單機狀況下
--with-pfring=PATH 將路徑設置爲PF_RING庫源
--with-debug 以debug模式編譯intercept(保存在日誌文件中)
7、獲取安裝在生產服務器上的tcpcopy
1)cd tcpcopy
2)./configure
3)選擇適當的配置參數
4)make
5)make install
8、tcpcopy的配置參數
--offline 從pcap文件重放TCP流
--pcap-capture 在數據鏈路層抓包(默認在網絡層)
--pcap-send 在數據鏈路層發包(默認在網絡層)
--with-pfring=PATH 將路徑設置爲PF_RING庫源
--set-protocol-module=PATH 設置tcpcopy爲外部協議模塊工做
--single 若是intercept和tcpcopy都設置爲單機模式,只有一個tcpcopy和一個intercept一塊兒工做,將會得到更好的性能
--with-debug 以debug模式編譯tcpcopy(保存在日誌文件中)
9、運行tcpcopy
確保tcpcopy和intercept都配置爲「./configure」
1)在運行應用程序的測試服務器上,正確設置路由命令以將響應數據包發送到輔助服務器上
例如:
假設61.135.233.161是輔助服務器的IP地址。 咱們設置如下route命令將全部對62.135.200.x的的響應路由到輔助服務器。
route add -net 62.135.200.0 netmask 255.255.255.0 gw 61.135.233.161
2)在運行intercept的輔助服務器上(須要root權限或者能使用socket通訊的權限)
./intercept -F <filter> -i <device,>
請注意,過濾器格式與pcap過濾器相同。
例如:./intercept -i eth0 -F 'tcp and src port 8080' -d
intercept將捕獲基於TCP應用的響應,該應用監聽在設備的8080端口上
3)生產服務器中(須要root權限或者能使用socket通訊的權限)
./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,>
[-c <ip range,>]
例如(假設61.135.233.160是目標服務器的IP地址):
./tcpcopy -x 80-61.135.233.160:8080 -s 61.135.233.161 -c 62.135.200.x
tcpcopy將抓取當前服務器上80端口的數據包,修改客戶端IP地址爲62.135.200.x,將這些數據包發送到ip地址爲61.135.233.160,端口爲8080的測試服務器,而且鏈接61.135.233.161,告訴intercept將響應數據包發送給它(tcpcopy)
雖然「-c」參數是可選的,但在此設置以便簡化路由命令。
10、注意
1)只能在linux上測試(kernal 2.6 or above)
2)tcpcopy可能丟包,所以丟失請求
3)root權限或socket權限是必須的(例如 setcap CAP_NET_RAW = ep tcpcopy)
4)TCPCopy如今只支持客戶端啓動的鏈接
5)TCPCopy不支持使用SSL / TLS的服務器應用程序的重放
6)對於MySQL會話重放,請參考 https://github.com/session-replay-tools
7)不該該在輔助服務器上設置ip轉發
8)請執行「./tcpcopy -h」或「./intercept -h」以獲取更多詳細信息
11、影響因素
有幾個因素可能影響TCPCopy,將在如下部分中詳細介紹:
1)抓包接口
tcpcopy默認使用套接字輸入接口在網絡層抓取生產服務器的數據包。在系統忙時,系統內核可能會丟包。
若是你配置tcpcopy的參數「--pcap-capture」,tcpcopy將在數據鏈路層抓包,也能夠過濾內核中的數據包。在PF_RING資源中,當使用pcap捕獲時,tcpcopy將丟失更少的數據包。
或許抓請求包的最好方式是經過交換機鏡像入口的數據包,而後經過負載均衡器將巨大的流量劃分到幾臺機器
2)發送接口
tcpcopy默認使用套接字輸出接口在網絡層發送數據包到測試服務器。若是你想避免IP鏈接跟蹤問題或者得到更好的性能表現,配置tcpcopy的參數「--pcap-send」,設置適當的參數,tcpcopy能夠在數據鏈路層發送數據包到測試服務器。
3)數據包在通往測試服務器的路上
當一個數據包被tcpcopy發送時,它可能在到達測試服務器前遭到不少挑戰。因爲數據包中的源IP地址依然是終端用戶的IP地址(默認狀況下)而不是生產服務器的IP地址,一些安全設備可能將該包削弱或當作僞造的包丟棄它。這種狀況下,你在測試服務器使用tcp抓包工具,可能抓取不到指望的終端用戶的數據包。要肯定你是否正處於這種狀況下,你可使用同一網段下的測試服務器作個小測試。若是數據包能被成功的發送到同一網段的測試服務器,而不能發送到不一樣網段的測試服務器,那麼證實你的數據包在半路被丟棄了。
爲了解決這個問題,咱們建議將tcpcopy、測試服務器、intercept部署在同一個網段內。在同一網段中有一個代理的幫助下還有另外一個解決方案,tcpcopy能夠向代理髮送數據包,而後代理會將相應的請求發送到另外一個網段中的測試服務器。
注意,在同一網段中的一個虛擬機上部署目標服務器應用程序可能面臨上述問題
4)測試服務器的路由
測試服務器可能設置了反向過濾技術,能夠檢查包中源IP地址是不是被僞造的。若是是,則該包在網絡層被丟棄。
若是在測試服務器中能用tcp抓包工具抓到包,可是測試服務器上的應用程序接收不到任何請求,你應該檢查你是否有相似反向過濾技術的設置。若是設置了,你不得不移除相關的設置來讓數據包經過網絡層。
也有些其餘緣由可能致使tcpcopy不能正常工做,例如防火牆設置問題。
5)測試服務器上的應用程序
測試服務器上的應用程序可能不能及時處理全部的請求。一方面,應用中的bug致使請求很長時間得不到響應;另外一方面,一些TCP層以上的協議只處理socket緩衝中的第一個請求,將剩下的請求留在socket緩衝中不處理。
6)輔助服務器的路由
你不該該設置ip轉發爲true或者輔助服務器不能做爲一個黑洞工做。
12、歷史版本
2014.09 v1.0 TCPCopy released
十3、錯誤和功能請求
有錯誤或功能請求?請打開一個新問題。 在打開任何問題以前,請搜索現有問題。
十4、版權和許可
版權全部2016根據BSD許可。