网络分析技术揭秘 ——原理、实践与WinPcap深入解析
过去我一直在从事软件开发相关的工作,主要负责软件开发、软件测试及软件工程的研究。其中包括Windows操作系统应用软件的开发,Linux操作系统应用软件与驱动程序的开发,并且还做过一些嵌入式软件开发。在这些工作中,我会协助其他开发人员、测试人员构建达到工业级标准的软件,或者帮助他们提高软件开发或测试的技术水平。期间,我们不断遇到各种各样的问题,有的可以轻松解决,有的却要绞尽脑汁才能解决。在这个过程中,我也一直在思考一个问题,那就是:
软件开发人员与软件测试人员除了要对应用程序有清晰的理解外,是否还需要对支撑应用软件运行的操作系统、共享库等有深入的理解?
我想,可以以我亲身经历的两个案例为例来回答这个问题。
案例1:嗅探软件掉包问题
某自行开发的网络数据包嗅探软件在对被测设备进行数据包分析时、发现有掉包现象,但被测设备运行正常。经过我们仔细分析,发现该嗅探软件的设计有如下问题:在软件架构的设计上,没有考虑在高速网络流量情况下应该采取一定的措施来防止掉包现象。
软件测试人员对该嗅探软件进行了各种优化,比如增加缓冲区的大小、降低显示的复杂度、分析代码性能瓶颈等,但效果都不明显。后来,通过对所调用的WinPcap库的仔细分析,获得以下解决方案:让WinPcap的内核驱动程序NPF实现协议过滤,而不是通过嗅探软件进行过滤,同时在内核中实现数据包的存储,而不是导入应用层后进行存储。这样可显著地降低内核空间与用户空间进行数据交互的时间耗费。
该案例提醒我们,测试人员在开发测试工具时,需要对所使用的支撑软件有深入的理解,这样才能更好地解决所遇到的实际问题。内核层的过滤与转储功能是WinPcap库NPF驱动程序提供的优化功能,可以缓解捕获高速网络流量的掉包问题。
案例2:A/D转换器(模拟数字转换器)数据采集系统掉点问题
某基于嵌入式Linux系统实现的A/D转换器数据采集系统,在对所采集的数据进行存储时,出现掉点现象。经过仔细调试,我们发现采样率还不到所要求的一半时就开始出现掉点现象了,且采样率越高掉点现象越严重。
由于项目组相关人员对Linux驱动程序的机制了解不够深入,应用层软件开发人员对软件进行的各种调优都收效甚微。相关人员曾一度怀疑这一现象是文件系统存储速度慢导致的,即是硬件问题导致的,项目陷入困境。后来,在对A/D转换器驱动程序进行仔细分析后,发现导致问题的原因是:内核缓冲机制不对,同时内核向用户层提交数据耗时。最终的解决方案是:采用双缓冲机制,并直接在内核存储所采集的数据。
该案例提醒我们,开发人员开发软件时,需要对底层系统软件有深入的理解,这样才能有效地开发出高性能的软件。Linux驱动程序所采用的实现机制对用户层软件性能的影响非常大。Linux针对不同的应用类型提供了多种不同的解决方案,我们需要学会选择。
看了上述案例,再来回顾一下我前面提出的问题:软件开发人员与软件测试人员有必要对支撑应用软件运行的操作系统、共享库等有深入的理解吗?答案是肯定的,尤其对于从事软件系统架构设计与分析、软件故障问题定位与软件性能评测的高级开发人员与高级测试人员来说,这些都是一定要掌握的基础知识。在软件系统日益复杂的今天,浅尝辄止的人是不可能在技术上有所成就的。
但是,如何进行这种有效的、深入的学习呢?尤其是对于软件行业中的“菜鸟”而言。在Linux平台下,我们可以查看几乎所有的源代码,从资源的角度来说,学习相关知识并无太大难度。但是在Windows平台下,资源的不透明首先就阻止了你前进的脚步。
计算机网络的迅速发展,使网络安全、网络性能、网络软件质量等相关问题也随之凸显。这些问题也越来越受人们的关注,并且逐渐成为网络应用所面临的严重问题。正是在这种形势下,网络分析逐渐成为一门独立的、专门的学科,而市面上目前还没有该学科的相关书籍。
那么,如果把这两方面的问题进行有机的结合,这样可使读者既能深入地学习软件技能,又能全面了解网络分析专业各方面的技术,岂不是鱼肉熊掌可兼得?我经过长时间的探索发现,对WinPcap开源库的源代码进行深入的、仔细的分析,并熟悉网络分析专业知识,可显著加快学习的步伐。
本书十分重视实践性。除了使读者熟悉网络分析技术外,书中还以开源软件WinPcap为基础具体演示了网络分析各项技术的使用方法和实现原理,方便读者学习。这样安排是希望读者跟着书本内容进行实践,能尽快将所学知识运用到实际的工作中去。