深度剖析WinPcap之(序言)——分析WinPcap源代码的缘由

来源:互联网 发布:淘宝里面怎么办信用卡 编辑:程序博客网 时间:2024/04/30 11:04
过去我一直在开发软件,包括Windows操作系统的应用软件,Linux操作系统的应用软件与驱动程序,也开发过一些嵌入式软件,并在后来的工作中逐渐专注于对软件的测试工作,主要从事软件测试技术与测试方法、软件工程的研究。在此过程中与其他开发人员、测试人员一同工作,帮助他们构建达到工业级标准的软件,或者指导他们提高软件开发或测试的技术水平。随着不断的遇见问题、解决问题,我也在思考一个问题:
那就是软件开发人员与软件测试人员除了对应用程序需要清晰的理解之外,是否还需要对支撑应用软件运行的操作系统,共享库等有深入的了解?
下面通过我亲身经历的两个案例来考虑该问题:
案例1:嗅探软件掉包问题
某自行开发的网络数据包嗅探软件,在对被测试设备进行数据包分析时,发现有掉包现象,但待测设备运行正常。经过仔细分析,发现该嗅探软件设计有如下问题:针对高速网络流量,从软件架构上就没考虑到如何防止掉包的问题。
软件开发人员对该嗅探软件进行各种优化,比如增加缓冲区的大小,降低显示的复杂度、分析代码性能瓶颈,但都改善不大。通过对所调用WinPcap库的仔细分析,获得下列解决方案:让WinPcap的内核驱动程序NPF实现协议过滤,而不是通过嗅探软件进行过滤,同时就在内核实现数据包的存储,而不导入应用层后进行存储。
该案例提醒我们,在测试人员开发测试工具时,需要对所用的支撑软件有深入的了解,才能更好的解决所遇到的实际问题。内核层的过滤与转储功能是WinPcap的NPF驱动程序提供的优化功能,就是解决高速网络流量掉包问题的。
案例2:AD数据采集系统掉点问题
AD数据采集系统,基于嵌入式Linux系统实现,对所采集的数据进行分析,出现掉点现象。经过仔细调试发现采样率还不到所要求一半时就开始出现掉点现象,采样率越高掉点现象越严重。
项目组相关人员对Linux 驱动程序的机制了解不够深入,应用层软件开发人员对软件进行各种调优,收效甚微,曾一度怀疑是文件系统存储速度慢或硬件问题导致,项目陷入困境。后对AD 驱动程序进行仔细分析,发现导致问题的原因:内核缓冲机制不对,采用双缓冲机制;内核向用户层提交数据耗时,直接从内核存储所采集的数据。
该案例提醒我们,开发人员开发软件时,需要对底层系统软件有深入的了解,才能有效地实现高性能的软件。Linux驱动程序所采用的实现机制对用户层软件的性能影响非常大,针对不同的应用类型提供了多种不同的解决方案。
从上述案例,我们知道问题的答案是肯定的,尤其对于从事软件系统架构设计与分析、软件故障问题定位与软件性能评测的高级开发人员与高级测试人员,这是一定要掌握的基础知识。在软件系统日益复杂的今天,浅尝辄止的学习是不可能在技术上有所成就的。
但是,如何进行这种有效的、深入的学习?尤其是对于软件行业中的“菜鸟”而言。在Linux平台下,我们几乎可以查看任何源代码,所以从资源的角度来说这样的学习并不存在难度。但是在Windows平台下,资源首先就阻止了你的前进。笔者经过长时间的探索,发现通过对WinPcap开源库与Wireshark开源软件的源代码进行深入分析,可显著的加快学习的步伐。
WinPcap 本身带有内核的协议驱动程序NPF、用户层的库packet.dll与wpcap.dll,常用的嗅探软件Wireshark在Windows平台下是基于WinPcap库实现的。通过对WinPcap与Wireshark源代码的分析,至少可带来下列收获:
1)       知其然,还要知其所以然
2)       通过对内核层与用户层的了解,可获得全面的系统概念
3)       获得一个很好的学习途径。可以在任何条件下借鉴、学习与分享别人的经验,在今后的职业生涯中更游刃有余
4)       通过对这些源代码的分析,可以对内核层与用户层的交互具有更深入的了解
5)       对内核协议驱动程序具有更深入了解
6)       对软件的架构具有更深入的体会,<解决特定架构的问题>
 
本系列文章主要用来剖析WinPcap 内核层驱动程序NPF的源代码与分析相关的理论基础,并对用户层packet.dll与wpcap.dll库源代码进行分析。主要涵盖了我认为对提高读者能力最为重要的一些内容,力图使读者通过阅读能够对WinPcap的NPF获得深入的理解,在理解的基础上学到内核层与用户层如何交互、NDIS协议驱动 的编写、相关软件体系架构的设计与实现,当然对WinPcap的使用可达到炉火纯青的程度啦,从而使读者今后遇见类似问题时具有较清晰地解决思路,使技术水平更上一层楼。
 
在这里我不仅会尽力把WinPcap 的源代码分析清楚,同时还会把源代码之外的一些相关知识尽量解释清楚。因为我相信,知道“这样做”是很容易的事情,理解“怎样做”是困难的,但知道“什么时候这样做”与“为什么这样做”那就是专家必须面对的极度困难的问题了。除了把“这样做”弄清楚外,我还会尽力解决后面几个困难的问题。
 
如果你不仅仅是只想做一些应付差事的简单的“玩具”软件,而是对软件的性能与架构有着精益求精的追求,同时不希望在遇到软件“莫名其妙”故障时不致于茫然失措,最后以一句“鬼知道怎么回事”打发别人。那么我建议你仔细阅读这一系列文章,这儿并没有“包治百病”的灵丹妙药,但是如果你对操作系统从内核层到 用户层的交互有一个清晰的认识,能够对支撑应用软件运行的基石有一个深入的了解,问题还能阻挡你吗?
如果你的工作与开发网络软件相关,无论你是开发人员还是测试人员,强烈建议你阅读。这儿可以看到WinPcap开发人员许多“真枪实弹”的搏斗,以争取性能的每一寸土地。了解这些背后的秘密,软件丢包时,你不会再那么无助,数据包发送不出去时,你不再那么孤单。
其实我的本意是指只要是软件开发人员与测试人员,都应该从这儿有所收获,当然我写blog的目的主要是针对软件行业的初、中级人员,所以就不浪费真正的“寂寞高手”的宝贵时间了。
为了更好的学习本书的内容,要求读者:
1) 熟悉C语言。不要求你能编写很棒的C代码,但是对C语言的熟悉会很有帮助。
2) 有一些网络的基本知识。不要求你熟悉网络的各方面,但是对集线器、UDP这些术语有一定的感性认识是会很有帮助的。
 

本文出自 “千江月” 博客,请务必保留此出处http://eslxf.blog.51cto.com/918801/198054