STM32驱动开发(二)--USB Device RNDIS虚拟网卡(usb hound抓包完整数据流分析)

article/2025/9/9 14:31:51

一、简介
  抓包工具:usb hound,本例使用安卓手机作为device, 使用RNDIS功能连接电脑虚拟网卡。抓取完整数据流包按流程进行分析。数据流程熟悉之后,查看stm32或者其他厂家的USB库开发RNDIS设备代码也能懂大概。

二、USB标准请求相关概念
  USB接入时,电脑主机host会往控制端点0使用标准请求描述符。USB往端口0请求的过程都是控制传输。

下图截取自USB标准协议4.7.1章节。 

       每一次控制传输都有三个阶段:setup阶段,data阶段(无数据传输的只有两个阶段),status阶段,每个阶段又有三种包组成(token包, data包,handshake包)。下面的图展示的PID的类型,取自USB协议8.1。

     在抓包工具中只显示了数据包。还有对应的token包:CTL(setup),IN和OUT。

每个请求都是8个字节的标准。标准协议的内容截取自USB协议第九章。  

 

三、CDC类请求相关概念
  CDC类请求如下,图片源自CDC类协议第6章。

四、RNDIS协议消息相关概念
  内容来自上一篇文章中的RNDIS标准协议。 

 

整体的传输流程如下,
  (1)host先通过控制端点(0)发送SEND_ENCAPSULATED_COMMAND, 发送RNDIS消息;
  (2)device接受完消息后通过中断端点(notification端点)发送RESPONSE_AVAILABLE通知到host, 准备回复数据:
  (3)host在收到RESPONSE_AVAILABLE之后通过控制端点(0)发送GET_ENCAPSULATED_RESPONSE请求device回复RNDIS消息。

 五、USB标准请求流程分析
   下面开始讲述,可以看到从1-15次传输都是请求描述符(除去第4次传输是设置配置):

可以知道依次请求的描述符类型为:
   (1) wValue(00 01)设备描述符 ,请求wLength (12 00), 十八个字节(设备描述符的大小标准)。因此在数据阶段,device回复host自己的设备描述符(1.2)。

(2)(3) wValue(00 02)配置描述符,请求wLength (09 00), 9个字节(配置描述符的大小标准,会先读九个字节),再根据所读到的大小(79 00),一次读入所有配置描述符。

 4)(5)(6) 设置配置,wValue(00 01)这条配置对照协议我也不太清楚,跳过。

USB标准协议对此请求的解释是这样的: 

(7)-(12) 获取string描述符。  

 (13)-(15) 又重新获取了一次设备描述符和配置描述符。此时的配置描述符比第一次短,当前是(0x43),第一次是(0x79), 这一块我也不理解为什么。

六、CDC类请求流程分析(传输内容为RNDIS协议)

  根据上面第四章的描述,从(17)-(65)为CDC类标准请求中的SendEncapsulatedCommand。因此可以知道当host从描述符中识别到是RNDIS设备之后,直接发送SendEncapsulatedCommand请求进行封装的RNDIS协议交互。

(17) CTL 对应为SendEncapsulatedCommand请求,通知device需要发送(0x18个字节的数据), OUT 对应RNDIS协议的内容,MessageType为(02 00 00 00)

 因此是初始化消息REMOTE_NDIS_INITIALIZE_MSG ,共(0x18)24字节,协议格式为:

 

 (18) 在RNDIS中还有一个关键点就是host发送完消息之后需要用中断端点(通知端点)发送一条AVAILBALE通知host发送GetEncapsulatedResponse请求来获取device的消息回复内容。 

 (19) 根据上面第四章描述,CTL 对应为GET_ENCAPSULATED_RESPONSE请求
之后便开始回复REMOTE_NDIS_INITIALIZE_CMPLT(0x80000002)消息。

 (20)- (49) 对应的RNDIS消息是查询OID, OID的定义来源于微软定义的ndis.h头文件。

 20) 获取支持的OID列表, Message Type(0x04), Oid(0x010101 OID_GEN_SUPPORTED_LIST)

(21) 通知端点。

(22) 请求回复OID 列表。根据协议解析,回复的列表如下: 

 因此 (23)- (49) 是host请求device相关OID的信息,获取建立以太网必要的初始化数据。
因此 (50)- (66) 交替进行查询OID和设置OID的动作。
因此 (69) 上报NDIS初始化状态,

 七、以太网数据包交互

 因此 (70)-- (81) 为以太网数据包(对应IP类型为IPV6),至此已在USB基础上通过RNDIS协议,传输以太网数据包。

 根据TCP/IP协议卷一的定义,网络数据包的格式依次为:


http://chatgpt.dhexx.cn/article/AER8VoUX.shtml

相关文章

Android USB RNDIS

android 系统设置 网络与互联网>热点和网络共享>USB网络共享 在linux 系统上USB网络共享正常,但是在windows上无法访问网络, Window平台默认时没有打开RNDIS驱动适配器的。 以下纪录windows下面添加RNDIS驱动适配器的步骤。 1.打开设备管理器 手机…

USB RNDIS实现

RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。 同样,在WinCE中实现USB RNDIS功能,首先具备以下条件: 1. 支持USB Client并且USB驱…

STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)

STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一、简介   本文基于stm32 Rndis实例,github开源, 使用STM32F407单板。结合协议讲解stm32中USB虚拟网卡驱动的实现。达到外部主机(手机)通过USB接…

LuatOS-Air AT应用指南--RNDIS

简介 RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。从而使Windows /Linux可以通过 USB 设备连接网络。 Window系统 window系统支持RNDIS直接用usb连接就可以使用&a…

首创STM32 USB主机驱动4G rndis设备

1、4G模块使用技术现状与难题 4G模块支持的对外通信接口有串口和USB接口,串口一般使用AT指令的方式,这个在MCU类产品上面使用的很多,USB接口主用于在连接APU应用处理器上面,由LINUX操作系统来驱动 ,把4G模块实现成一个…

Linux配置USB RNDIS

一台Linux即可充当USB的device端,也可以由另一台Linux来充当USB的Host端。在与以太网不同,在USB网络里各终端不是对等的,即USB Host端和USB Device端的所需要软件和硬件接口不一样。 Linux充当USB Host Linux开发板当USB Host时&#xff0c…

Air780E模块RNDIS应用开发指南

目录 简介Window系统Linux系统常见问题 简介 RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。从而使Windows /Linux可以通过 USB 设备连接网络。 Window系统 windo…

windows系统RNDIS驱动手动安装

windows系统中RNDIS自动当成串口,按网上的更新驱动的方式无法更新为RNDIS,所以采用手动更新的方式,亲测win7和win10可用 在设备管理器选择需要更新RNDIS驱动的设备 **注意:**一定要选择正确的设备,选择错误的话无法成…

指南-安卓/Linux应用指南-RNDIS

目录 Window系统Linux系统IPV6使用方法如何禁用RNDIS功能常见问题相关资料以及购买链接 Window系统 window系统支持RNDIS直接用usb连接就可以使用,模块会虚拟一个网卡。 Linux系统 目前linux大部分发行版本都已经默认支持RNDIS驱动了,只要通过USB连接…

win10安装RNDIS驱动

1. 安装RNDIS驱动 1.1 插上usb rndis device后,PC端提示: 1.2 安装RNDIS驱动 在“RNDIS”上右击选择“更新设备驱动程序”,再选择“浏览我的计算机以查找驱动程序软件”,接着选择“让我从计算机上的可用驱动程序列表中选择”,然后选择“网络适配器”,最后选择"Mic…

【usb】安卓usb网络共享(RNDIS)

一、RNDIS简介 微软官方对RNDIS的介绍说白了,就是将安卓设备作为一个网卡,通过USB连接到电脑上,供电脑上网。 二、使用指导 首先为了验证电脑上网确实走的是usb。先把你电脑上的网卡及网线拔了,wifi关了。并且确保此时电脑无法…

软件测试岗位新标准:ISTQB认证与软件测试工程师职业发展

随着信息技术的飞速发展,软件测试行业也变得越来越重要。软件测试是保证软件质量的关键环节,因此,软件测试工程师的岗位也越来越受到重视。 ISTQB认证成为了衡量软件测试工程师职业能力的标准。 下面领测国际ISTQB考试认证中心就带您了解一下…

ISTQB初级认证-知识点及脑图总结

前言 此文章为本人利用课余时间进行的ISTQB初级认证知识和考点的总结。总结过程主要参考了“ISTQB测试人员认证初级大纲(2011版)”,由于作者能力与精力有限,此篇文章可能会存在纰漏,望见谅并及时指出。谢谢&#xff0…

ISTQB认证-关于ISTQB一些知识点总结

如果要转载请注明 原文链接哦! http://blog.csdn.net/maxdong24 ISTQB知识点总结: 注释: K1:表示一般理解 K2:表示一般掌握 K3:表示重点掌握并能够应用 1.导致软件缺陷的原因(K2&#xff09…

ISTQB高级国际认证试题及答案(一)

题目 #1 (3 分)选择2个答案 您是旅游信息手机应用项目的测试经理。近期该项目切换到敏捷流程和测试驱动开发(TDD)。每个开发周期持续15天,在第7天之后开始每日构建。第10天以后,不会再有新的功能加入。开发…

听说软件测试工程师们都在考ISTQB?

各位忙于测试的小伙伴们,还在为不知道怎么学习,不知道学习的方向而苦恼吗? 那就随小编一起看一看北汇信息的测试工程师们在学什么吧! 北汇信息专注于汽车电子测试,涵盖MiL、SiL、PiL、HiL、ViL等不同阶段&#xff0c…

ISTQB基础级备考攻略

ISTQB基础级备考攻略 ISTQB有用吗怎么考怎么准备 ISTQB有用吗 仁者见仁,智者见智。测试领域的证书不是太多,想拿证书撑撑场子顺便巩固下理论基础,常见的两个:ISTQB、国考软件测评师。 怎么考 直接复制的官网: 基础…

【最全】ISTQB- FL模拟题(含答案)

【注:摘于官网】 1、以下哪一项是对测试条件的最佳描述?(b) a) 需求文档明确或隐含说明的组件或系统的属性。——特性的定义 b) 测试依据的一部分,其与实现特定测试目标相关。 c) 当软件在特定条件下使用时&#xf…

2018版ISTQB FL基础级大纲全解析

2018版ISTQB基础级中英文大纲已经正式发布。根据ISTQB基础级认证考试要求,分别对采用2018版新大纲的时间做出了要求:针对英语考试,必须在2019年6月4日之前;而对于非英语的考试,其开始时间为2019年12月4日。其中考试的内…

考个ISTQB证书有用吗

考ISTQB证书有用吗? [我的回答]2018年8月22日 从2001年毕业开始,我一直从事的都是软件测试相关工作,包括软件测试、测试管理、测试能力改进和测试咨询培训等。2005年开始介入ISTQB的工作(比国内CSTQB成立时间更早)&…