第一次写技术相关的博客,不足之处还请担待并告知。数组
在开始以前,先简单介绍一下NetAnalyzer, NetAnalyzer是一款集网络数据采集、报文协议分析、统计、网络流量监控于一体的网络管理工具软件,你能够直接认为NetAnalyzer就是中文(简化)版的Wrishark,哈哈,有点夜郎自大了,不过不要在乎这些细节。缓存
接下来看看我在代码中的一段注释:安全
1 /* 2 * 项目开始时间:2011-09-17 3 * 2.0发布时间: 2011-10-04//扬帆起航 4 * 2.1发布时间: 2011-10-20//成长之旅 5 * 2.1.3.10发布时间: 2011-12-06//软件发布 6 * 2.2.0.11发布时间:2011-12-23 //三站点同时发布 7 * 2.4 扩展 8 * 2.5 实用性 9 * 2.8 普遍性 10 * 2.9 初步商业级别 11 * 2.10 创建完整的软件环境 12 * 做者:冯天文 13 * 14 */
注意,该项目是从2011年09月开始的,并且版本是从2.0开始,,这是为何呢?且听我慢慢道来, 好久好久之前……网络
刚学JAVA程序设计,由于老师的讲解并非很完全,不少东西都须要本身去找资料学习,因而便找到了一些教学视频,经过视频来学习JAVA,在讲到Socket通讯时,讲解人就顺便说了一些网络传输数据包的问题,虽然本身是网络专业,但本身只是大一的学生,好多东西都感受很高深,这也算是第一次接触网络抓包的概念。2010年下半年开始进入了大二,开始有了一点写程序的功底,天天都乐此不疲的写着一些小玩具,但历来未曾作出一款值得炫耀的东西,这种状态持续了很长一段时间。大概是在9月份左右,班上一位朋友偶然看到我在写程序,因而让我加入他们组去参加一个比赛,他当时正在找人,我绝不犹豫就答应了。就在国庆前夕,学院老师给出了几个课题,有分形图设计,有物联网的,也有P2P对等交换技术的,固然还有网络协议编程的,由于考虑到咱们本身的专业性,因而选择了网络协议编程,而且给每一个团队分配一个指导老师,在与老师的谈话中了解到,咱们暂时要作一个基于Winpacp的简单网络嗅探器。架构
记得当时本身很兴奋,由于当时听起来,若是制做出这样一款软件的确有着很大的成就感。然而完事开头难,虽然已经大二了,可是尚未开设关于网络的专业课,因此一切关于网络的概念都是零,因而发扬老传统,在网上找相关的资料本身学习,国庆期间推掉了一切出行计划,早晨早早就起来,从网络基础开始学习,由于知识触及太广了,不少都看的似懂非懂,然而本身仍是坚持下来,当假期结束后,已经有点头绪了,而且学会简单的使用一些网络协议分析工具如:Wireshark,Sniffer等,并结合已经学到的知识,也能作一些简单的协议分析了。app
貌似一切均可以开始了,因而开始去尝试看Winpcap的开发文档,记得当时看到的时候感受一团糟,示例代码是用C写的,其中不管函数名称,仍是变量名称都感受很别扭,不过仍是大概能够看得明白。首先天然是从获取网卡的开始,那仍是比较短的示例代码,按照文档上面的提示,花了差很少两天的时间才配置好环境,终于将那段代码调试通,当网卡的信息显示在那黑黑的控制台上时,特别激动。框架
因而马不停蹄调试出了数据采集的控制台程序。可是显示的数据全是原始的数据,只是用十六进制的方式展现出来,若是只是显示出来并没用多大的意义,我须要把这些数据保存下来,而且须要把这些信息分析出来,因而立刻改写了程序将这些数据以文本的方式将获取的网络信息写在文件中。而后使用C#作了一个字符串解析的工具,来分析这些数据,该解释工具经过启动进程的方式,启动控制台程序采集数据,并将其保存在文本文件中,而后再将文件加载入解释器中,分别提取个字段进行分析。该解释器,已经提取了以太网中三个字段的的数据:目标MAC,源MAC,上层协议类型等数据。函数
图1.2被鄙视的文本解释工具工具
当完成了这个工具,兴致勃勃的让老师看的时候,却彻底被无情的鄙视了一通,然而我却执拗的认为这个小工具仍是有意义的,至少让本身在数据采集设计上迈出了一大步。虽而后来作了不少数据采集的工具,但这个始终保留在本身写的数据采集工具文件夹中。这个小工具的采集数据的程序是惟一用C写的,也真正是按照本身理解的方式运做的。然而如今想来,这倒是当时的无奈之举。由于学完的JAVA,感受在作Windows桌面程序,并非很好,因而自学了C#,这也能够解释我为何会使用C#做解释器的问题了。其实开始是想过使用C++经过MFC来制做的,但若是再从新去学习一门语言,入门可能不是难事,但若是要达到驾轻就熟的地步却须要慢慢的积累,不假以时日是不可能的,而坚持本身作的原有的那个确定是不能够的,整个又陷入了两难境地。
有一天,抱着试试看的心情,在网上找看看是否有有人提供相关的技术支持。因而发现了分装了Winpcap的.Net类库SharpPcap,该库是将Winpcap提供的接口利用.Net技术进行了分装,从而能够直接在C#中应用。
接下来全部的开发都转移到.Net平台上了,而且立刻找到了开发者的开发文档,虽然都是英文,不过花了几天的时间总体仍是能够看得懂的,文档中提供了相关示例代码,真是柳暗花明又一村,新一轮的编程立刻开始,不过有了上次的教训,此次作就有必定的经验了,而且有文档的帮助,作起来也有了底气,因而通过十几天的构建终于第一个能够称之为数据抓包软件snifferSharp v0.5版本终于完成了,该软件基于SharpPcap3.3版本,该软件已经实现了
图1.3 snifferSharp v0.5软件
最初的目标,并且增长了协议的解析,软件中设置专用的结构来提取数据包的协议字段,由于当时本身的知识层次的限制,因此只提取了一些简单的字段进行分析,并将其显示在一个文本框中,方便用户使用,该种设计方式,曾对后来多款软件的有很深的影响。由于使用过Sniffer pro 和Wrieshark其中有一个十六进制显示的窗口,故而,在该软件中也开辟了十六进制显示窗口,程序提供了过滤表达式的配置功能,方便用户捕获特定的数据。在后来的软件在该软件上所列出的各类功能都变为基础配置。
固然该软件中有不少不合理的设计,程序中用一个2百万的数组来缓存捕获的数据,这直接致使内存分配不合理,当时其实意识到这一点而已,仍是由于技术水平的问题,未使用动态数组。另外一个是由于UI配置与数据存储之间是直接执行的,及数据在存储完成以后,再提取数据包信息,其实后来除了NetAnalyzer2.0及其以后的全部版本都存在这个问题。在UI显示,这是须要时间的,而这段时间内软件将不能采集数据,这样形成丢包率极大,而且数据提取采用循环等待方式,形成CPU消耗很大。还有一个很重要的问题就是,用于显示采集数据的是WinForm中的ListView控件,每当用数据到来时,该控件都要重回,这也是形成丢包的重要缘由之一。
在以后的几天里立刻完成了snifferSharp v1.0版本,有了前一版本的铺垫,本次并无在原有的基础上改变什么,只是增长了流量监控功能,在该软件中,添加了本身开发的Chart组件,在NetAnalyzer2.X的版本中依然使用该组件,固然,这个仪表盘已经彻底被取代了,而整个组件也由原来的一个,发展为11种,方便各类应用。而在snifferSharp v1.5中针对ListView影响数据采集速度的问题,将程序设置为在捕获数据包的时候先不在界面显示,当单击按钮中止时,再开始在UI显示。此方法相似于Sniffer Pro的处理方式。然而该种方法虽然对数据采集有必定的帮助,但若是采集数据过多,则不得不等待数据的缓慢的在UI上显示。反而不利于数据的即时处理,因而用户不得不花更多的时间去等待数据的解析。
图1.4 snifferSharp v1.0软件
经过snifferSharp系列版本的设计,整个网络数据采集工具的基础架构已经呈现出来,然而伴随而来的总体的表现不尽人意。须要从新架构,包括数据存,UI回显等不少急须要处理的问题。因而本身放弃了继续开发snifferSharp的计划,转而构建了一个全新的数据采集软件系统,这就是CSniffer。该系列软件只出了一个版本,可是,在本身数据采集软件开发过程当中却有着很是重要的意义,由于该种设计方案,包括设计思想,UI设计,在NetAnalyzer中能够找它到影子。
本次还增长了对用于层载荷数据的恢复,其实这也是一次实验而已,然而当看到效果是,仍是有点小成就。这项功能,在后来几经修改后也成了基本配置,到此为止。再后来的NetAnalyzer开发中都有迹可循了。
对于本次的开发虽然是全新的架构,然而依然摆脱不了那些根深蒂固的问题,数据采集效率虽有所提高,但是空间依然很小。并且在设计中,依然使用了原有软件的协议分析结构,因此报文首部解析,如以往同样,总体表现平平。
本次设计的另外一个创新点,就是增长了报文类型分布统计功能。可是由于该功能的增长反而更加影响了软件采集数据的效率,可是该功能仍是被保留下来了。由于总会有办法来处理的。这也成为后来NetAnalyzer着重要解决的问题之一。
至此NetAnalyzer以前的全部本身制做的网络数据采集软件所有介绍完成了,事实上包括测试等各类数据采集软件不止这些,由于在制做过程当中或修改或删除,只保留了比较典型的几款,也算是比较典型的的几款做为NetAnalyzer发展路上的奠定者。事实上世界上全部的事情都是从无到有,再从有到经典,“不积跬步,无以致千里;不积小流,无以成江海。”若是没有以上这些软件的支撑,本身独立设计NetAnalyzer恐怕只是纸上谈兵的事情。从开始感受高深莫测,到完成一个不是程序的程序,由原来漏洞百出,到一个能够构成完总体系的框架,以致于如今我须要编写相关的说明来辅助管理整个系统,这不仅是软件的发展,更是本身的技术的提高,认识的飞跃。站在今天的角度上,感受之前的软件确实有很多瑕疵纰漏,并且整个程序都谈不上设计,再看看如今完成的NetAnalyzer感受是尽善尽美。也许有一天再回过头来看看如今的软件是,也许和如今看之前的程序同样吧。也许这样会显得很悲观,可是只有看到程序软件的不足,才是真正的进步,也才有发展的空间。
在完成了CSniffer以后,准备要接着进入第二个版本的时候,小组须要一款抓包软件来完成课题。因而就中止了对CSniffer的开发,而进入正是进入了一个新的开发阶段。若是按照软件工程的角度,如本身这般乱来确定是不能够的,说是一个新的开发阶段,实际上就是重建一个解决方案,简单完成了界面设计就急急忙忙开始了编码,并无进行完整的设计分析,所幸整个过程已经轻车熟路了,立刻就完成了基础编码, 并且整个软件仍是比较简单因此用了查不到一个礼拜的时间就完成了软件的设计,本次设计使用了大量的新技术,而且设计出了NetAnalyzer的标准UI,规定了必需要提供的窗口布局位置,并且采用分页方式分别展现软件的主界面与数据处理界面,基本上把CSniffer中实现的四个页面的内容放置在两个页面内,增长了版面的利用率。
相对于UI设计,此次更注重性能的提高,首先天然考虑的是网络数据采集效率的问题,在以前的软件中,这始终是一个没法逾越的鸿沟。然而本次软件设计很大程度上已经解决了该问题,本次数据获取由原来一直使用的循环监听方式变为事件触发通知方式,这样在没有数据报文到来的状况下,整个系统开销减少,当有数据当来,则通知对应的数据存储结构提取数据,这样使数据保存更为灵活,其余线程调用数据时也不会有太大的影响。在界面显示方面该软件摒弃了冲毁频率极高的ListView控件,改成缓冲很小的控件。NetAnalyzer1.X版本的采用分层方式,数据采集于数据分析并不在同一个界面,当数据采集完成以后,将其提交给协议分析界面,不事后来发现,在该界面显示数据的同时,主界面也在同步显示数据,后来发现是由于传值是应用类型的问题,因此在第二版本中取消了该种方式。
图1.8 NetAnalzyer1.3数据采集界面
本次另外一个特色就是完善了载荷数据的提取,提供了不一样编码方式的转换,考虑到该软件应用于网络层与传输层,因而并无花更多的时间去处理应用层协议的数据提取功能。本次数据包分析依然使用最初的分析结构,可是对其中的结构作了一些调整,使其更加符合协议中的分布。
NetAnalyzer的第一个版本是在2011年1月初作的,后来陆续作了一点小修改,直至9月一直在使用该版本,而在功能方面,近乎少的可怜,其实在此期间一直打算从新构建NetAnalyzer但一直停留在头脑中。后来从新设计念头是由于假期在和老师作项目的时候,发现本身的一些软件设计方法,有很大的问题,如:急于编码,不作前期分析,软件层次模糊,数据抽象能力不够等。这也让本身意识到软件开发的真正意义。
在9月份中旬开始了NetAnalyzer第二版的前期设计,在总结了上个版本的基础上,规划了架构方式,本次使用组件方式来处理处理不一样的任务。固然此次仍是没有写文档,只是作了一点小小的规划就开始,这也是后来整个软件愈来愈很差维护的缘由。过再后来的设计中逐步又分离出了了一些组件,从而下降了资源的占用率。并将某些组件制做为独立的工具,供系统外直接调用,如流量监控工具,编码转换工具,应用层协议配置工具等,而对于一些组件则须要在不一样的工具中或主系统中被调用,因此将这些也以组件的方式分离出来,供给不一样的工具使用,如:过滤表达式配置对话框,异常信息发送对话框等。
图1.9 NetAnalyzer2.2主界面
图1.10 NetAnalyzer2.2 数据分析界面
而事实上,目前已经实现的好多功能并不在开始设计的计划以内,然而随着时间的积累,与本身对种种需求的分析,故不断的增长了相关的功能,在软件工程中,在开始制做软件的时候是要作需求分析,然而本身由于并没用这样的条件,故所增长的功能都只是本身使用的过程当中而逐渐发现的,其实曾经在制做版本中增长了用户留言功能,以方便用户回传本身的想法,然然后来在考虑到安全问题,便放弃了(后面会讲到),固然在最新的版本中已经解决了安全问题。
第二版本的NetAnalyzer已经彻底脱离了抓包软件的概念,按如今的构建结构,整个能够称之为系统环境。由于本次的设计除了最初目标的网络数据采集,协议分析等,增长流量监控,后台数据采集,编码转换等一系列辅助工具,对于流量监控,虽然曾经出现过,可是,在本次的设计中,流量监控已经成了一个独立的体系,随着流量记录文件的加入,该工具已经能够独立使用了。
图1.11网络流量监控工具
经过文件方式记录网络状态,则须要专用的文件解释器处理相关的数据,由于解释器与流量监控工具大同小异故在此不作截图。
另外一个能够独立使用的工具则是编码转换工具,给工具在一开始只是为了辅助主系统完成TCP重组以后处理转换载荷数据编码问题而设立的工具。再后来屡次斟酌下最终以独立工具的方式提供使用,而在主系统中则是经过提供接口而启动传值的。这样能够方便不一样状况使用。该工具提供了Base64 、URL、HTML、等编码与解码方法,而且提供ASCII、GB23十二、UTF-八、Unicode等字符编码方式,在最新版本中增长了MD5消息摘要功能,可分别对字符串和文件进行摘要信息提取。
图1.12 编码工具
对一些共享使用的组件这里只是用过滤表达式配置窗口说明,该组件并不能独立执行,须要加载在其余工具之上,它只提供数据通讯接口,与调用方式,该配置窗口提供两种方式,直接输入方式和填写方式,直接输入方式,适合于熟悉Winpcap过滤表达式格式的人员,这样能够写出功能复杂的过滤表达式,在界面上提供了表达式设置规则的连接,对于不懂的用户也能够直接学习使用。而填写方式则适合入门级人员,经过几个选项,输入指定的一些参数,则可自动生成表达式,使用方便,但只能生成简单是表达式,但能够知足通常需求。在完成后点击“肯定”按钮,系统开始自动检查表达式是否符合规范。不是则提示用户从新设置,若是是则传入须要的位置,并将该表达式作历史记录,以供下次使用,而表达式输入框对一些关键字进行了着色处理,经过不一样颜色标示不一样的原语,防止设置出错和方便出错检查。
图1.13 过滤表达式配置
关于NetAnalyzer的简介到此为止,然而则仅仅是序章。而咱们也仅仅触及其冰山一角。在上面的介绍中,主要侧重了系统的总体的部分,再后来介绍了一些工具组件等,也只是停留在表面上而已,虽然如今人们愈来愈注重用户体验,但做为一款给专业人员使用的软件,更应该注重的是效率与可用性。在后面的讲解中咱们将逐步将这些功能的实现方式展现出来,从而在原理上深刻MetAnalyzer。
总结
“玉不磨,不成器”,软件开发更是如此,在网络数据采集工具开发过程当中,从概念到一个影响,再到一个原始实体,最后到一个完整的软件,并不是朝夕之功,在大约一年半的时间中,本身全身心投入,不断的改进,不断的寻找解决方案,也许进展缓慢,可是至少每次在本身手中产生的工具都比上一个强,这就是进步。其实不是此次硬逼着本身写这本书,本身还真不知道本身尽力了如此之多的困难,若是当时没那么高的热情去投入其中或知足于现状,也许就没有后续的版本,更没有这本书的产生。
NetAnalyzer而今已是2.9的版本,而上一次的发布是2014年的9月份,功能相比当时已经丰富了不少,能力也强大了不少,可是更新也愈来愈慢了,再从2013年6月大学毕业以后只发布了两个简单的版本,也许是工做的忙碌,也许是只是少了那份狂热的追求,以致于如今虽然有不少想法,却也只停留在想象之中,而立刻2015年的9月也来了,特意发一个系列去记念一下那年的热情。