基于RNDIS协议的虚拟网卡程序实现。
- 格式:pdf
- 大小:284.89 KB
- 文档页数:4
rndis原理rndis原理是指Remote Network Driver Interface Specification (远程网络驱动程序接口规范),是由微软公司推出的一种网络设备驱动程序接口规范。
它的作用是将网络设备(如手机、平板电脑、物联网设备等)连接到计算机,并通过USB接口进行通信。
rndis原理的核心是将网络设备模拟成一个虚拟的以太网适配器,使得计算机可以像使用普通以太网适配器一样与网络设备进行通信。
具体来说,rndis通过USB的数据传输功能将网络设备上的数据封装成网络数据包,然后通过USB接口传输到计算机,计算机再将数据包解封装并发送到网络上。
rndis原理的实现主要依赖于以下几个关键技术:1. USB设备描述符:rndis设备通过USB设备描述符向计算机描述自己的功能和特性。
计算机根据设备描述符的信息来加载相应的驱动程序,并与rndis设备建立通信。
2. 网络控制模型:rndis设备通过网络控制模型与计算机进行通信。
网络控制模型定义了一组标准命令,用于控制和配置rndis设备的网络参数,例如IP地址、子网掩码、网关等。
通过这些命令,计算机可以向rndis设备发送网络配置信息,使其能够正确地与网络进行通信。
3. 数据传输模型:rndis设备通过数据传输模型与计算机进行数据交换。
数据传输模型定义了一组标准命令和数据结构,用于封装和解封装网络数据包。
rndis设备将网络数据包封装成数据传输模型定义的格式,并通过USB接口传输给计算机。
计算机通过解封装数据包,获取其中的网络数据,并将其发送到网络上。
rndis原理的优点在于它的通用性和易用性。
由于rndis将网络设备模拟成一个普通的以太网适配器,所以它可以与任何支持以太网协议的计算机进行通信。
此外,rndis设备不需要安装额外的驱动程序,只需要计算机上已有的以太网驱动程序即可。
这使得rndis 设备的使用非常方便,几乎可以在任何计算机上直接使用。
TCPIPOverUSB用USB传输以太网数据,给你的MCU加个网卡RNDIS和ECM的热插拔问题最近修复了一波 RNDIS 和 ECM的热插拔通信异常问题,添加了通过menuconfig配置RNDISdelay linkup的配置选项。
问题修复点如下:RNDIS:当存在通信链接时热插拔 Windows会发送REMOTE_NDIS_RESET_MSG,该指令未实现,现已实现。
当存在通信链接时热插拔 eth_tx线程大几率会死等传输完成的信号量通知,导致LWIP卡死。
当存在通信链接时热插拔 eth_rx的接收缓冲未重置,导致接收数据异常。
ECM:当存在通信链接时热插拔 eth_tx线程大几率会死等传输完成的信号量通知,导致LWIP卡死。
当存在通信链接时热插拔 eth_rx的接收缓冲未重置,导致接收数据异常。
现已测试stm32f469i-discovery / LWIP2.0.2 / Windows 10 1903下 RNDIS,iperf传输过程中反复热插拔后功能正常, delay linkup宏开启前后功能正常,连续热插拔功能正常。
现已测试stm32f469i-discovery / LWIP2.0.2 / MacOS Mojave 10.14.2下 ECM,iperf传输过程中反复热插拔后功能正常。
相关Pull Request:关于NDISRNDIS全称Remote NDIS 是Microsoft定义的一种USB以太网卡模型,说到RNDIS 必须要说说另一个东西,NDIS。
NDIS(Network Driver Interface Specification)是网络驱动程序接口规范的简称。
它横跨传输层、网络层和数据链路层,定义了网卡或网卡驱动程序与上层协议驱动程序之间的通信接口规范,屏蔽了底层物理硬件的不同,使上层的协议驱动程序可以和底层任何型号的网卡通信。
NDIS为网络驱动程序创建了一个完整的开发环境,只需调用NDIS函数,而不用考虑操作系统的内核以及与其他驱动程序的接口问题,从而使得网络驱动程序可以从与操作系统的复杂通讯中分离,极大地方便了网络驱动程序的编写。
NDIS函数简明手册面向无连接的函数:MiniportAllocateComple 调用它来指示以前调用的NdisMAllocateMemoryAsync已经完成MiniportCheckForHang 检查NIC的内部状态MiniportDisableInterrupt 禁止NIC产生中断MiniportEnableInterrupt 允许NIC产生中断MiniportHalt 重新分配和重新注册NIC占用的资源并且终止NIC以使它不再有用MiniportHandleInterrupt 延期用来完成I/O中断函数的执行MiniportInitialize 出始化NICMiniportISR 作为NIC中断服务例程以高权值运行MiniportQueryInformation 查询微端口驱动程序的性能和当前状态MiniportReconfigure 未使用MiniportReset 对NIC发出一个硬件重置MiniportReturnPacket 从上层接收一个包,这个包是在这之前通过调用NdisMIndicateReceivePacket函数传上去的包MiniportSend 如果驱动程序没有MiniportSendPadcets或MiniportWanSend函数,它用来将一个包通过NIC传递到网络上MiniportSendPackets 通过NIC传递一组包到网络上MiniportSetInformation 变换(设置)关于微端口驱动程序或它的NIC的信息MiniportShutdown 当系统暂时关闭时,将NIC恢复到初始状态MiniportSynchronizeISR 同步访问与MiniportISR或MiniportDisableInterrupt共享的资源。
如果有运行在DIRQL下的NIC驱动程序函数与驱动程序的MiniportISR或MiniportDisableInterrupt函数共享资源,需要此函数MiniportTimer 如果微端口的NIC不产生中断,用于轮询NIC的状态MiniportTransferData 将由NIC接收到的包的内容拷贝到一个给定的包缓存中MiniportWanSend 如果驱动程序控制着W AN NIC,通过NIC发送一个包到网络上面向连接微端口的上层函数:DriverEntry 由操作系统调用来激活和初始化微端口驱动程序MiniportAllocateComplete 调用它来指示以前调用的NdisMAllocateMemoryAsync已经完成MiniportChecKForHang 检查NIC的内部状态MiniportCoActivateVc 激活一个虚连接(VC)MiniportCoCreateVc 为一个VC建立VC状态MiniportCoDeactivateVc 为一个VC释放VC的状态MiniportCoDeleteVc 删除一个VCMiniportCoRequest 查询微端口驱动程序的能力和当前状态或改变(设置)有关微端口驱动程序或它的NIC的信息MiniportCoSendPackets 通过一个NIC发送一组包到网络上MiniportDisableInterrupt 禁止一个NIC产生中断MiniportEnableInterrupt 允许一个NIC产生中断MiniporeHalt 收回和注销NIC占用的资源并且终止NIC以使它不再使用MiniportHandIeInterrupt 延期用来完成I/O中断函数的执行MiniportInitialize 初始化NICMiniportISR 作为NIC中断服务例程以高权值运行MiniportReconfigure 未使用MiniporeReset 对NIC发出一个硬件重置MiniportReturnPacket 从上层接收一个包,这个包是在这以前通过调用NdisMCoIndicateReceivePacket传上去的MiniportShutdown 一个可选择函数,当系统关闭时,将NIC恢复到它的初始状态MiniportSynchronizpISR 同步访问与MiniportISR或MiniportDisableInterrupt共享的资源,如果有运行在DIRQL下的NIC驱动程序函数与驱动程序的MiniportISR或MiniportDisableInterrupt函数共享资源MiniportTimer 如果微端口NIC不产生中断,轮询一个NIC状态MiniportWanSend 如果驱动程序控制着W AN NIC ,通过网络接口卡发送一个包到网络上初始化和注册函数NdisMInitializeWrapper 为微端口驱动程序初始化NDIS库数据结构NdisMRegisterMiniport 向NDIS提供有关微端口驱动程序的信息NdisMSetAttributes 向NDIS库报告微端口驱动程序所支持的NIC的类型并且传递指向微端口的环境区域的句柄。
微软RNDIS协议协议名称:微软RNDIS协议一、引言微软RNDIS(Remote Network Driver Interface Specification)协议是一种用于在主机计算机与远程设备之间进行网络通信的协议。
该协议旨在提供一种标准化的接口,使主机计算机能够通过USB、以太网或其他物理介质与远程设备进行通信。
本协议的目的是确保通信的稳定性、可靠性和安全性。
二、协议范围本协议适用于所有使用微软RNDIS协议进行网络通信的主机计算机和远程设备。
三、术语定义1. RNDIS:Remote Network Driver Interface Specification,即远程网络驱动程序接口规范,是一种用于主机计算机与远程设备之间进行网络通信的接口规范。
2. 主机计算机:指运行操作系统的计算机,用于控制和管理远程设备。
3. 远程设备:指通过USB、以太网或其他物理介质与主机计算机进行通信的设备。
四、协议规定1. 连接建立主机计算机与远程设备之间的连接建立过程应符合以下规定:- 主机计算机通过识别远程设备的RNDIS功能来确认设备是否支持RNDIS协议。
- 主机计算机向远程设备发送连接请求,请求建立网络连接。
- 远程设备收到连接请求后,根据协议规定进行回应,确认连接建立。
2. 数据传输主机计算机与远程设备之间的数据传输过程应符合以下规定:- 数据传输应使用RNDIS协议规定的数据包格式。
- 数据包应包含必要的控制信息,以确保传输的完整性和准确性。
- 数据传输过程中,主机计算机应监测数据传输状态,及时处理传输错误或异常情况。
- 远程设备应接收并处理主机计算机发送的数据包,确保数据的正确接收和处理。
3. 错误处理在数据传输过程中,如出现错误或异常情况,应按照以下规定进行错误处理:- 主机计算机应根据错误类型和严重程度采取相应的措施,如重新发送数据、请求重传或中断连接。
- 远程设备应根据错误类型和严重程度采取相应的措施,如发送错误响应、请求重传或中断连接。
微软RNDIS协议协议名称:微软RNDIS协议一、引言微软RNDIS协议(Remote Network Driver Interface Specification)是一种用于网络驱动程序的通信协议,旨在提供一种标准化的方式,使计算机和网络设备之间能够进行可靠的通信。
本协议的目的是定义RNDIS协议的标准格式,以确保各种设备和操作系统之间的互操作性和兼容性。
二、协议概述1. RNDIS协议的作用RNDIS协议旨在为计算机和网络设备之间的通信提供一种标准化的接口。
它允许计算机通过USB或其他物理接口连接到网络设备,并通过网络设备进行数据传输。
RNDIS协议定义了通信的数据格式、命令和状态,以及设备和驱动程序之间的交互方式。
2. RNDIS协议的基本原理RNDIS协议的基本原理是将网络设备模拟为一个虚拟网络适配器,使其能够与计算机的网络堆栈进行通信。
计算机将RNDIS设备视为一个网络接口,通过发送RNDIS命令和数据包来与设备进行通信。
RNDIS设备接收命令并执行相应的操作,然后将数据包传输给计算机。
三、协议内容1. RNDIS命令格式RNDIS协议定义了一系列命令,用于设备和驱动程序之间的通信。
每个命令由一个命令标识符、参数和数据组成。
命令标识符用于唯一标识每个命令,参数用于传递命令的附加信息,数据用于传输命令所需的数据。
2. RNDIS数据包格式RNDIS协议定义了数据包的格式,用于在计算机和设备之间传输数据。
数据包由一个包头和数据组成。
包头包含了数据包的长度、类型和其他相关信息,而数据则是实际传输的数据。
3. RNDIS状态和通知RNDIS协议定义了一系列状态和通知,用于设备和驱动程序之间的状态同步和事件通知。
设备可以向驱动程序发送状态和通知,以指示设备的状态变化或发生的事件。
四、协议实施1. RNDIS设备驱动程序接口RNDIS协议要求设备制造商提供符合RNDIS规范的设备驱动程序。
设备驱动程序需要实现RNDIS协议定义的接口,以便与计算机进行通信。
微软RNDIS协议协议名称:微软RNDIS协议1. 引言本协议旨在定义微软远程网络设备接口规范(Remote Network Device Interface Specification,简称RNDIS),以便实现在微软操作系统上与远程设备的通信。
本协议适合于任何支持RNDIS协议的远程网络设备。
2. 范围本协议适合于所有使用微软操作系统的设备,包括但不限于个人电脑、服务器、挪移设备等。
3. 术语定义在本协议中,以下术语的定义适合于所有相关条款和条件:- RNDIS:远程网络设备接口规范,用于实现微软操作系统与远程设备的通信。
- 远程设备:指支持RNDIS协议的任何外部设备,如网络适配器、无线网卡等。
- 主机:指运行微软操作系统的计算机或者设备。
- RNDIS驱动程序:指在主机上运行的软件模块,用于管理RNDIS设备与主机之间的通信。
4. 协议要求4.1 RNDIS设备的功能要求远程设备必须满足以下要求,以支持RNDIS协议:- 支持基于USB或者以太网的物理接口。
- 实现RNDIS设备类描述符和功能描述符。
- 支持RNDIS命令集,包括设备初始化、数据传输、状态通知等。
- 提供有效的设备识别信息,如供应商ID、产品ID等。
4.2 主机的功能要求主机必须满足以下要求,以支持RNDIS协议:- 安装RNDIS驱动程序,用于与RNDIS设备进行通信。
- 支持USB或者以太网的物理接口。
- 实现RNDIS主机类描述符和功能描述符。
- 支持RNDIS命令集,包括设备初始化、数据传输、状态通知等。
5. 协议流程5.1 设备初始化5.1.1 远程设备初始化远程设备在与主机建立连接后,应发送初始化请求给主机。
初始化请求应包括设备识别信息、设备能力等。
主机在接收到初始化请求后,应进行相应的设备初始化操作。
5.1.2 主机初始化主机在接收到远程设备的初始化请求后,应发送初始化响应给远程设备。
初始化响应应包括主机的能力信息、RNDIS驱动程序版本等。
虚拟网卡设置方法一、虚拟网卡设置定义:1.虚拟网卡是用软件模拟网络环境,模拟网络适配器,windows 系统自带此软件。
2.可以添加硬件向导,添加新硬件,检测过后,选择添加新设备,再选择从列表中选取,选中网卡下一步,查找制造商"Microsoft'有一个设备"Microsoft Loopback Adapter',选中它,安装完成后,查看硬件〔管理〕器,会多出一个新网卡,这就是虚拟网卡。
二、虚拟网卡设置流程:1.建立虚拟网卡先点电脑右下角的圆形,会看到一个页面,在页面的左上角有"控制面板',在右上角区域的查看方式中,选择小图标,方便查看栏目,然后找到"设置管理器'就OK啦!2.在"控制面板'中,我们找到"网络适配器',添加虚拟网卡就可以了,我们首先选中"网络适配器',然后点击上面的操作选中"添加过时硬件';3.点击"添加过时硬件'后我们进入正规流程,点击下一步,我们必须要选择"安装手动从列表中选择的硬件',在点击下一步;4.选择"网络适配器',然后点击下一步;选择必须要安装的"网络适配器',左边选择厂商"Microsoft',右边网络适配器选择"loopback',点击下一步;5.下一步,下一步,正在安装支持的软件,即虚拟网卡;6.提示成功安装硬件,设置向导完成,点击完成,"虚拟网卡'就创建好了,随后我们可以在网上邻居查看验证。
7.创建完成后,我们可以在"控制面板'的设备管理器中的网络适配器中多了一个loopback adapter,然后在网上邻居的网络连接中,也能找到一个本地连接2,这个就是我们创建的虚拟连接,也就是我们所说的虚拟网卡。
微软RNDIS协议协议名称:微软RNDIS协议1. 引言本协议旨在规范微软RNDIS(Remote Network Driver Interface Specification)协议的标准格式,以确保设备之间的网络驱动程序接口的互操作性和一致性。
本协议适用于使用微软RNDIS协议的设备和应用程序。
2. 范围本协议适用于以下情况:- 设备和应用程序使用微软RNDIS协议进行网络驱动程序的通信。
- 设备和应用程序需要遵循微软RNDIS协议的规范和要求。
3. 定义以下术语在本协议中具有以下定义:- 设备:指使用微软RNDIS协议的硬件设备。
- 应用程序:指使用微软RNDIS协议的软件应用程序。
- RNDIS:指Remote Network Driver Interface Specification,是微软定义的一种网络驱动程序接口规范。
4. 协议规范4.1 协议版本设备和应用程序应遵循最新版本的微软RNDIS协议规范,以确保互操作性和一致性。
4.2 协议支持设备和应用程序应支持微软RNDIS协议的所有必需功能和特性。
4.3 协议交互设备和应用程序之间的协议交互应遵循微软RNDIS协议规范中定义的消息格式和交互流程。
4.4 数据传输设备和应用程序之间的数据传输应遵循微软RNDIS协议规范中定义的数据包格式和传输机制。
4.5 错误处理设备和应用程序应实现适当的错误处理机制,以处理协议交互和数据传输过程中可能出现的错误情况。
4.6 安全性设备和应用程序应实现适当的安全措施,以保护协议交互和数据传输的安全性和机密性。
5. 实施指南5.1 设备实施指南设备实施者应遵循以下指南:- 实现微软RNDIS协议规范中定义的必需功能和特性。
- 遵循微软RNDIS协议规范中定义的消息格式和交互流程。
- 遵循微软RNDIS协议规范中定义的数据包格式和传输机制。
- 实现适当的错误处理机制。
- 实现适当的安全措施。
5.2 应用程序实施指南应用程序实施者应遵循以下指南:- 实现微软RNDIS协议规范中定义的必需功能和特性。
软件英才网软件行业驰名招聘网站手机探索者开发实录—rndis/usbnet作者联系方式:李先静<xianjimli at hotmail dot com>手机探索者(mobile explorer)通过几层抽象,让它不依赖于特定的传输方式,然而抽象就是抽象,一个抽象的面包是不能填饱肚子的,我们一定要有具体的实现。
手机探索者(mobile explorer)先实现基于rndis/usbnet的传输方式,在linux PC上支持usbnet是一件非常自然的事情,然而windows似乎并不认识我们的broncho手机:找不到相应驱动的程序,按网上的介绍去做也不凑效。
虽然看了两周Windows DDK的资料,我还是没有信心和时间去写自己的usbnet驱动程序。
没办法,最后决定把broncho伪装成一个window mobile手机,我看过RNDIS的资料和代码,了解它的基本原理,知道实现起来并不难。
尽管linux下RNDIS的作者在代码中抱怨RNDIS的SPEC太模糊,但他对Windows mobile手机支持还是比较完善的。
RNDIS也有设备端的实现,我想要模拟window mobile手机是轻而易举的事。
不过还是遇到了点麻烦,在broncho上启用了RNDIS之后,linux PC仍然把它识别为一个普通usbnet 设备,我发现它总是匹配不到rndis_host驱动。
只好找来一台windows mobile手机,插到linux PC上,然后分析它的USB配置,其内容如下:12Bus 003 Device 063: ID 0bb4:0bce High Tech Computer Corp.3Device Descriptor:4 bLength 185 bDescriptorType 16 bcdUSB 2.007 bDeviceClass 239 Miscellaneous Device8 bDeviceSubClass 1 ?9 bDeviceProtocol 1 Microsoft ActiveSync10 bMaxPacketSize0 6411 idVendor 0x0bb4 High Tech Computer Corp.12 idProduct 0x0bce13 bcdDevice 0.0014 iManufacturer 1 HTC15 iProduct 2 Generic RNDIS16 iSerial 3 00846335-3781-0103-4800-0050bf3f517317 bNumConfigurations 118 Configuration Descriptor:19 bLength 920 bDescriptorType 221 wTotalLength 6222 bNumInterfaces 223 bConfigurationValue 1软件英才网软件行业驰名招聘网站24 iConfiguration 025 bmAttributes 0xc026 Self Powered27 MaxPower 100mA28 Interface Descriptor:29 bLength 930 bDescriptorType 431 bInterfaceNumber 032 bAlternateSetting 033 bNumEndpoints 134 bInterfaceClass 239 Miscellaneous Device35 bInterfaceSubClass 1 ?36 bInterfaceProtocol 1 Microsoft ActiveSync37 iInterface 038 Endpoint Descriptor:39 bLength 740 bDescriptorType 541 bEndpointAddress 0x81 EP 1 IN42 bmAttributes 343 Transfer Type Interrupt44 Synch Type None45 Usage Type Data46 wMaxPacketSize 0x0008 1x 8 bytes47 bInterval 148 Interface Descriptor:49 bLength 950 bDescriptorType 451 bInterfaceNumber 152 bAlternateSetting 053 bNumEndpoints 254 bInterfaceClass 10 CDC Data55 bInterfaceSubClass 0 Unused56 bInterfaceProtocol 057 iInterface 058 Endpoint Descriptor:59 bLength 760 bDescriptorType 561 bEndpointAddress 0x82 EP 2 IN62 bmAttributes 263 Transfer Type Bulk64 Synch Type None65 Usage Type Data66 wMaxPacketSize 0x0040 1x 64 bytes软件英才网软件行业驰名招聘网站67 bInterval 068 Endpoint Descriptor:69 bLength 770 bDescriptorType 571 bEndpointAddress 0x03 EP 3 OUT72 bmAttributes 273 Transfer Type Bulk74 Synch Type None75 Usage Type Data76 wMaxPacketSize 0x0040 1x 64 bytes77 bInterval 078它有两个接口,第一个接口的InterfaceClass和InterfaceSubClass表明它是一个特殊的RNDIS(即ActiveSync),第二个接口表明它是一个普通的CDC设备,也就是usbnet。
经过了两天的忙碌终于学会了怎么用电脑来实现电脑与手机间的文件无线传输和修改,上网资源共享。
我想到要学这个知识的起源点是想要实现电脑和手机的的无线传输,之后发现这个功能还可以实现网络资源共享。
实现这一功能的步骤如下:成功!可以把手机上的文实现网络共享!件当成电脑上的文件处理现在来具体说明以上功能的实现(我的系统是window7的,别的系统行不行我也不知道,但是预测可行):首先要做的就是在计算机上建立一个虚拟的网线网卡,这一步骤也叫做把电脑设置为WiFi热点,就比如建立一个基地,这样别的飞机就可以在这里运输资源或者把资源运输到这来了,当然这个例子还是不够全面。
方法如下:点击“开始菜单”,之后“所以程序”,之后“附件”,之后“命令提示符”,当然还可以在开始菜单的运行中输入“cmd”按下回车键。
显示如下界面:之后输入“netsh wlan set hostednetwork ssid=name key=password”,这个命令之中有两个部分是可以自己修改的,第一个是”ssid=“之后接的部分,这一串字符是你想建立的热点的名称,就是之后在别的终端搜索到的WLAN的名称;第二个是”key=”之后的部分,这一条字符是你给这个虚拟无线网卡的密码,就是你平时想去偷网而别人要的秘钥,注意这里的密码长度必须大于8位;注意一定要填好,最好以后不要再改动,不如以后感觉密码不好之类的,因为如果要改的话要去设备管理器去把这个网卡和那个本地网卡删除之后再来建立才行,本人就是翻过这个错误,之后弄了一个下午。
(记住:现在还不能关闭这个窗口,因为下面还要用:显示如下界面:现在你已经建立好了一个虚拟网卡,可以到网络链接里查看,打开网络连接的方法如下:开始菜单<控制面板《网络和internet《网络和共享中心《更改适配器设置(左边菜单)你就可以看见一个带有红色叉叉的“无线网络链接2”这个就是我们建立的虚拟无线网卡。
现在来打开虚拟无线网卡,在“命令指示符”窗口输入“netsh wlan start hostednetwork”,就是打开虚拟网卡的命令。
在编写windows网络驱动之前,需要具有必然的运算机网络知识。
包括OSI/ISO 七层体系结构,常见的网络协议TCP/TP, UDP,ICMP,HTTP,FTP,SMTP/POP3等。
因为整个windows网络驱动就是建立在网络协议栈基础之上的。
Windows网络驱动有两个重要的规范:TDI,NDIS。
TDI(Transport Driver Interface)传输层接口,顾名思义,那个技术是成立在传输层之上的。
传输层位于七层协议的第三次,常见的TCP/UDP协议就属于传输层。
咱们明白,传输层提供的服务包括:连接管理、过失检测、按端口号寻址。
事实上,TDI驱动主要作用就是过滤端口。
TDI是即将被淘汰的技术,微软宣布,vista以后的操作系统将再也不提供TDI支持,取代它的是Windows Filter Platform和Winsock Kernel,有兴趣的朋友能够搜集一下相关的资料。
这里注重分析一下NDIS驱动框架。
NDIS(Network Driver Interface Specification)网络驱动接口标准,相较TDI,它位于七层协议的更低层次。
能够捕捉更详细的信息。
能够做更多的事。
它是微软联合3com公司发布的一个标准。
NDIS网络驱动有3种表现形式:协议驱动、中间层驱动、小端口驱动。
它们的作用范围大致依照传输层、网络层、数据链路层依次往下排。
小端口驱动miniport,一般是网卡厂商提供,协议层驱动一般用来捕捉数据包,赫赫出名的winpcap就是基于协议层驱动编写,而本文主要关心中间层驱动。
WDK文档的例子中,提供了一个中间层驱动,我的电脑中的路径是C:\WinDDK\\src\network\ndis\passthru。
Passthru位于协议驱动和小端口驱动之间,比较灵活。
类似于它们两个的综合体。
它能捕捉所有流入流出本机的数据,超级强悍。
常见的个人防火墙大体都是用中间层驱动写的。
基于RNDIS协议的虚拟网卡程序实现高东飞;张志鸿【期刊名称】《计算机技术与发展》【年(卷),期】2013(000)002【摘要】Microsoft's RNDIS protocol enables Ethernet communication to transmit over the USB bus. And Microsoft in the realization of RNDIS using the TCP protocol,the communication efficiency is not high. To remove the TCP three-way handshake process to improve the communication efficiency of the RNDIS protocol,it describes the RNDIS protocol structures and their application on networking e-quipment,analyzed the RNDIS protocol communication processes based on USB 2. 0 and RNDIS protocol. Combined with host USB de-vices,design and implement virtual card procedures based on Windows Mobile. On the basis of no drive in LIBUSB,the program imple-ments the RNDIS protocol based on UDP protocol. Tests proved the RNDIS protocol based on UDP protocol method is more efficient than TCP communications.% 微软提出的RNDIS协议使得以太网通信能够在USB总线上传输,而微软在实现RNDIS时使用TCP协议,通信效率不高.为略去TCP三次握手过程,提高RNDIS协议的通信效率,论文在USB2.0协议和RNDIS协议的基础上,介绍了RNDIS协议的结构及其在USB网络设备上的应用,分析了RNDIS协议的通信流程,同时结合USB设备主机,设计并实现了基于Windows Mobile设备的虚拟网卡程序.该程序在LIBUSB无驱设计的基础上,实现了基于UDP协议的RNDIS协议的方法,通过测试证明基于UDP协议的RNDIS协议方法比TCP方式的通信效率更高.【总页数】4页(P85-88)【作者】高东飞;张志鸿【作者单位】郑州大学信息工程学院,河南郑州 450000;郑州大学信息工程学院,河南郑州 450000【正文语种】中文【中图分类】TP334【相关文献】1.基于FTP协议的WinSock程序实现 [J], 顾斌2.基于TCP/IP协议的WinSock程序实现 [J], 邢敏;付春艳3.基于Linux虚拟网卡测试平台的系统设计 [J], 张洪;吴钦章;杜春蕾4.基于TCP/IP协议多客户连接的服务端程序实现 [J], 孙桂斌5.基于PCIE总线协议的数据采集设备驱动程序实现 [J], 刘波;库锡树;孙兆林因版权原因,仅展示原文概要,查看原文内容请购买。
微软RNDIS协议协议名称:微软RNDIS协议一、引言微软RNDIS(Remote Network Driver Interface Specification)协议是一种用于远程网络驱动程序接口的规范,旨在提供一种标准化的方式,使计算机和外部设备之间能够进行网络通信。
本协议旨在详细描述微软RNDIS协议的规范和要求,以确保各方在使用该协议时能够准确理解和遵守相关规定。
二、定义1. RNDIS设备:指符合微软RNDIS协议的外部设备,如网络适配器、移动设备等。
2. 主机:指计算机或其他支持RNDIS协议的主控设备。
3. 驱动程序:指用于控制和管理RNDIS设备的软件程序。
三、协议规范1. 设备连接与识别1.1 主机应支持自动检测和识别连接的RNDIS设备。
1.2 RNDIS设备应提供唯一的标识符,以便主机能够准确识别和区分不同的设备。
1.3 主机与RNDIS设备之间的通信应遵循标准的USB或其他通信协议。
2. 设备配置2.1 RNDIS设备应支持动态配置网络参数,如IP地址、子网掩码、网关等。
2.2 主机应提供用户界面或API,以便用户或其他程序能够配置RNDIS设备的网络参数。
2.3 RNDIS设备应能够保存和恢复已配置的网络参数,以便在重新连接时能够自动恢复配置。
3. 数据传输3.1 RNDIS设备应支持数据的双向传输,包括主机向设备发送数据和设备向主机发送数据。
3.2 数据传输应保证可靠性和稳定性,且具备一定的容错机制。
3.3 数据传输的速率应根据设备和主机的性能进行自适应调整,以提供最佳的传输效率。
3.4 RNDIS设备应能够处理和响应来自主机的控制命令,如连接、断开连接等。
4. 驱动程序支持4.1 主机应提供相应的驱动程序,以支持对RNDIS设备的控制和管理。
4.2 驱动程序应具备良好的兼容性,能够适配不同型号和版本的RNDIS设备。
4.3 驱动程序应提供友好的用户界面或API,以便用户能够方便地配置和管理RNDIS设备。
USB RNDIS原理分析--PDD部分1.初始化首先我们从PDD_Init开始。
所谓初始化的动作通常包含对硬件设备的初始化,一般说来就是通过设置设备寄存器来对设备进行必要的配置,另外一个方面就是软件的初始化,包括全局数据变量的空间申请初始化,中断函数的挂接,其他函数指针的挂接。
既然需要读写设备的状态寄存器设备的端口/地址就是必不可少的,首先PDD_init先检查有没有从MDD传过来的设备地址,如果没有,通过PciFind2890找一下我们需要的2980有没有在PCI以查卡的形式在某一个插槽上,如果继没有由MDD传递过来的设备地址,PCI插槽上也没有我们需要的2890,怎么办?还能怎么办,既然没有的话,我也干不下去了,return False算了,88下次再见:P如果在PCI插口上发现2890的话,就比较麻烦一点,因为需要去计算PCI总线上的设备偏移才能得到设备地址,不仅如次还要去摆弄一个叫9054的片子来符合和PCI的规范,其实我们要的只是一个地址和一个中断源,没有必要再PCI设备上搞来搞去,最简单的办法就是假设这个2890是直接挂在系统总线上的,事实上现在用得很普遍的ARM 体系下通常都是没有PCI总线的,这样子我们就只用分析MDD直接传递了设备地址的情况,简单还不乏实用性。
总之,我就是不分析PCI总线相关的部分,因为我不会。
下面废话少说进入正题。
PDD_init有两个参数第一个是一个结构指针原形如下:ty pedef struct _RNDIS_PDD_CHARACTERISTICS{ PFN_PDD_SEND_RNDIS_MESSAGE SendRndisMessageHandler;PFN_PDD_SEND_RNDIS_PACKET SendRndisPacketHandler;PFN_PDD_INDICATE_RNDIS_PACKET_COMPLETE IndicateRndisPacketCompleteHandler; PFN_PDD_SET SetHandler;PFN_PDD_GET GetHandler;PFN_PDD_ISR ISRHandler;DWORD dwIRQ;DWORD dwMaxRx;DWORD dwBaseAddr;// BUS specific information// If it is PCI then this driver will be loaded by PCI enumerator through// NDIS.BOOL bPCI Device;// These are only needed for PCI type device AND if the driver chooses// to use GIISR.DLL as default ISR.BOOL CheckPort; // If true, check port to see if device is asserting IRQBOOL PortIsIO; // Port is IO port (possibly true only for x86)BOOL UseMaskReg; // If true, read from MaskAddr to obtain maskDWORD PortAddr; // Port AddressDWORD PortSize; // Port data width in bytesDWORD Mask; // Mask to use on data port to determine if device is asserting IRQDWORD MaskAddr; // Address of register to use as mask} RNDIS_PDD_CHARACTERISTICS, *PRNDIS_PDD_CHARACTERISTICS;这个结构包含了一系列的函数指针和地址,中断,和最大接收数等信息,没有提到的这些个结构成员都是PCI设备所需的,这里我们仅仅需要把bPCIDevice设置为False也就是说我们并没有使用PCI设备就可以了。
微软RNDIS协议协议名称:微软RNDIS协议一、引言本协议旨在规范微软RNDIS(Remote Network Driver Interface Specification)协议的标准格式,以确保设备之间的网络驱动程序接口能够实现互操作性和兼容性。
二、背景微软RNDIS协议是一种用于在计算机和外部设备之间传输网络数据的驱动程序接口协议。
该协议旨在通过USB连接将计算机与外部设备(如移动电话、网络摄像头等)连接起来,使外部设备能够通过计算机访问网络。
三、定义在本协议中,以下术语的定义如下:1. RNDIS设备:符合微软RNDIS协议的外部设备。
2. 主机:指运行RNDIS驱动程序的计算机。
3. RNDIS驱动程序:在主机上运行的驱动程序,用于与RNDIS设备进行通信。
4. RNDIS消息:指在主机和RNDIS设备之间传输的消息,用于控制和传输网络数据。
四、协议要求1. RNDIS设备的实现必须符合微软RNDIS协议的规范,确保与主机之间的互操作性和兼容性。
2. RNDIS设备必须能够通过USB接口与主机进行连接,并能够被主机正确地识别和驱动。
3. RNDIS设备必须能够通过RNDIS消息进行与主机的通信,包括但不限于设备初始化、网络配置、数据传输等功能。
4. RNDIS设备必须支持主机对设备的控制命令,如启动、停止、重置等。
5. RNDIS设备必须能够在主机的网络适配器列表中正确显示,并能够通过主机的网络协议栈进行网络通信。
6. RNDIS设备必须能够支持主机对设备的状态查询和事件通知,以便主机能够及时获知设备的状态变化。
7. RNDIS设备必须能够支持主机对设备的性能查询和配置,以便主机能够根据需要对设备进行优化和配置。
8. RNDIS设备必须能够支持主机对设备的固件升级,以便主机能够通过固件升级来修复和改进设备的功能和性能。
五、协议实施1. RNDIS设备的制造商应根据微软RNDIS协议的规范进行设备的设计和开发,并确保设备的实现符合协议要求。
Redhat Linux的网络配置,基本上是通过修改几个配置文件来实现的,虽然也可以用ifconfig 来设置IP,用route来配置默认网关,用hostname来配置主机名,但是重启后会丢失。
1.相关的配置文件:/ect/hosts 配置主机名和IP地址的对应/etc/sysconfig/network 配置主机名和网关/etc/sysconfig/network-scripts/ifcfg-eth0 eth0配置文件,eth1则文件名为ifcfg-eth1,以此类推2.网卡配置假设我们要配置主机名为test,eth0的IP地址192.168.168.1/24,网关地址192.168.168.250 则/etc/sysconfig/network文件内容如下:NETWORKING=yesHOSTNAME=testGATEWAY=192.168.168.250eth0对应的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0内容如下:DEVICE=eth0设备名称BOOTPROTO=static地址配置方式:static、dhcp、noneIPADDR=192.168.168.1NETMASK=255.255.255.0TYPE=Ethernet网络类型ONBOOT=yes系统开机是否自启动HWADDR=MAC地址2.多个网卡绑定成一块虚拟网卡为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断。
比如我们可以将eth0和eth1绑定成虚拟网卡bond0。
网卡绑定步骤如下:2.1首先用ifconfig命令查看系统网卡信息,进行网卡绑定规划,比如我们选定eth0和eth12.2网卡绑定前要关闭系统的NetworkManager服务service NetworkManager stop停止服务chkconfig NetworkManager off开机自启动关掉chkconfig|grep NetworkManager检查服务是否彻底关掉2.3在/etc/sysconfig/network-scripts/下创建虚拟网卡bond0的配置文件ifcfg-bond0,内容如下:DEVICE=bond1ONBOOT=yesBOOTPROTO=none地址配置方式noneIPADDR=22.1.82.63NETMASK=255.255.255.0USERCTRL=noGATEWAY=22.1.82.253BONDING_OPTS="mode=0 miimon=50 fail_over_mac=0"虚拟网卡参数,mode为网卡策略,目前有七种(详细介绍在下面)miimon=100表示每100ms检查一次链路连接状态,如果不通则会切换物理网卡。
ubus uci例子全文共四篇示例,供读者参考第一篇示例:ubus uci例子是一种非常实用的配置工具,通过它可以方便地修改和查看OpenWrt系统中的配置文件。
在网络设置、无线网络设置、防火墙设置等方面都可以通过ubus uci例子进行配置,让用户在创建并管理配置文件时更加灵活和简单。
在OpenWrt系统中,配置文件存储在/etc/config目录下,其中每个配置文件都对应着一个应用程序或服务。
而ubus uci例子则是一个用来访问和修改这些配置文件的工具,通过ubus uci例子可以方便地读写这些配置文件,实现对系统的定制和配置。
举例来说,我们可以通过ubus uci例子来配置网络设置。
我们想要修改LAN口的IP地址和子网掩码,就可以通过下面的命令来实现:uci set n.ipaddr='192.168.1.1'uci set mask='255.255.255.0'uci commit network通过上述命令,我们就可以修改LAN口的IP地址和子网掩码,然后通过uci commit network命令将更改保存到配置文件中。
这样,我们就可以通过ubus uci例子来轻松地修改网络设置,而无需手动编辑配置文件。
uci set wireless.@wifi-iface[0].ssid='MyWifi'uci set wireless.@wifi-iface[0].key='mypassword'uci commit wirelessuci add firewall ruleuci set firewall.@rule[-1].name='Allow-SSH'uci set firewall.@rule[-1].src='wan'uci set firewall.@rule[-1].proto='tcp'uci set firewall.@rule[-1].dest_port='22'uci set firewall.@rule[-1].target='ACCEPT'uci commit firewall第二篇示例:UBus是OpenWrt中一个非常重要的组件,用于实现用户空间程序之间的通信。