概述

  目前主流的网络数据分析工具主要有两类,一类是http协议分析工具,如fiddler,这类工具擅长对字符串类型协议分析;另一类是原始网络数据包的监听分析,如Wireshark,这类工具擅长分析网络底层行为。这两类工具一类擅长字符串协议分析,另一类擅长网络底层行为分析,但是上述两类工具分析二进制流类型协议时,就显得力不心了,TcpEngine (官网:http://www.tcpengine.cn/)补充上述两类工具的空白,提供了二进制流协议分析的方法。

  TcpEngine擅长分析数据流协议,适合在数据流协议出现数据错误时使用,比如使用了tcp|websocket协议的网络游戏出现数据错误时,使用本工具对游戏网络数据分析,查找数据错误原因。这款工具不但可以在发开环境中使用,也可以在非开发环境中使用,比如网络数据错误发生在测试环境或用户环境,可以使用本工具在发生错误环境中监听拷贝网络数据,保存到文件再交给技术开发人员慢慢分析。 

目前只支持在win32平台运行,工具分两部分,应用软件部分和系统内核WFP模块,WFP(Windows Filtering Platform) 是windows推出的用于TCP/IP协议栈五层各层里面对数据包进行交互操作的基础框架,这里用于监听拷贝指定的网络数据。使用前需要安装WFP,由于WFP内核模块还没有数据签名,使用前需要按下面链接指导步骤重启和设置系统http://www.xitongcheng.com/jiaocheng/win10_article_10547.html

  二进制流协议是由我们根据业务需求自定义且没有统一固定格式的网络通信协议,这种特性决定了协议格式是多种多样的,面对多变的协议,解析工具必须提供灵活多变的解析方法,灵活多变就决定了解析方法使用难度会相应的增加。

初识解析规则

  面对这些特点,TcpEngine提供的解析方案是提供类似于编程的解析方法,让您根据自己的协议格式编写对应的解析规则,比如一个典型的协议是:固定的消息头 + 可变的消息体。  

  • 消息头 = 两个字节的指令id  + 四个字节消息长度,消息长度值等消息头长度加上消息体长度。
  • 消息体长度 = 由消息头的四个字节消息长度 -  6指定。如下图所示。

  

  初步对应的解析规则如下。

  int16 msgId;    // 消息id

  int32 msgLen;   // 消息长度,值是消息体长度 + 消息头长度

  byte[msgLen-6] msgBody;  // 消息体长度 = msgLen - 6

  如果我们全部的消息都是这样固定的格式,那么可以通过死循环来使用同样的格式解析所有消息,对应的解析规则如下。

  while(1 == 1){

    int16 msgId;   // 消息id

    int32 msgLen;   // 消息长度,值是消息体长度 + 消息头长度

    byte[msgLen-6] msgBody; // 消息体长度 = msgLen - 6

  }

  如果我们前3个消息是上述格式,后续所有消息是另外如下格式。

  

  对应的解析规则如下。

int32 loop = 3;

while(loop > 0){ // 循环三次

loop--;

int16 msgId; // 消息id

int32 msgLen; // 消息长度,值是消息体长度 + 消息头长度

byte[msgLen-6] msgBody;  // 消息体长度 = msgLen - 6;

}

while(1 == 1){ // 死循环解析后续所有消息

int16 msgId; // 消息id

int32 msgLen; // 消息长度,值是消息体长度 + 消息头长度

int16 msgKey; // 消息key

byte[msgLen-8] msgBody; // 消息体长度 = msgLen - 8;

}

初识解析消息体

  我们以上述举例开始三条消息举例,如果msgId=1000的消息体前一个字节是用户名长度 + 字符串用户名 + 两个字节密码长度 + 字符串密码,如下图所示。

  

  对应解析规则如下。

int32 loop = 3;

while(loop > 0){

loop--;

int16 msgId;

int32 msgLen;

byte[msgLen-6] msgBody;

if(1000 == msgId) {

int8 userNameLen = msgBody.split(); // 用户名长度

text[userNameLen] userName = msgBody.split(); // 用户名

int16 pwdLen = msgBody.split(); // 密码长度

text[pwdLen] = msgBody.split(); // 如不对变量再引用,可定义匿名变量

}

}

while(1 == 1){

int16 msgId;

int32 msgLen;

int16 msgKey;

byte[msgLen-8] msgBody;

}

  如果我们的还有一个消息是1001,按如下方式解析。

int32 loop = 3;

while(loop > 0){

loop--;

int16 msgId;

int32 msgLen;

byte[msgLen-6] msgBody;

if(1000 == msgId) {

int8 userNameLen = msgBody.split(); // 用户名长度

text[nameLen] userName = msgBody.split(); // 用户名

int16 pwdLen = msgBody.split(); // 密码长度

text[pwdLen] = msgBody.split(); // 对变量没有再使用,可不指定变量名

}

if(1001 == msgId) {

// 解析规则列表....

}

  // 更多的解析规则....

}

参数设置

  通信数据都以某种数据格式在网络中传输,因此在解析数据前,先要指定数据是以哪种格式在传输,TcpEngine支持三种网络参数,以指定按哪种格式解析原始网络数据,分别是:字节序;字符串编码;网络传输协议。

  • 字节序:不了解的请自行网上搜索,这个参数影响多字节的数值类型,如int32,设置指令如下。

set endian = big; // 大端,目前主流,也叫网络字节序

set endian = little; // 小端

  • 字符串编码:设置字符串数据编码,这个参数影响字符串数据类型,设置指令如下。

set encoding = utf-8;

set encoding = local; // 使用系统当前默认编码

  • 网络传输协议:暂只支持tcp原始协议和websocket协议,这个参数设置工具以哪种协议识别网络数据,设置指令如下。

set protocol = tcp; // 指定原始tcp传输方式

set protocol = websocket; // 指定websocket传输方式

set protocol = auto;  // 让工具根据数据特征自动先择

数据类型

char 字符型,一个字节,显示ASCII 字符。

byte 字节型,一个字节,以十六进制显示。

int8 有符号整型,一个字节,以十进制显示。

int16 有符号整型,两个字节,以十进制显示。

int32 有符号整型,四个字节,以十进制显示。

int64 有符号整型,八个字节,以十进制显示。

float32 有符号浮点型,四个字节,以十进制显示。

float64 有符号浮点型,八个字节,以十进制显示。

text 字符串型,可变长度,如果指定了长度,则按指定长度划分字节数,如果不指定长度,遇到零就停止划分,如果没有遇零,遇到一行结束就停止划分(建议使用这个字符串类型)。

string 字符串型,可变长度,如果指定了长度,则按指定长度划分字节数,如果不指定长度,一直划分到遇到零为(建议少用可不用这个类型)。

运行TcpEngine

  TcpEngine擅长解析二进流网络协议,为了监听拷贝指定网络数据,采用了微软的WFP内核模块实现,使用前需要在系统安装WFP内核模块。因为WFP内核模块未数据签名(模块源代码可在官网下载),需要先按本链接http://www.xitongcheng.com/jiaocheng/win10_article_10547.html。指导重启电脑,然后再以管理员权限运行工具。如果工具未安装WFP,在“系统设置”中安装,工具启动正常如下图所示。

  

监听拷贝网络数据

  TcpEngine支持先监听拷贝网络数据再分析,也可以边监听网络数据,边分析,当前版本只支持通过ipv4地址和端口的方式监听指定网络数据,执行“新建”功能,生成一个解析规则文件,如下图所示。

  

    点击“开始”,弹出配置监听网络数据端口,填入我们想监听的网络地址和端口,我们以监听分析百度举例, 百度的IP地址是14.215.177.38(IP地址可能会变),把14.215.177.38:80如下图所示填写,并点击“接收不解析”按钮。

  

  在浏览器访问http://14.215.177.38/,如下图所示是工具监听到的网络数据,未解析将以二进制显示。

  

初识解析过程

  网站传输的http协议有文本和二进制流数据(图片,声音等),使用TcpEngine初步解析http协议,我们以上述接收的http网络数据为例,按下列步骤编写最简单的解析规则。处理http协议并不是TcpEngine擅长领域,这里只为简单入门演示。

  • 设置好参数,发送数据和接收数据都要设置,如下图所示。

  • 编写解析规则,解析规则执行过程跟过程语言执行顺序类似,按顺序顺序执行网络数据,编写好解析规则并执行“刷新”,保存解析规则到文件后,并执行解析刷新,解析结果如下图所示,因为没有编写解析规则,还是以二进制数据显示。

  • 以字符串解析发送和接收的网络数据,字符串变量是text和string,这里使用text,以字符串解析网络数据写法如下。

  text tt;  // 以字符串数据类型解析网络数据

  把所有数据都以字符串解析如下。

while(1 == 1){

  text tt;  // 以字符串数据类型解析网络数据

  }

  执行解析规则结果如下图所示。

  

网络数据流分析工具TcpEngine V1.0.0教程-1的更多相关文章

  1. 网络性能测试工具iperf详细使用图文教程

      Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性. Iperf可以报告带宽,延迟抖动和数据包丢失.利用Iper ...

  2. 网络性能测试工具iperf详细使用图文教程【转载】

    原文:http://blog.163.com/hlz_2599/blog/static/142378474201341341339314/ 参考:http://man.linuxde.net/iper ...

  3. 网络性能测试工具iperf详细使用图文教程(转)

    Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包丢失.利用Iperf这一 ...

  4. 【Linux】网络性能测试工具iperf详细使用图文教程【转】

    参考链接:https://www.cnblogs.com/yingsong/p/5682080.html Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量. Iperf可以测 ...

  5. TCP协议调试工具TcpEngine V1.3.0使用教程

    简介   这里说的TCP协议调试定义是在开发长连接TCP协议应用时,为了验证代码流程或查找bug,需要与对端交互数据过来,当需要时可以暂停发送:单条发送:跳过发送:正常发送:发送时修改数据等.   T ...

  6. Iperf3网络性能测试工具详解教程

    Iperf3网络性能测试工具详解教程 小M 2020年4月17日 运维 本文下载链接 [学习笔记]Iperf3网络性能测试工具.pdf 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保 ...

  7. 【山外笔记-工具框架】iperf3网络性能测试工具详解教程

    [山外笔记-工具框架]iperf3网络性能测试工具详解教程   本文下载链接 [学习笔记]iperf3网络性能测试工具.pdf 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性 ...

  8. 【学习笔记】Iperf3网络性能测试工具

    [学习笔记]Iperf3网络性能测试工具 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理.网络存在安全漏洞等原因,都会导致网络带宽利用率不高. ...

  9. iperf——网络性能测试工具

    一.前言 工作中遇到需要测试Linux服务器网卡占用率的场景,查阅资料后,发现iperf是一款合适的网络测速工具. 下面讲解一下如何使用iperf做网络性能测试. 二.基础知识 先补充一些基础知识: ...

  10. Windows环境下Android Studio v1.0安装教程

    Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SD ...

随机推荐

  1. #阶梯NIM#Poj 1704 Georgia and Bob

    题目 有\(n\)个棋子摆放在x轴的正半轴上, 每次将棋子最多向左移动至上一个棋子之后(不能不移动), 不能操作为败,问先手是不是必胜 分析 这个模型可以转换成阶梯NIM的形式, 那么将奇数位置做NI ...

  2. #min_max容斥#HDU 4336 Card Collector

    题目 有\(n\)张牌,获得第\(i\)张牌的概率为\(p_i\), 问期望多少次能收集完\(n\)张牌 分析 题目求的是\(E(\max S)\),根据min_max容斥可以得到, \[E(\max ...

  3. std::format 如何实现编译期格式检查

    C++ 20 的 std::format 是一个很神奇.很实用的工具,最神奇的地方在于它能在编译期检查字符串的格式是否正确,而且不需要什么特殊的使用方法,只需要像使用普通函数那样传参即可. #incl ...

  4. 掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南

    C# 变量 变量是用于存储数据值的容器. 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数 ...

  5. Sqlite数据库联合查询及表复制等详述

    外键:一般在两个表之间要建立关联时候,创建一个列创建 为外键(UserInfos-DeptId),它在另一个表必须是主键(DeptInfos-DeptId) 元素约束:主键约束:主要区别内容相同的行, ...

  6. 标签栏切换效果 JS

    标签栏切换效果 JS 要求:class为tab-box的元素用于实现标签栏的外边框,,分别实现标签栏的标签部分和内容部分. html <div class="tab-box" ...

  7. centos6.5下安装配置apache2.4.9

    centos6.5下安装配置apache2.4.9 摘要: 需要下载的包 apr-1.5.0.tar.gz apr-util-1.5.3.tar.gz pcre-8.33.tar.gz httpd-2 ...

  8. 把 Maven 提交到项目?Maven Wrapper的使用与好处

    本文收录于 Github.com/niumoo/JavaNotes,Java 系列文档,数据结构与算法! 本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗 前言 ...

  9. uniapp中实现简易计算器

    uniapp中实现简易计算器主要问题:在计算器的实现过程中会遇到小数点计算精度:此计算器是依赖了uni-popup的弹出层插件,可在uniapp官方组件中查找扩展插件popup弹窗层下载,也可直接点击 ...

  10. 【笔记】Linux基础指令

    Linux基础指令 cd 跳转文件夹 cd 到根目录 cd usr 到根目录下的usr目录 cd .. 到上一级目录 cd ~ 到home目录 cd - 到上次访问的目录 sh 执行sh命令 ls 查 ...