赞
踩
PPP 用于建立点对点链路。最初是用于慢速设备的,比如早期通过串行线上网。通过一套协议,维护硬件链路上的数据连接,并具备安全和认证特性,可建立计费模式。
我们在PPP拨号脚本中也常常可以看到波特率、用户名、密码、认证方式等参数。现在的猫或者家用路由拨号上网,多用PPPoE,也用到了PPP,因为PPPoE就是PPP over Ethernet。使用以太网链路,将PPP包封装到以太网帧中,从而可以继续利用PPP的认证和安全特性。
对于3、4、5G模块而言,多是通过USB总线连接,但是在内核中,将其识别转换为串口设备,设备名一般为ttyUSB?,这里的?指代数字,从0增长,一个模块可以转换出多个口,有的用于执行AT指令,有的用于拨号。
既然是串口,那么使用PPP似乎就顺利成章了。
PPP属于数据链路层协议,它使用HDLC协议格式来封装数据帧,而在数据流中如果遇到0x7D,则表示后面的数据是控制信息,当它出现的时候,设备需从数据模式切换成控制模式,并处理这些信息,设备需要对每一个字节的数据进行解析,并作出相应的处理,占用较多的资源,效率很低,速度慢。
既然模块物理连接就是USB接口,那么可否直接利用USB转网口的方式呢,而且,PPP方式的封装和控制,普通认为效率不高,所以也没有采用这种方式的必要。幸运的是,有多种直接基于USB口的方式可用,不幸运的是,选择太多,缺乏统一标准。
标题的概念中,除了PPP,其他的就都跟这种方式有关了。我们来看看这些概念。
NDIS:Network Driver Interface Specification,网络驱动接口规范。如其名,NDIS是一种规范,定义了网络驱动接口的api。它横跨传输层、网络层和数据链路层,定义了网卡或网卡驱动程序与上层协议驱动程序之间的通信接口规范,屏蔽了底层物理硬件的不同,使上层的协议驱动程序可以和底层任何型号的网卡通信,从而简化应用层的使用。
NDIS拨号,Ethernet协议是通过使用不同的以太网帧的包头来区分控制信息和数据信息,一个以太网帧的包头大小是固定的14字节,所以对于每一个帧,设备只需要处理其包头即可,相对于PPP效率大幅度提高,速度也大幅提高。
NDIS既然是标准,那么win、linux都可以使用,广义的来讲,在windows上是NDIS,只要符合NDIS标准的无线网卡、有线网卡,不需要驱动,直接就可以在win7以上的系统上使用。
但是NDIS在linux上它却是以另一个名字为大家知晓"ECM(Ethernet Control Model)"、“NCM”,其实ECM、NCM只是在linux上规定了NDIS规范的“物理层”实现形式,是通过USB CDC通信类来实现,所以又叫CDC-ECM,在华为的这个文档里写的很清楚:
CDC(Communication Device Class)类是USB2.0标准下的一个子类,定义了通信相关设备的抽象集合。它与USB2.0标准以及其下的子类的相互关系如下图所示:
如上图,USB2.0标准下定义了很多子类,有音频类,CDC类,HID,打印,大容量存储类,HUB,智能卡等等。CDC就跟这些类别属于一个层级,自然可知USB网卡、USB WIFI就应该是这类设备了。更深入了解可以看这个链接: link.
这两个是Linux下的“NDIS”标准。ECM是Ethernet Networking Control Model的简称,NCM是Network Control Model的简称,后者是包含前者的。
NCM(Network Control Model)是ECM协议的改进版,将多个以太网包组成一个NTB包在USB总线上传输,提高宽带利用率。
可以看出,ECM、NCM在USB上是要满足CDC要求的,如果出现CDC-ECM,按这种思路,就比较好理解了。进一步的,作为标准,如果内核支持这种方式,显然就不需要额外的驱动了。
根据这些信息,我们可以设想下主要流程:使用者可以利用CDC驱动,以“标准”的方式生成网络设备,建立网络连接,发送网络数据。所有通过USB总线跟模块交互的数据都被相关协议和标准做了约束,通过USB硬件到达模块,模块按协议和标准可以拿出其中的控制和数据信息,完成跟基站的交互。至于模块内部怎么实现,那是模块自己的事情了。
RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。
MBIM:可以理解为专为移动网络准备的”NDIS“。
MBIM(Mobile Broadband Interface Model),这是正宗的移动宽带接口模型,专门用于3G/4G/5G模块的,上面说的NDIS这个并不是专门用在移动宽带上的,比如USB接口的百兆网卡RTL8152也是基于NDIS的,所以它能做到免驱。
但是MBIM只在win8以上的windows上使用,不知道为什么linux没有使用,好象这种新技术都是windows先用,然后才慢慢推广到linux上。(最近调试imx6ull板子时,在4.x.xx的内核中发现了 CDC MBIM support选项,说明新内核已经支持了)
QMI_WWAN、GOBINET是在Linux上实现NDIS拨号的驱动的名字。
QMI_WWAN:是高通在Linux下提供的类似ECM的框架,由于高通的行业地位和其产品的市场占有率,该框架使用相当广泛。
GOBINET:在版本低于3.4的Linux内核中,没有添加QMI_WWAN驱动,于是高通用该驱动来完成拨号,后来内核中支持QMI_WWAN,就不再需要单独提供驱动了,GOBINET就不再需要了。
Gobinet QMI-WWAN作用是一样的,都是Linux上高通模块的驱动程序。他们的分界线就是内核版本。linux3.4之前高通的QMI-WWAN并没有添加到linux内核中,所以高通就开发了Gobinet软件包,包括4G驱动与4G拨号程序。但是linux3.4内核已经把QMI添加到内核中了,所以使用高通方案的4G模块就不需要这么麻烦了,只需要在menuconfig的时候添加如下配置就可以了,大大简化了4G模块的使用。
1、其实总结起来,我觉得就两种,一种是PPP类,一种是NDIS族类。NDIS族类的方式是标准化加高效化,对上,尽量标准化为网络设备;对下,则尽可能适应物理通道,高效利用。
2、RMNET拨号、QMI拨号、NDIS拨号都是NDIS拨号,叫法不同而已。
3、USB网卡拨号分为RMNET/QMI/NDIS、ECM、MBIM、RNDIS四种类型。
4、驱动
拨号方式 | Linux | Windows | IP地址 |
---|---|---|---|
NDIS拨号 | 需要移植或使能QMI_WWAN/GOBINET驱动 | 需要安装专门的驱动程序 | 公网IP |
ECM拨号 | 驱动系统自带,很老的内核都支持 | 需要安装专门的驱动程序 | 私网IP |
MBIM拨号 | 暂不支持 | 不需要安装驱动程序,Windows系统内已经集成了驱动 | 公网IP |
RNDIS拨号 | 驱动是系统自带的,很老的内核都支持 | 不需要安装驱动程序,Windows系统内已经集成了驱动 | 私网IP |
5、速度、对比、选用
PPP使用复杂,对CPU负载大,网速上不去,不推荐使用。
NDIS拨号支持QMAP功能,可以实现IP聚合和IP复用功能。支持IP聚合就可以一次URB传输多个IP包,减少CPU负载率。支持IP复用,可以实现多网卡的功能。因此推荐使用(尤其是高通模组)。
ECM不支持IP聚合和复用功能,决定了不适用于高速场景。
RNDIS协议上是支持IP聚合的,但是Linux自带驱动没有使用,所以也不适用于高速场景。
MBIM默认就支持IP聚合,也支持IP复用。推荐使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。