簡介 這裡說的TCP協議調試定義是在開髮長連接TCP協議應用時,為了驗證代碼流程或查找bug,需要與對端交互數據過來,當需要時可以暫停發送;單條發送;跳過發送;正常發送;發送時修改數據等。 TcpEngine提供的解決方案是:我們前端應用和後端應用網路通信時,先經過TcpEngine轉發,在轉發過程 ...
簡介
這裡說的TCP協議調試定義是在開髮長連接TCP協議應用時,為了驗證代碼流程或查找bug,需要與對端交互數據過來,當需要時可以暫停發送;單條發送;跳過發送;正常發送;發送時修改數據等。
TcpEngine提供的解決方案是:我們前端應用和後端應用網路通信時,先經過TcpEngine轉發,在轉發過程中,可以對網路數據暫停轉發(暫停);單條轉發(單步);正常轉發(運行);轉發前編輯數據或轉發手工製造的數據(手工發送)等操作,解決我們在開發TCP協議應用時碰到的下列幾種情況。
一、前端小組和後端小組協商後協議格式後,就分別開發新功能,在開發過程中需要對端小組發送網路數據過來觸發代碼執行,以驗證代碼流程是否正確。但是對端小組也正在開發,功能不完善也不能給你發數據,此時只能盲寫代碼。另一種情況是我們已經寫完代碼,需要對端小組發送數據過來,觸發代碼以驗證流程是否正確,但對端功能不完善也不能給你發數據,只能幹等待?此時可以使用TcpEngine模擬對端發送數據給自己,觸發代碼執行。
二、新功能已經集成提交到測試階段,在測試過程中發生bug,此時需要對端發送數據過來定位錯誤,但由於對端也在解決bug沒時間或不能重現錯誤數據,此時無法通過網路數據觸代碼流程來查找bug。此時也可以使用TcpEngine摸擬對端給數據給自己。
三、應用已經交付給客戶端,客戶使用過程中發生網路數據錯誤,需要保存現場數據,解析以重現錯誤現場。此時我們可以使用TcpEngine開啟代理伺服器,讓前端應用和後端應用的數據通信經過TcpEngine轉發,TcpEngine轉發數據同時解析和保存現場數據,再次使用TcpEngine打開解析,以重現網路的網路數據。
新版本放棄了WFP內核獲取網路數據方式,改用代理伺服器獲取網路,帶來易用性很大的提升,新增了TCP協議調試運行模式,新增的功能有:暫停;單步;跳過;運行等新功能。
初識TcpEngine
TcpEngine架構圖
TcpEngine使用代理伺服器方式截取網路數據,前端需要通過代理客戶端把數據發送給TcpEngine的代理伺服器模塊,TcpEngine收到數據進行解析並顯示,然後把解析後的數據再次封裝轉發給後端,數據流程圖如下圖所示。
下麵我們以一個最簡單的應用來演示TcpEngine怎麼使用,這個應用非常簡單,前端發送一條數據給後端,後端就響應一條數據給前端。前端和後端都是用java1.8開發,後端已經部署到demo.tcpengine.cn 伺服器,運行前端需要已配置java環境,代碼已放到https://gitee.com/www.csdn.net/tcp-engine-test。
把前端應用加入到代理客戶端
一、我們以ProxyCap來做為代理客戶端,安裝ProxyCap成功後會通知區域顯示ProxyCap圖標,如下圖所示。
二、右鍵ProxyCap圖標彈出配置菜單,點擊Configuration按鈕,如下圖所示。
四、點擊右邊導航樹的Proxies,再點擊New Proxy Server小圖標,新建一條指向代理伺服器的配置信息,如下圖所示。
五、點擊導航樹的Rules,再點擊Quick Add Rule小圖標,把我們的前端應用exe文件加入到ProxyCap,如下圖所示。
查找前端應用exe文件的小技巧
一、打開任務管理器。
二、再啟動我們的前端應用,這時前端應用就新增到任務管理器應用列表,如下圖所示。
三、滑鼠右鍵我們的應用,點擊“打開文件所在的位置(O)”,就可定位到我們應用exe文件的位置,如下圖所示。
如下圖所示,到此我們成功的把前端應用加入到了ProxyCap代理客戶端,當我們再啟動前端應用時,前端應用的所有TCP網路數據都由ProxyCap轉發給代理伺服器,再由代理伺服器轉發數據給後端應用。
啟動TcpEngine代理伺服器
啟動TcpEngine,初始的主界面如下圖所示。
代理伺服器啟動成功如下圖所示,點擊“退出”僅隱藏視窗,對代理伺服器運行狀態沒有影響,只有TcpEngine退出後,代理伺服器才停止運行。
如果我們啟動失敗,彈出下圖所示異常對話框,那麼是因為系統沒有安裝Visual C++ 14 Runtime Libraries (C++運行支持庫),到微軟體官網或這裡https://tcp-engine.oss-cn-shenzhen.aliyuncs.com/vc_redist.x64.exe下載並安裝就可以解決。
配置截取網路數據
如下圖所示,點擊主視窗的新建按鈕。
新建一個空的解析視窗,如下圖所示。
點擊“開始”,彈出網路配置對話框,填入後端應用的網路地址和埠,點擊“接收不解析”按鈕,把網路配置加入代理伺服器的數據截取列表,如下圖所示。
解析主界面開始監聽網路數據如下圖所示。
截取網路數據
啟動TcpEngineClient,下載地址:http://www.tcpengine.cn/tcp_engine/down_list.html,下載TcpEngine1.3.0.zip到本地,如下圖所示。
解壓後在TcpEngine1.3.0\demo\TcpEngineClient目標下有兩個文件startupClient.bat;TcpEngineClient.jar,雙擊startupClient.bat(註意,運行前本機必須配置好java運行環境,本示例是在java1.8下開發的),示例主界面如下圖所示。
一、點擊“連接”;二、點擊“發送1000”,發送一條TCP協議到後端並從後端接收一條TCP,如下圖所示。
再查看TcpEngine界面,顯示TcpEngine已截取到TcpEngine協議數據,如下圖所示。
解析網路數據
本示例演示TCP協議格式如下圖所示,消息體長度就第二個int型消息體長度決定。
對應的解析規則如下所示。
int32 id;
int32 len;
if(0 < len)
{
byte[len] body; // 消息體
}
來自前端id=1000消息的消息體如下圖所示。
對應的消息體的解析規則如下所示。
if(1000 == id) {
int32 loginId = split(body);
string[len - 4] = split(body);
}
完整的解析規則如下所示。
set endian = big;
set encoding = utf-8;
int32 id;
int32 len;
if(0 < len)
{
byte[len] body; // 消息體
if(1000 == id)
{
int32 loginId = split(body);
string[len - 4] = split(body);
}
}
一、點擊“停止”;二、輸入解析規則到前端解析規則視窗;三、點擊刷新,四、點擊“刷新並解析”,把TCP協議解析成正常數據,如下圖所示。
解析規則教程
解析規則定義
在長連接TCP協議開發中,每個應用都會根據自身的業務特點,定義不同的TCP協議格式,TCP協議具有千變萬化的特點。面對多變的TCP協議,TcpEngine借鑒編程的部分思路,定義了數據類型;if分支;for迴圈;算術表達式來組成解析規則。解析規則的執行過程是從上往下順序執行,當執行到結尾再迴圈從頭開始新一輪執行,比如下圖所示的解析規則。
這個解析規則的流程圖如下所示。
設置網路數據環境
網路數據環境指的是大小端和字元串編碼環境,在實際應用是,有基本數值數據類型,如int32;float32等,這類數據類型因為硬體平臺不同而有大小端的區別,設置大小端的指令是set endian = big; 。字元串數據類型會有編碼區別,設置網路字元串編碼指令是set encoding = utf-8;。數據環境指令寫在解析規則的開頭,如下圖所示。
數據類型
char 字元型,一個位元組,顯示ASCII 字元。
byte 位元組型,一個位元組,以十六進位顯示。
int8 有符號整型,一個位元組,以十進位顯示。
uint8 無符號整型,一個位元組,以十進位顯示。
int16 有符號整型,兩個位元組,以十進位顯示。
uint16 無符號整型,兩個位元組,以十進位顯示。
int32 有符號整型,四個位元組,以十進位顯示。
uint32 無符號整型,四個位元組,以十進位顯示。
int64 有符號整型,八個位元組,以十進位顯示。
uint64 無符號整型,八個位元組,以十進位顯示。
float32 浮點型,四個位元組,以十進位顯示。
float64 浮點型,八個位元組,以十進位顯示。
string 字元串型,可變長度,如果指定了長度,則按指定長度劃分位元組數,如果不指定長度,一直劃分到遇到零為止,如果沒有零,一直劃分到本行結束。
數組
基本數據類型數組概念與編程中的數組概念類似,是把連續的網路數字流劃分到連續的記憶體中,定義格式是 基本數據類型[數組大小表達式] 數組的幾種定義方式如下。
使用常量定義數組長度,如int16[3],定義了三個兩位元組整型數組,共占用6個位元組長度。
使用變數定義數組長度,如byte[len],由變數動態指定數組長度。
使用算術表達式定義數組長度,如int32[1+2*3]; string[len-4]; 等。
數組的長度計算方式是數據類型長度 * 數組元素數,比如int32[3]占用12個位元組,float64[4]占用32個位元組。字元串的數據類型長度是1個位元組,string[32]占用32個位元組,如下圖所示。
算術表達式
跟程式中的算術表達式一樣,算術表式達的計算結果是數值,可用於數組長度計算,變數賦值。變數值來源有兩種,一種是來源於網路數據劃分,另一種是來源於算術表達式,值來源不同的變數執行表現有下列不同。
一、來源於網路的變數在界面上有顯示,而來源於表達式變數不會被顯示。
二、來源於網路的變數值不能被改變,而來源於表達式變數可以被改變,如執行++運算。
分支和迴圈
支持if;for,不支持while,跟程式的行為一樣,有一點區別是if的格式如下。
if()
{
執行分支段......
}
elseif() // 註意這裡else 和 if 之間沒有空間
{
執行分支段......
}
else
{
執行分支段......
}
簡單的示例如下圖所示。
內置函數
TcpEngine不支持自定義函數,本版本僅定義了兩個內置函數,分別是split和call。split是對數組再一次劃分到新變數,用法與效果前面已經說明和展示了,這裡不再介紹。call是支持調試模式執行,這個內置函數在調試解析再詳細說明。
調試TCP協議教程
這個版本新增的最重要功能,也是最實用功能,由暫停;忽略;穿透暫停;運行;手工發送等子功能組成。觸發調式模式有兩種方式,一、在運行中,手工點擊工具欄的“暫停”按鈕;二、在解決規則上加入call(pause);。
調試TCP協議的定義是:我們前端應用和後端應用網路通信時,先經過TcpEngine轉發,在轉發過程中,可以網路數據暫停轉發(暫停);單條轉發(單步);正常轉發(運行);轉發前修改數據或轉發手工製造的數據(手工發送)等操作,本節用開源的IM軟體flamingo演示,flamingo的源碼托管地址 https://gitee.com/balloonwj/flamingo。
調試前準備
一、flamingo後端已放到demo.tcpengine.cn,伺服器埠是20000;20001;20002,flamingo前端網路設置如下圖所示。
二、參考前面的教程把flamingo加入到ProxyCap,如下圖所示。
三、編寫解析規則,flamingo的TCP協議格式如下圖所示
對應的解析規則如下圖所示。
解析flamingo網路數據演示
新建空的解析視窗,編寫解析規則,點擊工具欄的“開始”按鈕,因為flamingo對網路數據進行了加密,我們需要設置加解庫(加解庫會在“對加解密的支持”章節講解),如下圖所示。
啟動監聽網路數據成功如下圖所示。
啟動flamingo,輸入用戶名:13888886666 密碼:123456 並點擊登陸(測試環境,數據可能會被清除),如下圖所示。
flamingo登陸成功,TcpEngine解析TCP協議結果如下圖所示。
調試內置函數call
我把flamingo的指令分業務指令和支持指令,業務指令由用戶觸發,比如登陸;查找;聊天等指令;支持指令由應用自己發送,比如心跳指令。
觸發調試模式有兩種方式,一、點擊工具欄的“暫停”按鈕;二、使用call內置函數支持,在解析規則中加入call(pause)。
隱藏
在實際應用中,我們不想顯示一些指令的解析結果,比如心跳指令有很多但對我們查找問題沒有幫助,這類指令的解析結果我們可以隱藏並且不影響指令轉發。那麼我們可以在解析規則中加入call(ignore)觸發這個功能,比如我們對心跳包的結果隱藏如下圖所示。
暫停
有時候我們希望網路數據解析到某條指令就暫停轉發,阻塞住後面到達的數據,用於仔細分析網路現場數據或者修改數據後再發送。觸發這個功能有兩種方式,一、點擊工具欄暫停按鈕;二、在解析規則中加入call(pause),如下圖所示,當解析到指令id = 1004 時,TcpEngine暫停轉發數據。
穿透暫停
當我們觸發“暫停”功能後,有一個問題需要解決,就是心跳指令也阻塞住了,如果我們的應用發現收不到心跳指令,可能會認識網路已經斷開了,從而主動斷開網路。那麼我們需要在阻塞網路數據的時候,某些指令還能繼續轉發,在解析規則中加入call(tunnel)可以實現本功能,如下圖所示,當阻塞在1004指令時,心跳指令還能繼續轉發。
工具欄調試按鈕
在工具的按鈕有,暫停|運行;單步;跳過,功能說明如下。
暫停|運行:當解析線程阻塞轉發時,顯示“運行”,點擊解析線程繼續解析並轉發;當解析線程正常解析並轉發數據時,顯示暫停,點擊會阻塞解析和轉發,暫停的行為跟call(pause)的為行一致。
單步:當解析線程阻塞時,本按鈕可點擊,點擊會把當前阻塞的數據轉發到網路,並把下一條網路數據取出解析顯示並繼續阻塞。
跳過:當解析線程阻塞時,本按鈕可點擊,點擊會把當前阻塞的數據丟棄,並把下一條網路數據取出解析顯示並繼續阻塞。
手工發送
在開發TCP長連接應用時,常常會發生“簡介”章節列舉的這幾種情況,在對端無法向我們發送數據時,可以使用TcpEngine向我們發送模擬數據,實現這個功能就是手工發送,操作流程如下。
在轉發模式下,讓解析線程運行到指定指令就暫停下來,本示例我們就讓解析線程運行到指令1004就暫停解析。
滑鼠雙擊你要發送的數據,彈出二次解析視窗,如下圖所示。
在二次解析視窗編輯網路數據,如下圖所示。
滑鼠右鍵菜單,點擊“發送”,如下圖所示。
對加密數據的支持
在解析視窗設置加解密庫
多數情況下,在網路上流通的數據都是經過加密的,每個應用的加解密演算法都是不同並保密的。面對這種情況TcpEngine提供的解決方案是由您根據自身的加解密演算法,按照我們的規則封閉成DLL,併在開始解析網路數據前配置到網路解析視窗,配置加解庫如下圖所示。
解碼庫地址:加解密庫DLL在本地的地址,如果數據沒有加密,則設置為空。
解碼初始化參數:當解析線程載入加密庫時,在加密或解密數據前,會對這裡輸入參數進行驗證,驗證通過再加解密數據,設計這個參數的目的是防止您的DLL流出,讓別有用心的人利用DLL解密您的數據並攻擊你的應用,如果設置了參數,別人不知道參數也不能使用您的DLL,相當於密碼的功能。
選填/必填:選填,初始化參數可填可不填,如果已填,就對初始化參數驗證;必填,初始化參數必須填寫並驗證。
保存:勾選這個,寫把初始化參數保存tcpd文件,再次打開tcpd文件參數裝自動填充。
加解密庫DLL開發
加解密庫有兩類介面,一類是由TcpEngine調用,DLL實現的介面;另一類是由TcpEngine實現,DLL調用的介面,這類介面稱為回調函數。
由TcpEngine調用DLL實現的介面如下圖所示。
由TcpEngine實現DLL調用的介面如下圖所示。
DLL庫開發的請參考基於flamingo的DLL源代碼,代理下載地址:https://gitee.com/www.csdn.net/TcpEngineDecode.git