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开发,后端已经部署到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
TCP协议调试工具TcpEngine V1.3.0使用教程的更多相关文章
- TCP协议,UDP协议
帅爆太阳的男人 1,TCP协议 回环地址:127.0.0.1(所有电脑都这一个默认回环地址)每个计算机都有这么一个本机地址只能被本机识别,不会被其他机器识别(因为你用这个地址传内容他就传不出去) TC ...
- 0.关于TCP协议的一些总结
接触unix网络编程一年多了,偶尔用户态进程表现出一些不能理解的现象,因此将<TCP/IP协议卷1>TCP协议相关的章节通读了一遍,总结了一下相关的知识点. 1.TCP数据报格式 TCP封 ...
- tcp协议头窗口,滑动窗口,流控制,拥塞控制关系
参考文章 TCP 的那些事儿(下) http://coolshell.cn/articles/11609.html tcp/ip详解--拥塞控制 & 慢启动 快恢复 拥塞避免 http://b ...
- python-基于tcp协议的套接字(加强版)及粘包问题
一.基于tcp协议的套接字(通信循环+链接循环) 服务端应该遵循: 1.绑定一个固定的ip和port 2.一直对外提供服务,稳定运行 3.能够支持并发 基础版套接字: from socket impo ...
- 千兆以太网TCP协议的FPGA实现
转自https://blog.csdn.net/zhipao6108/article/details/82386355 千兆以太网TCP协议的FPGA实现 Lzx 2017/4/20 写在前面,这应该 ...
- 网络编程之Socket的TCP协议实现客户端与客户端之间的通信
我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...
- 基于tcp协议的粘包问题(subprocess、struct)
要点: 报头 固定长度bytes类型 1.粘包现象 粘包就是在获取数据时,出现数据的内容不是本应该接收的数据,如:对方第一次发送hello,第二次发送world,我放接收时,应该收两次,一次是hel ...
- Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群
文章转载自:https://i4t.com/5451.html 背景 Kubernetes 1.24新特性 从kubelet中移除dockershim,自1.20版本被弃用之后,dockershim组 ...
- 【转】TCP协议
TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...
随机推荐
- 干货|带你体验一次原生OpenStack云平台发放云主机的过程
一个执着于技术的公众号 1 前言 上一章节我们完成了OpenStack云平台的搭建工作,今天就带大家一起学习下如何发放一台云主机 点击查看:如何搭建一套OpenStack云平台 2 发放OpenSta ...
- .NET Core 企业微信消息推送
接口定义 应用支持推送文本.图片.视频.文件.图文等类型.请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send? ...
- 深入HTTP请求流程
1.HTTP协议介绍 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,它是从WEB服务器传输超文本标记语言(HTML)到 ...
- layui数据表格导入数据
作为一个后端程序员,前端做的确实很丑,所以就学习了一下layui框架的使用.数据表格主要的问题就是传输数据的问题,这里我用我的前后端代码来做一个实际的分解. 前端部分 可以到layui官网示例中找到数 ...
- Python技法:用argparse模块解析命令行选项
1. 用argparse模块解析命令行选项 我们在上一篇博客<Linux:可执行程序的Shell传参格式规范>中介绍了Linux系统Shell命令行下可执行程序应该遵守的传参规范(包括了各 ...
- 以人类 Person 为基类设计学生类 Student 和教师类 Teacher
学习内容:实验二以人类 Person 为基类设计学生类 Student 和教师类 Teacher 示例代码: package 实验二; import java.util.Scanner; class ...
- 解放双手!推荐一款 GitHub 星标 8.2k+的命令行软件管理器,非常酷炫!
小二是公司新来的实习生,之前面试的过程中对答如流,所以我非常看好他.第一天,我给他了一台新电脑,要他先在本地搭建个 Java 开发环境. 二话不说,他就开始马不停蹄地行动了.真没想到,他竟然是通过命令 ...
- 关于我学git这档子事(2)
将本地main分支push到远程dev分支(不同名分支间的push) 远程dev分支还未创建 (在push同时创建远程dev分支,并将本地main分支内容上传) git push -u --set-u ...
- 面试突击55:delete、drop、truncate有什么区别?
在 MySQL 中,删除的方法总共有 3 种:delete.truncate.drop,而三者的用法和使用场景又完全不同,接下来我们具体来看. 1.delete detele 可用于删除表的部分或所有 ...
- 155_模型_Power BI & Power Pivot 进销存之安全库存
155_模型_Power BI & Power Pivot 进销存之安全库存 一.背景 谈进销存的概念时,我们也需要提及另外一个概念:安全库存. 库存周转在理想的状态下是做到零库存,但是在内部 ...