Windows 实现的 OSI 七层模型结构图

        对网络编程感兴趣的朋友可能都听过 OSI 七层模型,下面一张便是在 Windows 下实现的整个协议的结构图。

                 Windows 下的 OSI 七层模型的实现结构


                  +-------------------------------+
                  |           Ws2_32.dll          |
                  +-------------------------------+
 UserMode                   |           |
                  +-------------------------------+
                  |           msafd.dll           |
                  +-------------------------------+
                          |   System Call  |
                          | File Operation |
----------------------------------------------------------------------
                          |                |
                  +-------------------------------+
                  |           afd.sys             |
                  |         \Device\Afd           |
                  +-------------------------------+
 Kernel Mode              | File Operation |
                          |      IRP       |
              +----------------------------------------+
              |                tcpip.sys               |       ( Tdi layer )                --- 传输层
              | \Device\Tcp \Device\Udp \Device\RawIp  |       ( Ndis Protocol )            --- 网络层
              +----------------------------------------+
                          |   Ndis lib     |
                          |                |
                  +-------------------------------+
                  |           k57xp32.sys         |            ( Miniport )                 --- 链路层
                  +-------------------------------+
                  |       Net Interface Card      |                                         --- 物理层
                  +-------------------------------+

        简单来讲, Windows 对网络部分的实现分为两部分,用户态部分和内核态部分。用户态部分为标准的 socket 调用,一般情况下可以认为有 ws2_32.dll 和 msafd.dll 组成,msafd.dll 为一个服务提供者,主要完成 socket 用户层的代码实现, 在内核态 socket 的实现由 afd.sys 实现,它主要创建设备 \Device\Afd 来与 msafd.dll 进行交互,完成

socket 的创建等其它操作。

        tcp/ip 协议的传输层和网络层实现是在 tcpip.sys 里完成的,它主要完成两部分工作,传输层实现和网络层实现,在传输层部分完成 TCP, UDP, RawIp 的绑定,连接等功能,主要服务于 afd.sys 发下来的 TDI 命令,然后进入到网络层,来完成路由以及 IP 包的构成,网络层部分相当于一个 Ndis 协议驱动,一般来讲它会绑定所有的网卡来监听和发送 IP 包。

        链路层在笔者的电脑上是由 k57xp32.sys 驱动完成,不同的网卡此驱动可能不同,它相当于一个 Ndis Miniport 驱动,和 Ndis 协议驱动一样,都是运行在 Ndis 库营造的一个运行环境中,主要完成例如以内网数据包的构成,操作网卡发送数据包,以及注册中断接收数据包以及其它信息的工作。

        物理层,当然由网卡硬件来实现。

        有了上面清晰的结构之后,我们要开发一些业务就会非常明白的知道它工作在哪里,比如 TDI 防火墙,就可以直接附加到 tcpip.sys 创建的几个命名设备对象上面,就可以监听到 afd.sys 发下来的 TDI 命令,进而可以拦截,一些 socket 创建,绑定,发送和接收的命令,从而完成防火墙的功能。当然,如果别人直接注册一个协议驱动,然后直接进行发包,那么这个防火墙就不能对这样的操作对待监控,比如直接发 ARP 包到局域网中,就可以造成攻击。但是如果你的防火墙工作在链表层上面,即注册一个中间层驱动来完成防火墙的功能,那么就又可以拦截掉我刚才假设的那种操作,所以如果一个 Ndis 中间层驱动来完成防火墙功能,那么就可以有更大的监控范围。再比如,想实现一个虚拟网卡,那么就可以完成一个 Ndis 小端口驱动,来让其它协议对你进行绑定,一些应用程序就可以直接选择这张网卡进行数据处理,便可完成一些特殊工作了。

        总之,有多灵活的思路,就可以完成多灵活的功能。

Windows 实现的 OSI 七层模型结构图

上一篇:Win8 搭建 Node.js 开发环境


下一篇:关于C#的WinForm程序打包的问题