索阅100例 首 页| 资 讯| 下 载| 论 坛| 博 客| Webinar| 高 校| 专 刊| 会展| EETV| 百科| 问答| 电路图| 工程师手册| Datasheet

EEPW首页>百科> NDIS

NDIS


贡献者:sdjntl浏览:13775次 创建时间:2009-12-05

NDIS  NDIS是Network Driver Interface Specification,即网络驱动接口规范。NDIS的主要目的就 是为NIC(网络接口卡,Netwok Interface Cards)制定出标准的API接口。MAC(介质访问控制,Media Access Controller)设备驱动封装了所有的NIC硬件 实现,这样一来所有的使用相同介质的NIC就可以通过通用的编程接口被访问。 NDIS同时也提供一个函数库(又时也称作wrapper),这个库中的函数可以被MAC驱动调用,也可以被高层的协议(例如TCP/IP)驱动调用。这些wrapper函数使得MAC驱动和协议驱动的开发变得更加容易。同时,这些wrapper函数也减 少了驱动程序对工作平台的依赖性。
  NDIS(NetworkDriverInterfaceSpecification)是网络驱动程序接口规范的简称。它横跨传输层、网络层和数据链路层,定义了网卡或网卡驱动程序与上层协议驱动程序之间的通信接口规范,屏蔽了底层物理硬件的不同,使上层的协议驱动程序可以和底层任何型号的网卡通信。
  NDIS为网络驱动程序创建了一个完整的开发环境,只需调用NDIS函数,而不用考虑操作系统的内核以及与其他驱动程序的接口问题,从而使得网络驱动程序可以从与操作系统的复杂通讯中分离,极大地方便了网络驱动程序的编写。另外,利用NDIS的封装特性,可以专注于一层驱动的设计,减少了设计的复杂性,同时易于扩展驱动程序栈。
  NDIS支持三种类型的网络驱动程序:
  网卡驱动程序(NICdrivers):网卡驱动程序是网卡与上层驱动程序通信的接口,它负责接收来自上层的数据包,或将数据包发送到上层相应的驱动程序,同时它还完成处理中断等工作。
  中间驱动程序(Intermediateprotocoldrivers):中间驱动程序位于网卡驱动程序和协议驱动程序之间,它向上提供小端口(Minport)函数集,向下提供协议(protocol)函数集,因此对于上层驱动程序而言,它是小端口驱动程序。对于底层的驱动程序,它是协议驱动程序。
  协议驱动程序(Upperlevelprotocoldrivers):协议驱动程序执行具体的网络协议,如IPX/SPX、TCP/IP等。协议驱动程序为应用层客户程序提供服务,接收来自网卡或中间驱动程序的信息。
  我们开发的防火墙采用的是中间驱动程序。
  中间驱动程序在协议驱动程序和小型端口驱动程序之间插了一层,使得来自上层的发送包和来自网络的接收包都必须经过它而进行传递,从而可以用来拦截较为底层的网络数据包,在此基础上进行过滤、加密、压缩、网络地址转换等操作。由于中间驱动程序实际上不是从最下层直接截获的比特流,而是经过了NDIS,所以实际的包没有了CRC(循环冗余校验码),这部分已经被NDIS过滤掉了。基于这个原因,可以说中间驱动程序的大概位置是在数据链路层和网络层之间。中间驱动程序在数据链路层和网络层之间对所有的数据包进行
  检查,功能强大,但编程接口比较复杂。
  基于IMD包过滤防火墙系统总体框架:
  (1)基于IMD的包过滤驱动程序PFilter.SYS
  位于核心态,运行效率高,主要用于在NDIS中间驱动程序中拦截所有的网络数据包,根据过滤规则判别是否接收或发送数据包。同时处理上层应用程序发送的IRP,可以将数据包直接传送到应用程序、设置网卡的工作模式等。
  (2)应用层的网络监控与防火墙软件Firewall.EXE。
  负责提供用户界面,为用户提供方便的服务,选择底层包过滤驱动程序监控网卡,读取和过滤数据包,支持对常见协议和地址的过滤设置,用树状视图有层次地显示以太数据帧的解码信息,以十六进制的形式显示整个数据包的数据转储,对捕获到的数据包的存储和加载等。
  500){this.resized=true;this.style.width=500;}" border=0>
  包过滤驱动程序以虚拟网络设备驱动程序的方式“楔入”操作系统的协议堆栈,能截获所有进出系统的网络数据包,从而解决数据包过滤的核心问题。
  此次驱动程序的开发主要基于Windows 2000 DDK中的NDIS中间驱动程序例程Passthru,以此为框架进行编程,在此基础上通过改写接收和发送包函数、增加与用户态应用程序通信等功能去实现。驱动程序在核心态具备设置、请求传递、包截获和包管理等有效手段,向上可以通过系统为设备I/O提供的统一界面与用户态应用交互。
  当应用层程序要发送数据时,不是直接将数据包发送给NdisSend函数,而是先发送给包过滤驱动程序的MPSend或MPSendPackets函数,可以在这两个函数里截获并处理所有要通过网卡向外发送的数据包。
  当外部数据包到达网卡时,首先由PtRequestComplete函数处理来自网卡外部数据包的请求,接着由驱动程序中的PtReceive或PtreceivePacket函数接受所有来自网卡的数据包,并将数据包读入数据包缓冲区,可以在两个函数里截获并处理所有系统接收到的来自网卡的数据包。
  在拦截数据包过程中,如果读取等待队列中有上层应用程序请求读取数据包的IRP,则从读取等待队列的首部取出一个IRP,并将被截获的数据包拷贝到该IRP所指定的缓冲区中。
  在驱动程序中,使用注册设备接口的方法创建设备对象和符号链接,并注册分发例程接口,实现与上层应用程序的通信。
  上层应用程序在Visual C++6.0中利用MFC类库实现,用户界面友好。采用MFC SDI接口,在文档类中存储一些截获的简单统计信息,截获的数据以及数据包的解析信息,并在几个视图类中分别显示这些信息。
  整个应用程序的核心部分时对底层驱动程序截获的数据包的读取。由于网络中流动的是海量数据,并且数据的流量是随机的,因此可能存在丢包的情况。为了能够保证处理所有的包,或者保证足够低的丢包率,必须尽可能在最小包传输周期内将其处理完毕。应用程序利用Win32的重叠I/O操作和完成端口以及多线程特性极大地提高了运行效率,在测试运行(100M局域网)中可捕获ICMP、UDP、TCP等数据包。


如果您认为本词条还有待完善,需要补充新内容或修改错误内容, 请编辑词条 查看历史版本

开放分类

参考资料

贡献者


本词条在以下词条中被提及:

关于本词条的评论共:(0条)
匿名不能发帖!请先 [ 登陆]