内核模式驱动程序的网络结构 .
http://blog.csdn.net/chenyujing1234/article/details/7818092
转载请标明是引用于 http://blog.csdn.net/chenyujing1234
欢迎大家拍砖!
1、Windows 2000 网络结构和OSI模型
Windows 2000网络结构是以国际标准化组织(ISO)制定的七层网络模型为基础的,1978年,ISO制定的开放式系统(OSI)参考模型,将网络描述为一系列的协议层,在每个协议层中完成一系列的特定功能。每一层都向上一层提供明确的服务,同时将本层服务的实现封装起来.一个在相邻层之间完善的接口定义了下层对上层所提供的服务以及如何访问这些服务。
(应用层,表示层,会话层,传输层,网络层,链路层,物理层,物理介质 图2.1 OSI参考模型)
Windows 2000的网络驱动程序实现了这个网络结构的下面四层:
物理层
这是OSI模型中的最底层,这一层用来通过物理介质接收和发送的原始的没有结构的二进制数据流,它描述了对于物理介质的电/光,机械和功能的的接口,物理层为所有的上层传送信号,在Windows 2000中,物理层通过网络接口卡(NIC)来实现,物理层的收发是依缚于NIC介质的。使用串行端口的网络组件,物理层也同样包含了底层的网络软件,它定义了串行位流是如何分成数据包的。
数据链路层
电气电子工程师协会(IEEE)将该层进一步分成了两个子层,LLC和MAC。
LLC子层用于将数据帧从一个结点无错的传输到另一个结点。LLC子层用来建立和终止逻辑链接,控制帧流,对帧排序,接收帧,并且对没有被接收的帧进行重发。LLC子层使用帧应答和帧的重发为经过链路层的上层提供了真正的无错发送。
MAC子层控制物理介质的访问,检查帧的错误,并且管理接收帧的地址认证。在Windows 2000网络结构中,逻辑链路控制子层在传输驱动程序中实现,而介质访问控制子层则在网络接口卡(NIC)中实现,NIC由一个名为NIC驱动程序的设备驱动程序软件控制。Windows 2000的附带了许多常用的NIC的驱动程序。
网络层
这一层控制着子网的运作,它基于以下因素决定数据的物理路径:
·网络状况
·服务优先权
·其他因素,包括路由、流量控制、帧的分解和重组、逻辑到物理地址的映射、用户帐号。
传输层
这一层确保信息传送的无错传输,连续传输和不丢失或不重复。它使得上层协议与上层协议之间或与它同层的协议之间通讯不必关心数据的传输。传输层所在的协议栈至少应包括一个可靠的网络层,或在逻辑链路控制子层中提供一个虚电路。例如,因为Windows 2000 NetBEUI传输驱动程序包括一个与OSI兼容的LLC子层,它的传输层的功能就很小。如果协议栈不包括LLC子层,并且网络层不可靠,并且/或者支持自带地址信息(例如TCP/IP的IP层或NWLINK的IPX层),那么传输层应能进行帧的顺序控制和帧的响应,同时要对未响应帧进行重发。
在Windows 2000网络结构中,逻辑链路层,物理层和传输层都是通过名为传输驱动程序的软件实现的,它有时也称作协议,协议驱动程序或协议模块。Windows 2000附带了TCP/IP,IPX/SPX,NetBEUI和AppleTalk传输驱动程序。
2、 NDIS驱动程序
网络驱动程序接口说明(NDIS)库将网络硬件抽象为网络驱动程序。NDIS也说明了网络驱动程序间的标准接口,因此它将用来管理硬件的底层驱动程序抽象为上层驱动程序,例如网络传输层。NDIS也维护着状态信息和网络驱动程序的参数,包括指向函数的指针,句柄和链接时参数块的指针,以及其他系统参数。
NDIS支持以下几种类型的网络驱动程序:
·微端口驱动程序
·中间层驱动程序
·协议驱动程序
2、1 NDIS微端口驱动程序
一个NDIS微端口驱动程序(也叫微端口NIC驱动程序)有两个基本功能:
(1)管理一个网络接口卡(NIC),包括通过NIC发送和接收数据。
(2)与高层驱动程序相接,例如中间层驱动程序和传输协议驱动程序。
一个微端口驱动程序与它的NIC通信,并且通过NDIS库与高层驱动程序通信。
NDIS库对外提供了一整套的函数(NdisXXX函数),这些函数封装了微端口需要调用的所有操作系统函数;
同时,微端口必须向外提供一组入口(MiniportXxx函数),使NDIS可以为了完成自己或高层驱动程序的任务而访问微端口。
发送和接收操作表明了NDIS与高层驱动程序和微端口NIC的相互作用:
(1)当一个传输驱动程序发送一个包时,它调用一个NDIS库所提供的NdisXxx函数,NDIS于是通过调用由微端口提供的合适的MiniportXxx函数将包传递给微端口,然后微端口驱动程序通过调用恰当的NdisXxx函数将包传递给NIC来发送包。
(2)当一个NIC接收到由NIC发给它的包时,它将产生一个由NDIS或NIC的微端口处理的中断。NDIS通过调用恰当的MiniportXxx函数指示NIC的微端口。微端口通过调用恰当的NdisXxx函数把数据从NIC传送到上层驱动程序,并且同时指示上层驱动程序接收包。
NDIS既支持无连接环境下的微端口驱动程序,也支持面向连接的微端口驱动程序:
(1)无连接的微端口为无连接网络介质,例如Ethernt,FDDI和Token Ring,控制NIC。可将无连接微端口进一步分为以下几种子类型:
(1、1)串行化的驱动程序,它依靠NDIS对MiniportXxx函数调用进行串行化,并管理它们的发送队列;
(1、2)非串行化驱动程序,它自己对MiniportXxx函数操作进行串行化,并且在内部对进入的发送包进行排队。它的意义在于有很高的效率,例如驱动程序的临界区(在一个时间段内只有一个线程可访问的代码区)。
(2)面向连接的微端口为面向连接的网络介质,例如ATM和ISDN,控制NIC。面向连接的微端口经常非串行化的——它自己对MiniportXxx函数操作进行串行化,并且在内部对进入的发送抱进行排队。
一个NDIS微端口驱动程序可以有一个非NDIS的底层:
通过它的非NDIS底层,微端口使用某种类型的接口,例如通用串行总线构架(USB)或IEEEE1394(火线)来控制总线上的设备。微端口通过直接发送I/O请求包(IRPs)到总线或是发送到连接到总线的其他远程设备上来与设备通信。在它的上层,微端口提供了标准的NDIS微端口接口,它使得微端口可以与上层NDIS驱动程序通信。 NDIS也支持广域网(WAN)范围的控制WAN NIC的微端口,有关更多的WAN网络环境的信息。
2、2 NDIS中间层驱动程序
中间层驱动程序一般位于微端口驱动程序和传输协议驱动程序之间。因为它在驱动程序层结构的中间位置,所以既与上层协议驱动程序通信又要与下层微端口驱动程序通信:
(1)在它的下界,中间层驱动程序提供了协议入口点(ProtocolXxx函数),NDIS调用这些函数传递下层微端口的请求。对于一个下层微端口驱动程序,一个中间层驱动程序这时就仿佛是一个协议驱动程序。
(2)在它的上界,中间层驱动程序提供了微端口的入口指针(MiniportXxx函数),一个或多个上层协议驱动程序通过NDIS调用这些函数进行通信。对于上层协议驱动程序,一个中间层驱动程序这时就仿佛是一个微端口驱动程序。
虽然向上层提供了MiniportXxx函数的一个子集,但是事实上中间层驱动程序并不管理物理的NIC。它只是向上层协议提供了一个或多个可以绑定的虚拟适配器。对于一个协议驱动程序,一个由中间层驱动程序提供的适配器就如同一个物理的NIC。当协议驱动程序发送包或向一个实际的适配器时发出请求时,中间层驱动程序将传递这些包和请求到下层的微端口。当下层微端口向上发出接收包的指示、响应协议请求的信息或指示状态信息时,中间层驱动程序将这些包、响应、和状态指示传递给绑定在虚拟适配器上的协议驱动程序。
中间层驱动程序有如下几种典型使用方法:
(1)在不同的网络介质间进行转换
例如,处于Ethernet和Token Ring传输层及一个ATM微端口之间的中间层驱动程序的功能是将Ethenet和Token Ring的包转换为ATM包,反之亦然。
(2)过滤包
一个包调度器是中间层驱动程序用作过滤驱动程序的很好例子。包调度器读出每个传输层传下来的发送数据包和每一个由微端口指示的接收包的优先权。然后包调度器以它的优先权调度抱的接收和发送顺序。
(3)在多个NIC间平衡包的负载
负载平衡驱动程序向上层传输协议提供了一个虚拟的适配器,但实际上它却将包分配了给多个NIC。
2、3 NDIS协议驱动程序
一个网络协议在NDIS驱动程序层次结构中属于最高层驱动程序,而它经常在实现传输层协议的传输驱动程序中被用作最底层的驱动程序,例如TCP/IP或IPX/SPX。一个传输协议驱动程序分配包,从应用程序中将数据拷贝到包中,并且通过调用NDIS函数将这些包发送到低层驱动程序中。协议驱动程序也为从下层驱动程序中接收包提供了接口。一个传输协议驱动程序将接收到的数据转换成相应的客户应用数据。
在它的下层,协议驱动程序与中层网络驱动程序和微端口NIC驱动程序相连接。协议驱动程序调用NdisXxx函数来发送包,读取和设置由低层驱动程序所维护的信息,以及使用操作系统服务。协议驱动程序也提供了一套入口点(ProtocolXxx函数), NDIS代表下层驱动程序调用这些函数为自己或向上指示接收包、指示下层驱动程序的状态、以及与协议驱动程序进行通信。
对于上层,传输协议驱动程序对高层驱动程序提供了一个私有接口。
3、 TDI驱动程序
TDI客户是内核模式的驱动程序,例如Redirector和Server,它通过TDI与传输层相接。TDI简化了TDI的开发传输驱动程序的工作。同时它也通过减少必需编写的传输层相关代码的数量来简化开发客户的工作量。
传输驱动程序提供了仅可被TDI客户方所使用的TDI接口。为了提供更多的接入传输层的方法,Windows 2000为当前较通用的网络接口,Windows Socket和NetBIOS提供了仿真器模块,每个仿真器模块提供了它自己的一套函数,在用户模型中,可以通过标准的调用机制来调用它们。当调用它们时,仿真器模块将自己的函数和相关参数以及程序控制传递给TDI函数,然后通过IDL调用相关的传输驱动程序。
为了提高它的性能,TCP/IP和IPX/SPX的实现也作为TDI传输驱动程序的一部分。
4、网络驱动程序环境
4.1 无连接环境的网络驱动程序
无连接环境是为无连接介质例如Ethernet和Token Ring所提供的标准的网络驱动程序环境。
4.2 面向连接环境下的网络驱动程序
NDIS支持以下几种面向连接的驱动程序:
(1)面向连接的微端口;
(2)面向连接的客户方;
(3)呼叫管理器;
(4)集成的微端口呼叫管理器(MCM);
面向连接的微端口控制着一个或多个网络接口卡(NIC)并且在面向连接协议(面向连接的客户方和呼叫管理器)和NIC硬件之间提供了一个接口;
呼叫管理器是一个NDIS协议,它对面向连接的客户方提供了呼叫的建立和断开服务。呼叫管理器使用面向连接微端口的发送和接收功能来与网络入口,例如网络交换机实体或远程的对等层交换信令消息。一个呼叫管理器支持一个或多个信令协议,例如,ATM论坛所提供的ATM UNI3.1
MCM驱动程序是一个面向连接的微端口,它也对面向连接的客户方提供了呼叫管理服务。虽然一个MCM对客户提供的面向连接的服务与一个呼叫管理器伴随一个面向连接的微端口提供的服务相同,但是呼叫管理器/微端口接口是在驱动程序内部的,因此对于NDIS是不透明的。
多个呼叫管理器和/或MCM可以共存在同一个环境下,并且每个呼叫管理器或MCM可以支持多个信令协议;
一个面向连接的客户方使用呼叫管理器或MCM提供的呼叫建立和断开服务。一个面向连接的客户方同样也使用面向连接的微端口或MCM的发送和接收功能,来发送和接收数据。
面向连接的客户方与一个无连接协议的共同点在于,对于它的上层应用,它们都提供了自己的网络和传输层服务,但是,不同于无连接协议的是,面向连接的客户方对于它的下层,它使用了呼叫管理器和面向连接微端口服务或它使用了MCM服务。
一个面向连接的客户方可以是一个在早期协议和面向连接NDIS之间的一个适配层(它可以是一个中间层驱动程序)。这种适配层的例子如IP/ATM和LAN仿真器(LANE),它们都对下层连接使用了呼叫管理器服务,但对上层非连接协议都隐藏了面向连接特性的接口。鉴于这样的面向连接客户方的上层接口定义已超出了NDIS文档的范围,如果一个客户方正作为一个适配层服务的的话,那么它的上层接口应是由适应面向连接的NDIS的上层协议定义的。
4、3 WAN网络驱动程序的环境
]