Unisoc RNDIS上网业务流程学习笔记
RNDIS启动流程图
这是从RNDIS标准协议上截取的一个流程图,本文将以此流程图并结合Wireshark的抓包展开说明。
总体流程概述
根据RNDIS的初始化流程图,我们可以看到USB从上电启动到进行上网,粗略可分为以下三个阶段:
- 设备描述符枚举阶段(此流程非本文重点,暂且略过);
- RNDIS控制协商阶段,此阶段主要进行数据业务前RNDIS设备的配置操作及状态管理;
- RNDIS数据包业务阶段,即上网业务;
RNDIS消息类型
RNDIS控制消息
Initialize消息
从抓包截图可以看到,初始化消息主要确定Host与Device两端的版本号,媒介承载协议,MTU以及对齐方式等等。
Query消息
抓包可以看出,Query和Set的消息很多,且相互穿插在一起,终其原因,主要是需要Query和Set的OID(Objective ID)消息较多,主要涉及的OID包括:
- OID_GEN_SUPPORTED_LIST
- OID_GEN_PHYSICAL_MEDIUM
- OID_GEN_MAXIMUM_FRAME_SIZE
- OID_GEN_LINK_SPEED
- OID_GEN_MEDIA_CONNECT_STATUS
- OID_802_3_MAXIMUM_LIST_SIZE
- OID_802_3_CURRENT_ADDRESS
- OID_802_3_PERMANENT_ADDRESS
- OID_GEN_MAXIMUM_TOTAL_SIZE
- OID_GEN_VENDOR_DESCRIPTION
- OID_GEN_XMIT_OK
- OID_GEN_RCV_OK
以查询OID_802_3_CURRENT_ADDRESS为例,在该消息中Host端获得了本端MAC地址,此为网络业务的第1个配置。
Set消息
Set的OID相对Query阶段来说,不是很多,主要为了识别组播报文和设置过滤器吧,从抓包的结果来看,目前主要有2条,涉及的OID包括:
- OID_GEN_CURRENT_PACKET_FILTER
- OID_802_3_MULTICAST_LIST
KeepAlive消息
当RNDIS相关的配置协商完成之后,Host侧便发起了保活消息,从抓包结果看Unisoc的保活周期为2.5s。
Indicate Status消息
从抓包的结果来看,状态消息大部分场景下用来指示Device端的网络连接情况。
RNDIS数据消息
DHCP阶段
Host在保活阶段一旦收到网络已连接的Indicate Status通知,即会发起DHCP报文,此阶段一旦协商成功,Host将获得本端IP地址和对端IP地址,此为网络业务的第2、3个配置。此阶段结束,离上网业务只剩一步之遥,那就是对端MAC地址。
ARP阶段
该阶段主要是为了获得上网业务的第4个配置(对端MAC地址),如图,又分为3个子阶段。
IP传输阶段
至此,网络传输所需的底层链路(4元组配置)打通,此后便进入IP数据传输流程。在传输过程中,RNDIS会发送Query的控制消息,查询设备侧发送和接收状态(OID)是否正常。
后记
此文为项目中RNDIS上网业务的调研笔记,若有错误,请多指正。
后后记
RNDIS数据的解析,原生Wireshark只能解析到USB URB层,后面是RAW DATA;为了调研方便,我就用lua语言开发了rndis的解析插件,因为lua的插件是wireshark从某个版本以来一直就支持的。
rndis.lua的解析插件本人也已上传至资源库。
链接: link.
具体使用方法:在安装目录的init.lua文件最后一行添上**dofile(DATA_DIR…“rndis.lua”)**就可以了。