Windows网络系统架构

在介绍Windows网络体系架构之前,我首先介绍一下Windows中的两个重要编程规范——TDI,NDIS.,然后再介绍网络体系的架构。TDI,Transport Driver Interface,传输驱动程序接口。/Windows/System32/Drivers/Tdi.sys。在实现网络API驱动程序时,由于牵涉到很多不同协议,会用到不同协议驱动提供的接口,使得开发的工作复杂化。所以Microsoft在网络API驱动程序和协议驱动之间又增加了一层TDI。TDI接口只是一种“将网络请求格式化成IRP,以及申请网络地址和数据通信”的做法规范化。遵从TDI标准的传输协议向他们的客户(如Socket emulator,Netbios emulator等)导出了TDI接口,有利于上下层之间的通信:
    一方面,对于TDI上层的网络API驱动程序就不需要使用所有协议驱动程序所提供的接口,直接使用TDI提供的统一接口。
    另一方面,对于下层协议驱动程序(也称为TDI Transport Provider传输器)直接由TDI接口来调用,发出请求。

      在Windows VISTA版本之后,TDI就不再使用了,取而代之的是Windows filter platform和Winsock kernel。

NDIS,Network Driver Interface Specification,网络驱动程序接口规范,在操作系统中的位置/Windows/System32/Drivers/NDIS.sys。当一个协议驱动程序想要按照其协议的格式解析网上读写的数据时,而这些数据必须通过网络适配器才能取得,期望协议驱动程序能够理解市场上的每一款网络适配器的细微区别是不可能的。所以在1989年,由Microsoft和3Com联合开发的了NDIS,使得协议驱动程序可以以一种与设备无关的方式来跟网络适配器驱动程序进行通信。遵从NDIS的网络适配器驱动程序称为NDIS minport driver。

NDIS规范实现了与TDI标准类似的功能,都是将复杂的下层调用规范化、标准化,大大提高了Windows操作系统的可扩展性和兼容性。也表现在两个方面:
   对于下层,让网络适配器制造商很easy的开发自己的设备驱动程序,也就是Ndis miniport driver。这些 miniport driver直接利用NDIS提供的接口发送指令,NDIS对这些格式化的指令进行解析,做进一步处理。(这些处理就到了HAL了)
   对于上层,多个协议驱动程序与下层minport driver之间的通信,也都是通过统一的NDIS接口,NidsAllocatePacket,NdisSend等函数来收发数据。
   设备制造商开发的Ndis miniport driver直接调用NDIS库中的接口函数,因此不需要考虑重入的问题,就是一个请求尚未结束的时候,新的请求又进来了。NDIS库对请求进行了序列化,但是这种序列化也妨碍了多处理器的扩展性。所以NDIS5中提供了非序列化的操作项。下面,我来介绍一下,Deserialized和 Serialized minport driver的区别:
    Deserialized NDIS miniport driver自己序列化对MinportXxx函数的操作,排队和管理多个并发请求的任务都由驱动程序自己来完成。而Serialized NDIS miniport driver以上的工作都是依赖于NDIS库来完成的。从性能角度看,Deserialized NDIS miniport driver的性能是Serialized NDIS miniport driver性能的2倍多,所以到NDIS6.0之后的所有Miniport driver都是deserialize的。

    以上是我参考MSDN以及自己的一些理解画出来的windows网络架构图,下面我就从上到下来简单介绍一下其中的各个层。

 1.   网络应用程,Network applicantion,用户态的应用程序调用Windows操作系统提供的网络API,网络API包括:
a)   Windows套接字(winsock)
b)   远程过程调用RPC
c)   Web访问API
d)   命名管道和邮件槽
e)   其他网络API
    这些API既可以在用户模式下实现,也可以同时在用户模式和内核模式下实现。从本质上说这些API是下层提供接口的另一层封装而已。
  

2.   TDI Clients,传输驱动程序接口客户,是内核模式的设备驱动程序,用于实现网络API的内核部分。将网络API的请求转换成IRP,通过TDI标准格式化后,发送给下层的协议驱动(也就是TDI传输器)。从sockets emulator的架构图看到,TDI Clients的实现可以有用户态的部分,也有内核态的部分。AFD辅助功能驱动程序通过向协议驱动程序发送TDI IRP来执行网络套接字操作,比如发送和接受消息。AFD没有不是确定使用哪一个协议驱动,而是上层通知其要使用的协议名称,然后AFD去打开相应协议的设备对象。

3.   TDI Transport Providers、TDI传输器、NDIS协议驱动程序、协议驱动程序,所有这些其实就是指的同一个东西,我在后面就称其为协议驱动程序。这个部分就是我们对某个协议的具体实现部分。做过网络协议开发的朋友一定知道,协议其实就是双发协商好的一套通信的规则。以IP 协议为例,实际上就是对网络数据的一种处理方式,根据网络数据包的解析结构,做出相应的处理。Windows的tcpip.sys就实现了多个协议,ip、tcp、udp、arp、icmp、igmp,它为上层的TDI Clients提供了5个设备对象,用于访问使用这些协议,TDI Clients打开这些设备对象,向其发送IRP请求来实现自己的操作。通过DDK的DeviceTree我们可以得到这些设备对象:
a)   /Device/Rawip
b)   /Device/Tcp
c)   /Device/Udp
d)   /Device/IPMULTICAST
e)   /Device/Ip
    协议驱动程序处理的数据是通过NDIS库中提供的接口来获取的,不需要发送IRP来取得。在DDK XP中提供了一个协议驱动程序了源程序 Ndisuio,DDK XP后的版本提供的是Ndisport。在DriverEntry中我们可以看到,驱动程序一开始就注册了一个 NDIS_PROTOCOL_CHARACTERISTICS,这个结构体中是一堆NdisXxxx函数。NDIS规范在这里就开始发挥它的作用了。
    协议驱动程序的另一个作用就是监听网络数据,自己开发一个网络协议通过Ndis API获得所有的网络数据,但是不能够拦截网络数据,因为其他协议驱动也可以通过Nids API获取数据。一个典型的应用就是Winpcap了,使用NPF.SYS来捕获网络数据,并且做好充分缓冲处理,防止大数据量到来时出现数据包丢失的情况。详情情节winpcap的开源代码。
    具体的协议驱动开发过程,我就不细述了,大家可以参看Ndisuio和DDK doc,我推荐boywhp的一篇文档《NDIS协议驱动开发》给大家。
   

4.   NDIS,Network Driver Interface Specification,网络协议接口标准。从图中我们可以看到包裹在其中的两个驱动程序,一个是NDIS intermediate driver,NDIS中间层驱动程序,另一个是NDIS minport driver,小端口驱动程序。下面简单介绍一下这两个驱动程序:

4-1:Ndis intermediate driver:NDIS中间层驱动程序。对于上层的protocol driver它充当 minport driver的作用,对于下层的minport driver它充当一个protocol driver的作用,所以在驱动程序 DriverEntry中就注册NDIS_PROTOCOL_CHARACTERISTICS和 NDIS_MINIPORT_CHARACTERISTICS,使用protocol characteristics中NDIS API从 miniport driver那里取得数据包,再用miniport characteristics的NDIS API向上层的 protocol driver发送数据包。Nids intermediate driver最大的优势就是所有miniport driver的数据包都要通过它这里倒手给protocol driver,所以网络防火墙就看上了这块风水宝地。现在很多网络防火墙都使用 NDIS intermediate driver做数据包的过滤和拦截工作,过滤的规则设置到 MPSendPackets,PTReceive,PTReceiveRacket这三个函数。具体开发过程请大家参考DDK提供的PassThru源代码,www.ndis.com, 网上有很多相关的资料。
NDIS 6.0之后,filter driver就取代了Ndis intermediate driver,WDK中提供源码。
   

4-2:Ndis miniport driver:小端口驱动,其实是真正的网卡驱动。一般是由设备厂商提供的,在DDK中也提供了miniport driver的一个例子 e100bex,支持Intel EtherExpressTM PRO/100+ Ethernet PCI adapter 和 Intel EtherExpressTM PRO/100B PCI adapter两款网络适配器。在安全软件领域,小端口驱动的技术主要用于虚拟网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搜索引擎站群霸屏排名源码系统+关键词排名 前后端完整的搭建教程

开发搜索引擎站群霸屏排名系统是一项重要的策略,通过在搜索引擎中获得多个高排名站点,可以大大提高企业的品牌知名度,从而吸引更多的潜在客户和消费者。而且当潜在客户在搜索结果中看到多个与您的品牌相关的站点时,他们可能会认为…

Thread常用API

setname方法每个线程取名 需要创建构造器 线程设置名字 package Thread_api_test;// 继承Thread类 public class MyThread extends Thread {//创建构造器 线程设置名字public MyThread(String name){super(name);}Overridepublic void run() {super.run();Thread mThread.cur…

css 左右滚轮无缝衔接

最近的项目有做到一个功能 类似跑马灯或者公告栏那种 有文字 也有列表的 所以 写了两种 第一种公告栏文字是用的js 第二种图文类型是用的css 两种方法 记录一下 第一种 纯文字滚动 其实也是根据js去计算dom的宽度 通过js去给css赋值 <div class"div1"><div …

计网面试复习自用

五层&#xff1a; 应用层&#xff1a;应用层是最高层&#xff0c;负责为用户提供网络服务和应用程序。在应用层&#xff0c;用户应用程序与网络进行交互&#xff0c;发送和接收数据。典型的应用层协议包括HTTP&#xff08;用于网页浏览&#xff09;、SMTP&#xff08;用于电子邮…

【MySQL】事务四大特性ACID、并发事务问题、事务隔离级别

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 MySQL 一、事务四大特性ACID1.1 原子性1.2 …

车辆车型识别系统python+TensorFlow+Django网页界面+算法模型

一、介绍 车辆车型识别系统。本系统使用Python作为主要开发编程语言&#xff0c;通过TensorFlow搭建算法模型网络对收集到的多种车辆车型图片数据集进行训练&#xff0c;最后得到一个识别精度较高的模型文件。并基于该模型搭建Django框架的WEB网页端可视化操作界面。实现用户上…

【LeetCode刷题(数据结构与算法)】:二叉树之左叶子之和

给定二叉树的根节点 root &#xff0c;返回所有左叶子之和 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1] 输出: 0 这都题目用递归的方法就可以解决…

『C++之STL』双端队列 - deque

前言 双端队列,Double-ended queue,简称为deque是一种线性结构的一种容器; 在数据结构中出现的顺序表与链表,或者栈与队列都算是线性结构; 在结构中,它与vector相比较会相似一些; 但是在实际当中,双端队列 - deque 包含了vector与list的优点; vector(顺序表) 支持随机访问,空…

Vue3引入腾讯地图,点击坐标后实时获取经纬度

本文将介绍如何在Vue 引入腾讯地图组件&#xff0c;引入后可以直接在页面中渲染腾讯地图&#xff0c;实现 经纬度 与 地图锚点位置的双向绑定&#xff0c;如&#xff1a; 1&#xff0c;输入经纬度后&#xff0c;地图自动定位到指定位置&#xff1b;2&#xff0c;鼠标在地图点击…

多域名SSL数字证书是什么呢

多域名SSL数字证书是众多SSL数字证书中最灵活的一款SSL证书产品。一般一张SSL证书只能保护一个域名&#xff0c;即使能保护多个域名站点&#xff0c;证书保护的域名类型也有限制(通配符SSL数字证书)。多域名SSL数字证书既能用一张SSL证书保护多个域名网站&#xff0c;又不限制域…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Toggle

组件提供勾选框样式、状态按钮样式及开关样式。该组件从API Version 8开始支持。 仅当ToggleType为Button时可包含子组件。 一、接口 Toggle(options: { type: ToggleType, isOn?: boolean }) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 参数: Toggle…

基于Java的驾校教练预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

AD20绘制电路板的外形

今天学习了绘制电路板外形的方法&#xff0c;记录一下&#xff0c;回头忘了还能在看看&#xff0c;便能很快的回忆起来了&#xff0c;比看视频啥的要高效的多。毕竟是自己写的&#xff0c;印象要深刻的多。 首先新建一个PCBDoc文件&#xff0c;方法如下图&#xff1a; 在新建的…

Linux服务器快速搭建pytorch

Linux服务器搭建pytorch 文章目录 Linux服务器搭建pytorch一、使用FileZilla传输Anaconda二、激活Anaconda环境1.创建一个虚拟环境2.使用已有项目生成requirements.txt3.在虚拟环境中使用requirements.txt安装其他项目相关库 总结 一、使用FileZilla传输Anaconda 提示&#xf…

倍福TwinCAT3.0软件与C++通讯问题(EAP通讯)

文章目录 一. TwinCAT控制器之间的几种通讯方式1.添加EAP设备2.添加变量刷新的Task周期3. 测试 一. TwinCAT控制器之间的几种通讯方式 协议硬件要求实时性说明ADS通讯普通网卡&#xff0c;支持无线典型值&#xff1a;< 100msServer/Client&#xff0c;要写 PLC 程序&#x…

onlyoffice的介绍搭建、集成过程。Windows、Linux

文章目录 什么是onlyoffice功能系统要求安装必备组件 windows搭建资源下载安装数据库onlyoffice安装测试 Linux搭建dockerdocker-compose 项目中用到的技术&#xff0c;做个笔记哈~ 什么是onlyoffice 在本地服务器上安装ONLYOFFICE Docs Community Edition Community Edition…

网络安全—小白学习笔记

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

AC修炼计划(AtCoder Regular Contest 165)

传送门&#xff1a;AtCoder Regular Contest 165 - AtCoder 本次习题参考了樱雪猫大佬的题解&#xff0c;大佬的题解传送门如下&#xff1a;Atcoder Regular Contest 165 - 樱雪喵 - 博客园 (cnblogs.com) A - Sum equals LCM 第一题不算特别难 B - Sliding Window Sort 2 对…

众和策略:小盘和大盘的关系?

在股票商场上&#xff0c;股票能够被分为小盘股和大盘股两类。那么&#xff0c;二者之间有什么联络呢&#xff1f;这篇文章将从多个视点来分析小盘和大盘的联络。 商场表现 首要&#xff0c;让我们看看两者在商场表现上的差异。大盘股是市值较大的股票&#xff0c;一般在首要股…

沉睡的木乃伊:var_export() 与可解析字符串

文章目录 参考环境var_export()概念应用场景数据持久化调试 函数 var_export() 自定义类__set_state() 魔术方法设置 __set_state 魔术方法的逻辑以复原对象注意事项 通用内置空类 stdClassstdClass对 __set_state() 的天然支持 参考 项目描述搜索引擎Bing、GoogleAI 大模型文…