TCP協議調試工具TcpEngine V1.3.0使用教程

簡介

這裡說的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開發,後端已經部署到http://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.0demoTcpEngineClient目標下有兩個文件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後端已放到http://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

赞(0)