tcpcopy簡介


本文內容是整理自 王斌的博客(http://blog.csdn.net/wangbin579)和鄭鈞的博客(http://www.cnblogs.com/zhengyun_ustc),以便讓自己可以有個宏觀的認識。

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

Tcpcopy是由網易技術部王斌(http://weibo.com/tcpcopy)在王波的工作基礎上開發的,2011年9月開源的項目(https://github.com/session-replay-tools/tcpcopy  https://github.com/wangbin579/tcpcopy ),目前最新版本 1.0.0 ,后續相關內容都是基於 1.0.0 的。

 

tcpcopy的工作原理

TCPCopy 是一種請求復制(復制基於 TCP 的 packets)工具 ,通過復制在線數據包,修改 TCP/IP 頭部信息,發送給測試服務器,達到欺騙測試服務器的TCP 程序的目的,從而為欺騙上層應用打下堅實基礎。

 

tcpcopy 不是基於應用層的復制,而是基於底層數據包的請求復制,這么做的好處是:可以做到無需穿透整個協議棧,路程最短的,可以從數據鏈路層抓請求包,從數據鏈路層發包,路程一般的,可以在IP層抓請求包,從IP層發出去,不管怎么走,只要不走TCP,對在線的影響就會小得多。

七層網絡模型如下圖:

image

tcpcopy 經歷了三次架構調整,參考:http://blog.csdn.net/wangbin579/article/details/8949315 

這三次架構的基本原理都一樣,本質是利用在線數據包信息,模擬tcp客戶端協議棧,欺騙測試服務器的上層應用服務。由於tcp交互是相互的,一般情況下需要知道測試服務器的響應數據包信息,才能利用在線請求數據包,構造出適合測試服務器的請求數據包,因此只要基於數據包的方式,無論怎么實現(除非是tcp協議改的面目全非),都需要返回響應包的相關信息。
三種架構的差別就在於在什么地方截獲響應包。

具體這三種架構的差別請看上面文章,簡單差別如下:

  • 方案一:tcpcopy是從數據鏈路層(pcap接口)抓請求數據包,發包是從IP層發出去
  • 方案二:tcpcopy默認從IP層抓包,從IP層發包
  • 方案三:跟方案一一樣,不過引入了獨立的 intercept(assistant server)

后面的內容我們以第三套方案來展開。

 

tcpcopy 架構

tcpcopy運行需要intercept的支持,tcpcopy負責抓包和發包工作,而intercept負責截獲應答包

它的數據流轉和部署架構如下圖:

image

 

tcpcopy代碼下載地址:

git clone http://github.com/session-replay-tools/tcpcopy
configure:
./configure (默認raw socket方式抓包)
或者
./configure --pcap-capture  (pcap方式抓包,在某些場景下,丟包率會高於raw socket方式抓包,這時候需要類似pf_ring的支持)

 

對於intercept
代碼下載地址:
git clone http://github.com/session-replay-tools/intercept
configure方式:
./configure

參考: http://blog.csdn.net/wangbin579/article/details/8950282 

 

具體的生產環境和鏡像環境數據傳遞流程圖如下:

image

  • TCPcopy 從數據鏈路層 copy 端口請求,然后更改目的 ip 和目的端口。
  • 將修改過的數據包傳送給數據鏈路層,並且保持 tcp 連接請求。
  • 通過數據鏈路層從 online server 發送到 test server。
  • 在數據鏈路層解封裝后到達 nginx 響應的服務端口。
  • 等用戶請求的數據返回結果后,回包走數據鏈路層。
  • 通過數據鏈路層將返回的結果從 test server 發送到 assistant server。注:test server 只有一條默認路由指向 assistant server。
  • 數據到達 assistant server 后被 intercept 進程截獲。
  • 過濾相關信息將請求狀態發送給 online server 的 tcpcopy,關閉 tcp 連接。

 

最新的1.0版本如何使用離線模式
https://github.com/session-replay-tools/tcpcopy/issues/215

對於tcpcopy,configure的時候加上--offline
--offline replay TCP streams from the pcap file
執行的時候,加上-i參數,用來指定pcap文件地址
對於intercept,不用變化

 

參考資料:

真刀真槍壓測:基於TCPCopy的仿真壓測方案
http://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html

如何利用pcap接口從數據鏈路層發包?
http://blog.csdn.net/wangbin579/article/details/10148247

利用tcpcopy引流做模擬在線測試
http://www.searchtb.com/2012/05/using-tcpcopy-to-simulate-traffic.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM