|
本帖最后由 Tesla.Angela 于 2010-9-17 11:58 编辑
鉴于那个什么“腾X”的一些关于网络的幼稚问题,决定写下这篇文章。
主题:Windows系统的网络架构
关键词:NDIS,端口驱动,协议驱动,中间层驱动,TDI,SOCKET
首先讲一下windows的基本网络结构:
物理网卡--端口驱动---中间层驱动(我在本论坛发了有例子)---协议驱动(TCP/IP,NETBIOS等等)---TDI(传输层接口)--SOCKET(应用层)
这是基本结构图,下面我先讲一下网卡的历史。
Windows在最初设计时,由于历史原因没有考虑过网络通信的问题,所以在Ntoskrnl.exe以及hal.dll这两个内核文件里面都没有网络相关的内容。这就导致,所有生产网卡的厂商都必须提供从直接操作物理网卡的端口驱动到与网卡没啥关系的协议驱动(如TCP/IP),再到应用层接口(如SOCKET),这样的话,不仅网卡厂商的工作量巨大,而且各网卡生产商甚至同一个生产商的产品,兼容性严重不足,而且,在这种情况下,作为一个网络程序的开发人员的话,你可能在RealTek网卡基础上开发的QQ程序拿到别人使用NE2000的网卡的机器上就上不了网。
正是由于这个原因,MS后来联合intel和3COM以及还有其它几家什么渣渣公司的,制定了一个网络标准,英文叫Network Driver Interface Specifiction,翻译为中文就是网络驱动接口标准,也就是我在回答那个叫什么“腾X”的人时反复提到的NDIS。这个标准下,MS给windows系统提供了一个NDIS.sys的文件,这个其实是一个内核模式下的动态链接库。同样,在这个标准下,规定所有网卡生产商在提供驱动时,必须由这个驱动向外导出几个固定的函数,实际就是NDIS.sys规定了一套接口,网卡生产商自己的驱动去调用这些接口。对于协议驱动来说,也是一样的,协议驱动也必须按照一定的规则去调用Ndsi.sys提供的标准接口,使得写协议驱动的人不用管具体的网卡是什么。而对windows来说,MS自己提供了上面的常用协议驱动以及传输层接口和应用层接口(ws2_32.dll)。这么做了之后,生产网卡的人的工作量就小了很多,不用管上层如何去调用它的网卡;写协议驱动的人也不用管它的下层网卡究竟是什么样,比如下层可能是真实的物理网卡,也可能是猫,还可能根本就什么都没有,或者是虚拟出来网卡,这些对写协议驱动的人来说都无关紧要,它只要按照NDIS标准写好接口就可以了。
这样以后,整个网络通信架构就得到了统一,解决了兼容性问题。现在的MS的系统,还有其它几乎所有系统,以及全世界所有生产网卡的厂商,都遵循整个标准。
再来说说虚拟网卡:刚才提到,协议驱动是不管它的下层具体是什么的,只要下层提供的接口是NDIS标准的,那么就会被认为是一个网卡。虚拟网卡的原理就是这个道理。你可以写一个驱动,提供标准的NDIS接口就是了,然后你可以实际上不操作任何物理网卡,当上层协议驱动需要数据或者需要发送数据时,你可以随你的爱好,任意构造数据提交给协议驱动就是了,或者你甚至可以从其他真实的物理网卡获取数据后再返回(这个过程中数据完全由你控制,想要丢弃,修改,加密,伪造等等操作都随你的便)。
接着说说何为IMD:其实,如果你写一个驱动,在这个驱动内部同时提供端口驱动和协议驱动所必须的,由NDIS规定的接口,那这个驱动就是IMD驱动了,又叫中间层驱动。这个驱动对系统来说,既认为它是一个网卡,也认为它是一个协议。而所有的物理网卡的端口驱动会向本机内安装的所有协议驱动提供它接收到的任何数据;反过来,所有协议驱动也会向系统中的所有网卡的端口驱动(不管这个网卡是否存在,只要是端口驱动)提供协议驱动下发的数据。这就导致一个结果,IMD驱动会获得所有进出网卡的数据。所以,IMD驱动通常被防火墙程序或者VPN,VLAN,网桥等软件使用。
先说到这里!
【最后修改:Tesla.Angela;修改内容:删除一些让别的网友感到不适的话;修改原因:让本帖更加和谐】 |
|