??xml version="1.0" encoding="utf-8" standalone="yes"?>
?? jbwang
?? 2009-11-23,11:22:25
?? http://bbs.pediy.com/showthread.php?t=101794
做了一些东西自׃看了一些书Q最qȝ了一下,想给大家分n一下,高手可以飞过了。如果有什么问题可以给弟指正一下,多谢Q?img alt="" src="http://m.shnenglu.com/images/cppblog_com/shaker/022211_0647_Windows1.gif" />
在介lWindows|络体系架构之前Q我首先介绍一下Windows中的两个重要~程规范——TDIQNDIS.Q然后再介绍|络体系的架构?br />TDIQTransport Driver InterfaceQ传输驱动程序接口。\Windows\System32\Drivers\Tdi.sys
在实现网lAPI驱动E序Ӟ׃牉|到很多不同协议,会用C同协议驱动提供的接口Q得开发的工作复杂化。所以Microsoft在网lAPI驱动E序和协议驱动之间又增加了一层TDI。TDI接口只是一U?网l请求格式化成IRPQ以及申Ll地址和数据通信"的做法规范化。遵从TDI标准的传输协议向他们的客P如Socket emulatorQNetbios emulator{)导出了TDI接口Q有利于上下层之间的通信Q?br />?nbsp; 一斚wQ对于TDI上层的网lAPI驱动E序׃需要用所有协议驱动程序所提供的接口,直接使用TDI提供的统一接口?br />?nbsp; 另一斚wQ对于下层协议驱动程序(也称为TDI Transport Provider传输器)直接由TDI接口来调用,发出h?br />

在Windows VISTA版本之后QTDI׃再用了Q取而代之的是Windows filter platform和Winsock kernel?br />
NDISQNetwork Driver Interface SpecificationQ网l驱动程序接口规范,在操作系l中的位|?br />\Windows\System32\Drivers\NDIS.sys
当一个协议驱动程序想要按照其协议的格式解析网上读写的数据Ӟ而这些数据必通过|络适配器才能取得,期望协议驱动E序能够理解市场上的每一Ƅl适配器的l微区别是不可能的。所以在1989q_由Microsoft?Com联合开发的了NDISQ得协议驱动程序可以以一U与讑֤无关的方式来跟网l适配器驱动程序进行通信。遵从NDIS的网l适配器驱动程序称为NDIS minport driver?/span>
NDIS规范实现了与TDI标准cM的功能,都是复杂的下层调用规范化、标准化Q大大提高了Windows操作pȝ的可扩展性和兼容性。也表现在两个方面:
?nbsp; 对于下层Q让|络适配器制造商很easy的开发自q讑֤驱动E序Q也是Ndis miniport driver。这些miniport driver直接利用NDIS提供的接口发送指令,NDIS对这些格式化的指令进行解析,做进一步处理。(q些处理到了HAL了)
?nbsp; 对于上层Q多个协议驱动程序与下层minport driver之间的通信Q也都是通过l一的NDIS接口QNidsAllocatePacketQNdisSend{函数来收发数据?br />
废话两句QTDI和NDIS两大接口规范Q有力的提升了Windows操作pȝ对不同设备厂商的支持Q降低了讑֤厂商对设备驱动程序开发的隑ֺQ也增加了对于不同网l协议的支持Q给用户更强大的|络功能支持。这U设计我们也可以在Windows存储理中看刎ͼ从中我们g可以了解C些,Windows操作pȝ在商业上取得成功的原因。Linux操作pȝ中没有这L驱动层次l构?br />
讑֤刉商开发的Ndis miniport driver直接调用NDIS库中的接口函敎ͼ因此不需要考虑重入的问题,是一个请求尚未结束的时候,新的h又进来了。NDIS库对hq行了序列化Q但是这U序列化也妨了多处理器的扩展性。所以NDIS5中提供了非序列化的操作项。下面,我来介绍一下,Deserialized和Serialized minport driver的区别:
Deserialized NDIS miniport driver自己序列化对MinportXxx函数的操作,排队和管理多个ƈ发请求的d都由驱动E序自己来完成。而Serialized NDIS miniport driver以上的工作都是依赖于NDIS库来完成的。从性能角度看,Deserialized NDIS miniport driver的性能是Serialized NDIS miniport driver性能?倍多Q所以到NDIS6.0之后的所有Miniport driver都是deserialize的?br />
以上是我参考MSDN以及自己的一些理解画出来的windows|络架构图,下面我就从上C来简单介l一下其中的各个层?/span>
1. |络应用E,Network applicantionQ用h的应用E序调用Windows操作pȝ提供的网lAPIQ网lAPI包括Q?br />a) Windows套接字(winsockQ?br />b) q程q程调用RPC
c) Web讉KAPI
d) 命名道和邮件槽
e) 其他|络API
q些API既可以在用户模式下实玎ͼ也可以同时在用户模式和内核模式下实现。从本质上说q些API是下层提供接口的另一层封装而已?br />2. TDI ClientsQ传输驱动程序接口客P是内核模式的讑֤驱动E序Q用于实现网lAPI的内栔R分。将|络API的请求{换成IRPQ通过TDI标准格式化后Q发送给下层的协议驱动(也就是TDI传输器)。从sockets emulator的架构图看到QTDI Clients的实现可以有用户态的部分Q也有内核态的部分。AFD辅助功能驱动E序通过向协议驱动程序发送TDI IRP来执行网l套接字操作Q比如发送和接受消息。AFD没有不是定使用哪一个协议驱动,而是上层通知其要使用的协议名Uͼ然后AFDL开相应协议的设备对象?/span>
3. TDI Transport Providers、TDI传输器、NDIS协议驱动E序、协议驱动程序,所有这些其实就是指的同一个东西,我在后面q其ؓ协议驱动E序。这个部分就是我们对某个协议的具体实现部分。做q网l协议开发的朋友一定知道,协议其实是双发协商好的一套通信的规则。以IP协议ZQ实际上是对网l数据的一U处理方式,Ҏ|络数据包的解析l构Q做出相应的处理。Windows的tcpip.sys实C多个协议Qip、tcp、udp、arp、icmp、igmpQ它Z层的TDI Clients提供?个设备对象,用于讉K使用q些协议QTDI Clients打开q些讑֤对象Q向其发送IRPh来实现自q操作。通过DDK的DeviceTree我们可以得到q些讑֤对象
a) \Device\Rawip
b) \Device\Tcp
c) \Device\Udp
d) \Device\IPMULTICAST
e) \Device\Ip
协议驱动E序处理的数据是通过NDIS库中提供的接口来获取的,不需要发送IRP来取得。在DDK XP中提供了一个协议驱动程序了源程序NdisuioQDDK XP后的版本提供的是Ndisport。在DriverEntry中我们可以看刎ͼ驱动E序一开始就注册了一个NDIS_PROTOCOL_CHARACTERISTICSQ这个结构体中是一堆NdisXxxx函数。NDIS规范在这里就开始发挥它的作用了?br />协议驱动E序的另一个作用就是监听网l数据,自己开发一个网l协议通过Ndis API获得所有的|络数据Q但是不能够拦截|络数据Q因为其他协议驱动也可以通过Nids API获取数据。一个典型的应用是Winpcap了,使用NPF.SYS来捕Ll数据,q且做好充分~冲处理Q防止大数据量到来时出现数据包丢q情况。详情情节winpcap的开源代码?br />具体的协议驱动开发过E,我就不细qCQ大家可以参看Ndisuio和DDK docQ我推荐boywhp的一文《NDIS协议驱动开发》给大家?br />4. NDISQNetwork Driver Interface SpecificationQ网l协议接口标准。从图中我们可以看到包裹在其中的两个驱动E序Q一个是NDIS intermediate driverQNDIS中间层驱动程序,另一个是NDIS minport driverQ小端口驱动E序。下面简单介l一下这两个驱动E序Q?br />a) Ndis intermediate driverQNDIS中间层驱动程序,对于上层的protocol driver它充当minport driver的作用,对于下层的minport driver它充当一个protocol driver的作用,所以在驱动E序DriverEntry中就注册NDIS_PROTOCOL_CHARACTERISTICS和NDIS_MINIPORT_CHARACTERISTICSQ用protocol characteristics中NDIS API从miniport driver那里取得数据包,再用miniport characteristics的NDIS API向上层的protocol driver发送数据包。Nids intermediate driver最大的优势是所有miniport driver的数据包都要通过它这里倒手lprotocol driverQ所以网l防火墙q上了q块风水宝地。现在很多网l防火墙都用NDIS intermediate driver做数据包的过滤和拦截工作Q过滤的规则讄到MPSendPacketsQPTReceiveQPTReceiveRacketq三个函数。具体开发过E请大家参考DDK提供的PassThru源代码,www.ndis.comQ?nbsp;|上有很多相关的资料?br />NDIS 6.0之后Qfilter driver取代了Ndis intermediate driverQWDK中提供源码?br />b) Ndis miniport driver一般是p备厂商提供的Q在DDK中也提供了miniport driver的一个例子e100bexQ支持Intel EtherExpressTM PRO/100+ Ethernet PCI adapter 和Intel EtherExpressTM PRO/100B PCI adapter两款|络适配器?br />5. 最后介l一下ȝQ计机ȝ有好几种QUSBȝ、ISAȝ、PCIȝ、虚拟ȝ{,一般都是以PCIȝ作ؓҎȝQ在Windowspȝ中其他的ȝ可以理解为PCIȝ上的一个设备。PCIȝ作ؓҎȝQ其传输速度较高Q可以达?33MB/SQ显卡和|卡很多都是用PCI插槽?br />PCI-ISA桥设备,也称为南桥,实现了ISAȝ与PCIȝ的桥接, 南桥q包括终端、IDE、USB、DMA{控制器讑֤。其中USB-HOST讑֤实现了USBȝ和PCIȝ的桥接。HOST/PCI桥称为北桥,是主处理器中心啊到基PCI局部ȝ。南桥和北桥l成了主板的芯片l,通过芯片的扩展实C多种ȝ与基PCI局部ȝ的桥接?br />ȝ驱动E序和PNP理器实Cx即用的功能,物理讑֤对象PDO是由ȝ驱动E序产生的?/span>