第一部分第二章 内核模式网络驱动器体系结构

来源:互联网 发布:linux 多进程 多线程 编辑:程序博客网 时间:2024/04/30 02:05

第二章 内核模式网络驱动器体系结构

 

       这一章主要描述win2000操作系统和模式下的网络驱动器体系结构。这一章包含下面各节:

 

              Win2000网络体系和OSI模型(2.1节)

              NDIS网络驱动器(2.2节)

              TDI驱动器(2.3节)

              网络驱动器环境(2.4节)

 

2.1 win2000网络体系结构和OSI模型

 

    Win2000网络体系结构是基于由国际标准化组织(ISO)开发的7层网络模型而形成的。1978年以来,ISO开放系统互连(OSI)参考模型描述网络作为一个协议层系列,每一层指派一个特殊的函数集。每一层都向更高层提供特殊服务,同时屏蔽层间服务的实现细节。在相邻层之间定义的接口确定了底层向高层提供的服务,以及怎样访问这些服务。

 

    OSI 参考模型

2.1 OSI参考模型

 

win2000下实现的是这个体系中的下面四层网络驱动器。

 

物理层

 

    这是OSI模型中的最低层。这一层涉及到在物理媒质上发送和接收原始位流。它描述了物理媒体的的光电,机械特性和功能接口。这个物理层携带来自高层的所有信号。在win2000下,物理层有网络接口卡(NIC),收发器,和NIC连接的媒体实现。对于使用串口的网络控件,这个物理层也可以包含底层的网络软件,这些软件定义了低层串行位流怎样划分成数据包。

 

数据链路层

 

    这个OSI层有电力电子工程学会进一步划分成两个子层:LLCMACLLC子层提供了数据帧的无错传输,建立和终止逻辑链路,控制帧流,顺序化帧,应答帧和转发拒绝帧。这个LLC子层使用帧应答和转发来提供虚拟的无错传输。MAC子层管理对网络媒体的访问,检查帧错误,管理接收帧的地址识别。在win2000网络体系中,逻辑链路控制子层是在传输驱动器中实现的。而媒体访问控制子层则是在网络接口卡(NIC)中实现的。NIC由软件设备驱动器控制,称为NIC驱动器。Win2000配有一定数量流行NIC的驱动器。

 

网络层

 

    这一层控制子网的操作。它基于下面判断确定数据应该走的物理路径:

 

        网络条件

        服务优先级

其它因素包括路由,传输控制,帧的分解和组合,逻辑地址到物理地址的映射,和账号的使用。

 

传输层

 

    这一层保证了消息无错误交换,依顺序,不丢失或重复。它替代了一些相关数据传输层的该层协议。一个最小传输层要求协议栈包含可靠的网络或逻辑链路控制子层来提供虚拟路径能力。例如,win2000NetBEUI传输驱动包含一个OSI兼容LLC子层,它的传输层功能是最小的。如果协议栈不包括LLC子层,或如果网络层不可靠或支持数据报(就像TCP/IPIP层或NWLinkIPX层),传输层应该包含帧顺序化和应答以及转发未应答帧。

 

win2000网络体系中,逻辑链路控制,网络,和传输层是由软件驱动器实现的,称之为传输驱动器,有时还涉及到协议,协议驱动器,或协议模块。Win2000封装了TCP/IPIPX/SPX,NetBEUI,和AppleTalk传输驱动器。

 

2.2 NDIS 驱动器

 

网络驱动器接口规范(NDIS)库从网络驱动器中抽象出了网络硬件。NDIS还在网络驱动器各层间指定了接口标准,因而从高层驱动,例如网络传输层中抽象出了管理硬件的低层驱动器。NDIS还为网络驱动器维护状态信息和参数,包括函数指针,Handles和链接参数块,以及其他的系统值。

 

    如图2.2所示,NDIS支持如下类型的网络驱动器:

 

        小口驱动器

        中间驱动器

        协议驱动器

 

        2.2 NDIS驱动器

 

221 NDIS 小口驱动器

 

    NDIS小口驱动器(也称之为小口NIC驱动器)有两个基本的功能:

 

    管理网络接口卡(NIC),包括通过NIC发送和接收数据。

    为高层驱动器提供接口,如中间驱动器和传输协议驱动器等。

 

一个小口驱动器通过NDIS库与它的NIC和高层驱动通讯。NDIS库输出完备的函数集(NdisXXX函数),它封装了所有小口所需要调用的操作系统函数。小口驱动则依次必须输出入口点(MiniPortXXX函数),这些函数是NDIS为自身的目的所需要调用的,或有高层驱动为访问小口驱动所需要调用的。

 

    发送和接收操作说明小口NIC驱动与NDIS和高层驱动之间的交互关系:

 

当传输驱动有一个包需要传输时,它调用由NDIS库输出的NdisXXX函数。NDIS则通过调用适当的MiniPortXXX函数传输这个包到小口驱动。小口驱动则通过调用适当的NdisXXX函数进一步传输这个包到NIC以便发射出去。

 

NIC接收到一个带地址的数据包后,它引起一个硬件中断,这个中断由NDISNIC的小口驱动处理。NDIS通过调用适当的MiniportXXX函数通知NIC的小口驱动。小口驱动则建立来自NIC的数据传输,然后通过调用适当的NdisXXX函数指示接收包绑定到高层驱动上。

 

NDIS在无连接和面向连接两个环境上都支持小口驱动。无连接小口对应无连接网络介质控制NIC,如以太网,FDDI,和TokenRing。无连接小口可进一步划分成下面的子类型:

 

连续驱动,这依赖于NDIS连续调用它们的MniportXxx函数,和管理它们的发送队列。

断续驱动,在它们自己内部连续操作MiniportXxx函数,而队列则全部使用发送包。这也导致更满意的双工性能。导致驱动器临界点(代码为仅仅单线程在一个时刻可执行的点)保持到更小。

 

面向连接的小口驱动为面向连接的网络介质控制NIC,如ATMISDN。面向连接的小口驱动总是断续的——他们总是自己连续操作MiniportXxx函数而队列内则完全使用发送包。

 

    一个NDIS小口驱动可以由一个非NDIS底边(参见图2.3)。

        

        2.3 具有非NDIS底边的NDIS小口驱动器

 

通过它的非NDIS底边,小口驱动使用类接口对总线如通用串行总线(USB)或IEEE 1394(火件)提供设备控制。小口驱动通过发送I/O请求包(IRP)直接到总线或直接到连接到这个总线上的远程设备。在它的上边,小口驱动与NDIS驱动通讯。

 

NDIS也支持小口驱动的广域网扩展,此时的小口驱动管理的是WAN NIC。更多广域网环境的信息参见2.4.3节。

 

2.2.2 NDIS 中间驱动器

 

如图2.4所示中间驱动器典型地位于小口驱动器与传输协议驱动器之间。

   2.4 中间驱动器,位于小口驱动与传输驱动之间

 

正是因为它在驱动器层次结构中的位置,决定了中间驱动器必须与上面的协议驱动和下面的小口驱动进行通讯:

 

在它的下边中间驱动输出协议的入口点(ProtocolXxx函数),这是由NDIS调用来与小口驱动通讯的。因而对于下边的小口驱动,中间驱动器看上去像是一个协议驱动器。

    对于上边的驱动器,中间驱动器输出小口驱动的入口点(MiniPortXxx函数),这些函数由NDIS调用来与一个或多个上面的协议驱动器进行通讯。对于上面的协议驱动器而言,中间驱动器看起来则像一个小口驱动器。

 

中间驱动器输出的只是一个MiniportXxx函数子集,它并不管理物理NIC设备。实际上,它只是输出一个或多个虚拟的适配器,以使上面的协议可以绑定。对于协议驱动器,由中间驱动器表述的虚拟适配器表示为一个物理NIC。当协议驱动器发送包或请求到虚拟适配器时,中京安驱动器传输这些包或请求到下层的小口驱动器。当下层的小口驱动器接收到包,响应协议请求信息,或表示状态时,则中间驱动器传输这些包,响应和状态到绑定到这个虚拟适配器的协议驱动器上。

 

中间驱动器典型的用途是:

        在不同的网络媒体之间进行传输

 

例如,中间驱动器在以太网和令牌网之间的传输功能,ATM小口驱动映射以太网和令牌网的包到ATM包,或放过来,映射ATM包到以太和令牌包等。

 

        滤波数据包

 

数据包调度器是中京安驱动器用于滤波的一个例子。包调度器先于向下传输读取发送包和接收包,然后根据传输设置调度发送和接收的包。

 

        在多个NIC上进行传输平衡

 

负载平衡输出一个虚拟适配器到上层的协议驱动,但是分发发送的包到多个NIC

 

2.2.3 NDIS协议驱动器

 

网络协议在NDIS驱动层次上是最高层驱动器,而在传输协议栈上,他通常被作为最底层传输驱动器来实现,比如TCP/IP IPX/SPX栈。传输协议驱动器分配包,从发送应用拷贝数据到包,以及通过调用NDIS函数发送这些包到低层驱动。协议驱动还提供协议接口来从下一层驱动接收输入的包。传输协议驱动器传输接受的数据到适当的客户应用程序。

 

在它的下边,协议驱动器连接那个姐网络驱动器和小口NIC驱动器。协议驱动调用NdisXxx函数发送包,读取或设置低层驱动维护的信息,以及使用操作系统提供的服务。协议驱动还输出入口点函数(ProtocolXxx函数),NDIS则是当地调用这些函数来为低层驱动向上传输接收的包,和低层驱动的状态,以及其他相关的通讯。

 

在它的上边传输协议驱动器有一个私有接口指向协议栈中的高层驱动器。

 

2.3 TDI 驱动器

 

传输驱动器接口(TDI)定义了可模式下的网络接口,这些是由其上的传输协议栈所输出的(如图2.5)。

 

                2.5 TDI客户层和传输层

 

TDI客户层是和模式下的驱动器,如重定向器和服务器,这一层通过接口与传输层连接。TDI简化了传输驱动器的开发任务,只需要对TDI接口进行编码就可以了。它也简化了客户层的开发任务,只需要编写很小一部分传输层特定代码。

 

仅输出TDI接口的传输驱动器可以尽由TDI客户层使用。为了增强传输层的能力,Windows2000为两个流行的网络接口Winows SocketNetBIOS提供了枚举器模块。每一个枚举器都输出它的核心函数集,这些函数在用户模式下通过标准调用机理是可以访问的。调用时,枚举器模块映射核心函数和相关的参数以及程序规则到一个或多个TDI函数,然后通过TDI调用指定的传输驱动器。

 

对于增强的性能,TCP/IPIPX/SPX传输驱动器是作为TDI核心驱动器而实现的传输驱动器。

 

2.4 网络驱动器环境

 

这一节描述微软Windows2000如下核模式网络驱动器的网络环境:

 

    无连接驱动器

    面向连接驱动器

    WAN驱动器

 

2.4.1 无连接环境网络驱动器

 

2.6显示了NDIS环境下的无连接网络驱动器:

                2.6 无连接网络驱动器环境

 

对于无连接媒体,无连接环境是标准的网络驱动环境,如以太和令牌网。参见第二节关于驱动环境的描述。

 

2.4.2 面向连接环境的网络驱动器

 

NDIS支持如下列出的面向连接的驱动器:

 

        面向连接的小口驱动

        面向连接的客户

        所有管理器

        集成小口驱动调用的管理器(MCM

 

2.7显示了面向连接的客户,调用管理器,和面向连接的小口驱动结构。

                2.7 有调用管理器的面向连接环境

 

2.8 显示面向连接客户和MCM驱动器的结构。

                2.8 具有MCM 的面向连接环境

 

面向连接的小口驱动控制一个或多个网络接口卡(NIC),并且提供面向连接的协议(面向连接的客户和调用管理器)与NIC硬件之间的接口。

 

一个调用管理器就是一个NDIS协议驱动器,它为面向连接的客户提供调用方法和分解服务。调用管理器使用面向连接小口驱动的发送接收能力与网络实体交换信号消息,如网络交换和远程控制。调用管理器支持一种或多种信号协议,如由ATM 协会制定的ATM UNI 3.1协议。

一个MCM驱动器俱是一个面向连接的小口驱动器,它也对面向连接的客户提供调用管理服务。虽然MCM 也像调用管理器一样为面向连接的客户提供调用管理服务,但是它的调用管理器/小口驱动接口是内部于驱动器的,因而对NDIS是不透明的。

 

多个调用管理器和MCM 可以共存于同一个环境下。另,每一个调用管理器和MCM多可以支持多个信号协议。

 

面向连接的客户使用调用管理器或MCM的调用方法和分解服务。面向连接的客户也使用面向连接的小口驱动或MCM的发送接收能力来发送接收数据。

 

面向连接的客户对它的上端可以类似于无连接协议那样提供它自己的网络和传输层服务到高层的应用。然而,与无连接协议不同的是一个面向连接的客户对它的低端,使用调用管理和面向连接小口驱动的服务或使用MCM的服务。

 

再者,面向连接的客户可以是一个驻留在协议层与面向连接NDIS之间的适配层(可以是中间驱动器)。这样的例子是IP/ATM LAN仿真,二者都使用调用管理服务来建立基本连接,但是他们都对上面的无连接协议隐藏了接口的面向连接的本质。注意,这种面向连接的客户上端接口属于NDIS资料说明范围。如果一个客户正在作为一个适配层提供服务,它的上端接口就是由它所适配的面向连接的NDIS协议所定义的。

 

更多关于面向连接驱动的信息请参考本导引的第四部分。

 

2.4.3 WAN网络驱动器环境

 

Windows 2000 支持在无连接和面向连接媒体上的广域网(WAN)连接。图2.9显示了关于网环境。

 

下图说明远程访问服务器的体系结构。

 

            2.9 Windows 2000 WAN环境

 

WAN环境包含下列控件:

 

        远程访问服务(RAS

 

RAS允许用户模式应用产生拨号连接。在RAS连接建立之后,用户应用可以通过标准的网络接口,如Windows SocketNetBIOS,命名管道,或RPC连接网络服务。

 

        TAPI服务提供者

 

TAPI服务提供者是一个用户模式控件,它通过服务提供接口(SPI)接受来自RAS客户和TAPI控件应用的调用方法和分解服务请求。TAPI服务提供者转换这个SPI请求到TAPI请求,并且发送请求到NDISAPI,如果这个调用是在无连接媒体上的,反之,如果这个调用是在面向连接的媒体上的,则发送请求到TAPI代理。

 

        NDISTAPI

 

NDISTAPI是一个可模式控件它输出无连接小口驱动到TAPI设备空间。NDISTAPI接受来自TAPI服务提供者调用方法和分解请求,和通过NDISWAN把这些请求正确定向到小口驱动来设置、监视和分解排列和调用。

 

        NDPROXY

 

TAPI代理是一个可模式控件,它输出面向连接的小口驱动到TAPI设备空间。NDPROXY作为调用管理器对NDISWAN提供服务,也作为面向连接的客户对面向连接的小口驱动提供服务。(关于面向连接网络环境的更多信息请参考2.4.2节)

 

        NDISWAN

 

NDISWAN是一个中间NDIS驱动器,它执行PPP协议/连接帧,压缩,和加密服务。NDISWAN转换来自上层传输驱动的NDIS_PACKETNDIS_WAN_PACKET,并传输这个重构的包到下层WAN小口驱动器。NDISWAN支持无连接和面向连接的小口驱动。

 

对面向连接的环境,NDISWAN就像一个具有TAPI代理驱动的面向连接的客户一样活动,这个客户也给出调用管理器接口到NDISWAN

 

        WAN小口驱动

 

WAN小口驱动调用许多与NDIS相同的函数,并提供许多类似于非WAN NDIS小口驱动的处理器。然而,一个WAN小口驱动在发送包和向上传输接收包的时候还调用特定的相关于WANNDIS函数。WAN小口驱动还是用NDIS_WAN_PACKET结构取代NDIS_PACKET结构。此外,WAN小口驱动还维护WAN指定的信息和响应WAN指定的信息查询。WAN小口驱动支持无连接和面向连接的媒体。

 

        串行驱动器

 

串行驱动其实对内部串口或多串口卡的标准驱动器。对Windows2000,内置的异步WAN小口驱动使用内部的串口驱动器提供Modem通讯。

 

原创粉丝点击