智能手机一般都提供了USB共享网络的功能,将手机通过USB线与电脑连接,手机端开启『USB共享网络』,电脑就能通过手机上网。

智能手机一般都提供了USB共享网络的功能,将手机通过USB线与电脑连接,手机端开启『USB共享网络』,电脑就能通过手机上网。

手机端开启『USB共享网络』:

ANDROID USB网络共享实现 安卓怎么usb共享网络_手机端

 

电脑端出现新的网络连接:

ANDROID USB网络共享实现 安卓怎么usb共享网络_ANDROID USB网络共享实现_02

 

通过设备管理器看一看新增加的网卡设备,如下图红框所示,增加了一个名为RemoteNDISbasedInternetSharingDevice#3的网卡设备。

ANDROID USB网络共享实现 安卓怎么usb共享网络_智能手机_03

 

RemoteNDIS(简称RNDIS)是微软为即插即用的以太网设备制定的一套规范。USBClass驱动实现了这个规范,在电脑端生成了上述网卡。下图来自微软官网对RNDIS的介绍。

ANDROID USB网络共享实现 安卓怎么usb共享网络_智能手机_04

 

到这里,我们可以看到USB共享网络的底层,是通过USBRNDIS协议来实现以太网数据的传输。电脑端生成一张USB网卡,手机端也会生成一张USB网卡,两张网卡之间进行网络通信。

在命令行窗口输入 ipconfig/all,看一下网络信息。如下图所示,电脑端和手机端处于同一私有地址网段192.168.42.X,通过DCHP来动态获得IP地址。这个默认网关的IP地址就是手机端USB网卡的IP地址。

ANDROID USB网络共享实现 安卓怎么usb共享网络_ANDROID USB网络共享实现_05

 

不妨再通过Wireshark抓包来看一看通过电脑端pingwww.baidu.com的过程。

ping之前,先看看ARP包,192.168.42.32和192.168.42.129在相互询问对方的MAC地址。192.168.42.129,也就是默认网关,它的MAC地址是e6:22:87:8a:e9:db。

ANDROID USB网络共享实现 安卓怎么usb共享网络_IP_06

 

电脑端pingwww.baidu.com的过程如下:

ANDROID USB网络共享实现 安卓怎么usb共享网络_IP_07

 

展开其中的一个pingrequest包,可以看到它指定的目的地IP是163.177.151.110(baidu),但是MAC却是默认网关的MAC地址(e6:22:87:8a:e9:db),表明电脑希望通过网关(即手机)把包转发给baidu。

ANDROID USB网络共享实现 安卓怎么usb共享网络_智能手机_08

 

------END------

作者:bigfish99