简介

  这里说的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.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个字节,如下图所示。

算术表达式

  跟程序中的算术表达式一样,算术表式达的计算结果是数值,可用于数组长度计算,变量赋值。变量值来源有两种,一种是来源于网络数据划分,另一种是来源于算术表达式,值来源不同的变量执行表现有下列不同。

  一、来源于网络的变量在界面上有显示,而来源于表达式变量不会被显示。

  二、来源于网络的变量值不能被改变,而来源于表达式变量可以被改变,如执行++运算。

分支和循环

支持iffor,不支持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

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/tcp-engine/p/16512840.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!