# protocol_analyzer **Repository Path**: duanjunqi666/protocol_analyzer ## Basic Information - **Project Name**: protocol_analyzer - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-12-14 - **Last Updated**: 2021-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # protocol_analyzer 人们使用网络分析软件主要还是在网络故障诊断方面,引起故障的因素多种多样: - 协议栈本身的原因,比如协议栈bug, - 主机原因,比如内存或者cpu不够 - 网卡的原因 - 外部的因素,比如某个硬件温度太高,干扰太大。 现有的网络协议分析软件比如wireshark可以把协议数据展示出来,可以根据协议,端口号等做一些简单过滤,还可以对诸如流量等做统计。借助这样的软件原则上可以找到协议栈的bug,但是对于全面的诊断,就显得不太够。 比如我之前在工控领域遇到的情况,网络故障是偶发性的,每次持续很短时间,然后又正常运转。我拿到手的是收集了一天的TCP数据包,有几个G的大小,从里面诊断出网络故障如同大海捞针。首先借助wireshark要找到提示网络出错的数据包就很困难,找到相应的数据包再推测出故障的原因那就更困难了。 正如前面描述,导致网络故障的因素是多样的,现有的工具不能解决这样的需求,所以我有意要开发一款软件来解决这个问题,我希望这款软件可以达到以下的目标: 1. 能够对用户感兴趣的任何数据进行统计(比如,流量、某些特殊报文,窗口、时间戳等某些报文参数) 2. 软件要容易扩展 3. 提供接口能够将非通信协议数据统计进去,比如内存,温度,等任何可能影响到通信质量的外界信息 4. 能处理自定义的协议数据 5. 能够处理应用层,以及加密的数据。(在非生产阶段,作为一个开发人员,每个人都希望如白箱一样使用软件工具吧) 毫无头绪直到好多年之后。。。机缘巧合的接触到了编译器、编译器的生成器。 编译器是用来处理格式化的数据的,一段Java代码可以看作是一段符合Java语法的格式化数据,Java编译器可以解析Java代码,而编译器的生成器可以根据Java语法文件生成Java编译器,这个生成的编译器就可以处理Java代码。 同Java代码一样,协议数据也是符合特定格式的数据,是不是也可以使用编译器的思路呢? 先定义诸如TCP、DNS等的语法,然后再生成处理TCP、DNS等的“编译器”。这个思路有以下优点: - 使用者只要定义协议的语法就可以扩展自定义的协议。(上面的目标2和4) - 为协议内的所有字段生成一个接口(语法文件定义了所有的字段,比如IP语法,就会有源IP和目的IP字段,生成的编译器就会有parseSourceIP和parseDestinationIP方法)。使用者可以感兴趣的字段对应的接口里将数据发送到UI。(上面的目标1) - 可以定义针对日志的“语法”以及“编译器”,这样可以将温度,性能参数等一并纳入分析范围。(目标3) - 解耦每层协议的解析,协议“编译器”通过单向调用完成全部数据解析。比如以太网“编译器”在处理完mac地址解析后最终会调用IP的“编译器”,IP的“编译器”会调用TCP的编译器,最终会调用到HTTP的“编译器”。调用所传的参数就是对方需要的完整报文数据,在传参之前可以对数据进行解压缩或者解密,在“编译器”内部解析各个字段时,也可以进行解压缩或者解密。(目标5) - 可以对应用层数据进行监控,比如可以对HTTP请求获得的网页使用xpath来获取里面的内容 - 再头脑风暴一下,协议数据分析不仅局限于TCPIP。目前我所处的汽车行业,每天产生大量的总线数据、信号数据,这些数据也是格式化的,有专门的付费软件在做分析。 理想很丰满,怎么做呢?我打算先硬编码这些协议的“编译器”,之后在从中提取出它们的语法,以及设计这些“编译器”的生成器。 至于界面,用JS写吧,整体结构暂时选择了浏览器-服务器模式,Java编程语言。