手机通常会提供两种上网方式:Wifi或者3G/4G上网,Wifi上网其实就是利用网卡经过以太网上网;3G/4G则是经过基带,利用蜂窝网络进行上网,以前已经简单的阐述了**Wifi上网跟3G上网的区别**,本文主要简述Android 3G/4G上网的流程及原理。网络
手机通常有两块网卡,只是不一样时使用,Wifi的那种以太网卡,还有就是3G/4G的无线Modem型网卡(基带模块),3G/4G上网用的是蜂窝网络,信号以电磁波的形式在空气中进行传播,发送到距离最近的基站,基站经过交换机转发到覆盖目标设备的基站,并通知目标设备,回传结果,这种上网模式在链路层,用的通常是PPP(Point-to-Point Protocol)协议,而其上网媒介用的则是无线通讯专用的无线基带通讯模块:socket
同以太网不一样,移动端上网的方式是经过蜂窝网络进行上网,二者最大的区别是在链路层,Android 3G/4G无线上网的网络协议模型以下:函数
在数据链路层,PPP(Point-to-Point Protocol)协议提供了一种标准点对点的传输方式,为各类主机、网桥和路由器通讯提供通用链接方案。PPP协议主要包括如下三个部分:加密
其中上面的大部分都是在创建数据链路的时候用的,数据链路创建后,其实主要用关心的是令数据帧封装,PPP协议下的令数据帧封装格式以下图:.net
因为PPP协议是点对点的,不须要太多信息,所以这里是没有48位MAC地址概念的,所以,PPP也就无所谓 ARP(地址解析协议)和RARP(逆地址解析协议),这两个是某些网络接口(如以太网和令牌环网)使用的特殊协议。cdn
在Android系统中,应用访问网络时,会首先查看数据上网链路是否已经创建创建,若是已经创建,则直接使用已创建的网络接口进行通讯,若是还未创建,则须要首先创建数据通路。PPP拨号上网配置十分复杂,须要一系列的协商、验证,为了开发方便,Linux对PPP数据链路的创建过程进行抽象,实现了pppd拨号应用程序,专门用于管理PPP数据链路的创建与关闭。不过,pppd其实只是负责创建数据链路,创建以后,数据上网不会依赖pppd服务,打个比方就是:pppd只负责修路,不负责运货,在整个手机无线通讯中,pppd地位以下图:blog
pppd是一个后台服务进程(daemon),实现了全部鉴权、压缩/解压和加密/解密等扩展功能的控制协议,负责把要发送的数据包传递给PPP协议处理模块,设置PPP协议的参数,用来创建/关闭链接。接口
Android系统若是想要利用PPP协议进行数据通讯,必须首先按照PPP协议创建数据通讯链路。基带模块正确加载以后会映射多个ttyUSB设备文件,有的ttyUSB用于AT命令发送,有的用做数据通讯,底层经过串口多路复用机制,实现了USB串口的多路复用。在使用ttyUSB创建数据链路的时候,首先经过发送AT命令,打开无线上网模块,随后利用pppd拨号程序创建数据链路。拨号连接过程遵循PPP通讯协议,手机同蜂窝网络基站双方动态协商,配置链路参数、IP地址等,拨号成功后,Android系统会为基带模块映射一个虚拟网络接口名字多是ppp0,或者rmnetxxx等,以后,Android系统即可利用该接口进行网络通讯了,该接口的使用方式同wlan0相似,IP层对链路层彻底无感知。进程
PPP数据链路的创建须要完成三个步骤,包括链路层配置、链路认证以及网络层配置,这个过程当中,通讯双方必须经过协商,肯定数据包格式、IP地址等链路参数,才能正确创建PPP数据链路。在实际操做中,PPP数据链路的创建可分如下几个阶段:路由
通讯链路创建后,pppd会建立一个网络接口(如ppp0),内核中的PPP协议模块也会登记该网络接口,对上层应用而言,该虚拟网络接口ppp0或者或者rmnetxxx,就是无线上网须要调用的接口,而且该接口建立之初就已经从3G网络得到了动态分配的IP地址,对上层应用而言能够看作一块真实的,而且已经激活的网卡设备,能够像使用以太网卡同样,进行TCP/IP网络通讯,pppd服务创建链路的流程图:
应用程序经过socket发送TCP/IP数据包时候,内核经过IP地址和路由表找到对应的网络接口(ppp0或者rmnetxxx),而后调用ppp协议相应的实现函数,经PPP协议封装,发送数据,最终经过串口将数据发送到基带模块,并经射频模块将信息传输到附近的基站。
数据接收流程能够看作是发送的逆向,不过这里稍微有些区别,那就是接收方,在数据链路创建的时候,接收方是pppd拨号进程,创建以后,普通的上网数据,接收方就是通常的用户进程:
做者:看书的小蜗牛 Android 3G/4G流量上网原理简析
仅供参考,欢迎指正