手机一般会提供两种上网方式:Wifi或者3G/4G上网,Wifi上网其实就是利用网卡通过以太网上网;3G/4G则是通过基带,利用蜂窝网络进行上网,之前已经简单的阐述了Wifi上网跟3G上网的区别,本文主要简述Android 3G/4G上网的流程及原理。

  • 无线上网硬件模型
  • 3G/4G上网协议ppp
  • 3G/4G上网流程-ppp如何建立
  • socket如何通过基带模块发送数据、接收数据

Android流量数据上网概述(硬件平台及环境)

手机一般有两块网卡,只是不同时使用,Wifi的那种以太网卡,还有就是3G/4G的无线Modem型网卡(基带模块),3G/4G上网用的是蜂窝网络,信号以电磁波的形式在空气中进行传播,发送到距离最近的基站,基站通过交换机转发到覆盖目标设备的基站,并通知目标设备,回传结果,这种上网模式在链路层,用的一般是PPP(Point-to-Point Protocol)协议,而其上网媒介用的则是无线通信专用的无线基带通信模块:

Android流量数据上网采用的协议-PPP(Point-to-Point Protocol)

同以太网不同,移动端上网的方式是通过蜂窝网络进行上网,两者最大的区别是在链路层,Android 3G/4G无线上网的网络协议模型如下:

在数据链路层,PPP(Point-to-Point Protocol)协议提供了一种标准点对点的传输方式,为各种主机、网桥和路由器通信提供通用连接方案。PPP协议主要包括以下三个部分:

  • 令数据帧封装格式:基于HDLC(High Level Data Control,高层数据控制链路)标准,为串行数据链路上传输的数据包定义封装格式。
  • 链路控制协议LCP(Link Control Protocol):用于封装格式选项的自动协商、链路的建立和终止、探测链路错误和配置错误。
  • 认证协议,最常用的包括口令验证协议PAP(Password Authentication Protocol)和挑战握手验证协议CHAP(Challenge-Handshake Authentication Protocol)。
  • 网络控制协议NCP(Network Control Protocol):PPP协议针对每一种网络层协议都有相应的网络控制协议,并通过它们完成点对点通信时网络层参数的配置,如IP地址、DNS的动态协商。

其中上面的大部分都是在建立数据链路的时候用的,数据链路建立后,其实主要用关心的是令数据帧封装,PPP协议下的令数据帧封装格式如下图:

由于PPP协议是点对点的,不需要太多信息,因此这里是没有48位MAC地址概念的,因此,PPP也就无所谓 ARP(地址解析协议)和RARP(逆地址解析协议),这两个是某些网络接口(如以太网和令牌环网)使用的特殊协议。

Android流量数据上网的实现

在Android系统中,应用访问网络时,会首先查看数据上网链路是否已经建立建立,如果已经建立,则直接使用已建立的网络接口进行通信,如果还未建立,则需要首先建立数据通路。PPP拨号上网配置十分复杂,需要一系列的协商、验证,为了开发方便,Linux对PPP数据链路的建立过程进行抽象,实现了pppd拨号应用程序,专门用于管理PPP数据链路的建立与关闭。不过,pppd其实只是负责建立数据链路,建立之后,数据上网不会依赖pppd服务,打个比方就是:pppd只负责修路,不负责运货,在整个手机无线通信中,pppd地位如下图:

image.png

pppd是一个后台服务进程(daemon),实现了所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议,负责把要发送的数据包传递给PPP协议处理模块,设置PPP协议的参数,用来建立/关闭连接。

PPP数据链路建立流程

Android系统如果想要利用PPP协议进行数据通信,必须首先按照PPP协议建立数据通信链路。基带模块正确加载之后会映射多个ttyUSB设备文件,有的ttyUSB用于AT命令发送,有的用作数据通信,底层通过串口多路复用机制,实现了USB串口的多路复用。在使用ttyUSB建立数据链路的时候,首先通过发送AT命令,打开无线上网模块,随后利用pppd拨号程序建立数据链路。拨号链接过程遵循PPP通信协议,手机同蜂窝网络基站双方动态协商,配置链路参数、IP地址等,拨号成功后,Android系统会为基带模块映射一个虚拟网络接口名字可能是ppp0,或者rmnetxxx等,之后,Android系统便可利用该接口进行网络通信了,该接口的使用方式同wlan0类似,IP层对链路层完全无感知。

PPP数据链路的建立需要完成三个步骤,包括链路层配置、链路认证以及网络层配置,这个过程中,通信双方必须通过协商,确定数据包格式、IP地址等链路参数,才能正确建立PPP数据链路。在实际操作中,PPP数据链路的建立可分以下几个阶段:

  • (1) 链路不可用阶段(Link Dead Phase):PPP链路从这个阶段开始和结束,在该阶段,整条链路处于不可用状态,当通信双方检测到物理线路激活时,会从该阶段转入链路建立阶段。
  • (2) 链路建立阶段 (Link Establishment Phase):在此阶段,PPP链路将通过LCP进行协商,确定工作方式、认证方式、链路压缩等。如果LCP协商成功,则转入Opened状态,表示底层链路已经正确建立,如果链路协商失败,则会返回到第一阶段。链路建立成功后,如果配置了PPP认证,则会进入认证阶段,如果没有配置,则直接转入网络层协议阶段。
  • (3) 认证阶段 (Authentication Phase):在此阶段,PPP将进行用户认证工作,通过PAP或者CHAP验证用户名、密码等身份信息,如果认证失败,PPP链路进入链路终止阶段,拆除链路,如果认证成功则转入网络层协议阶段。
  • (4) 网络层协议阶段 (Network-Layer Protocol Phase);在此阶段,每种网络层协议会通过相应网络控制协议进行配置,本课题通过IPCP协商双方IP地址、DNS等,协商成功后,PPP链路便可基于TCP/IP发送或接收报文。
  • (5) 链路终止阶段 (Link Termination Phase):PPP能在任何时候终止链路,如认证失败、载波丢失等情况均会导致链路终止,PPP协议通过交换LCP报文来关闭链路,并通知网络层与物理层强制关闭链路,返回链路不可用阶段。链路建立流程如图3.19所示:

链路建立流程

通信链路建立后,pppd会创建一个网络接口(如ppp0),内核中的PPP协议模块也会登记该网络接口,对上层应用而言,该虚拟网络接口ppp0或者或者rmnetxxx,就是无线上网需要调用的接口,并且该接口创建之初就已经从3G网络获得了动态分配的IP地址,对上层应用而言可以看做一块真实的,并且已经激活的网卡设备,可以像使用以太网卡一样,进行TCP/IP网络通信,pppd服务建立链路的流程图:

pppd拨号建立链路示意图.jpg

数据的发送流程

应用程序通过socket发送TCP/IP数据包时候,内核通过IP地址和路由表找到对应的网络接口(ppp0或者rmnetxxx),然后调用ppp协议相应的实现函数,经PPP协议封装,发送数据,最终通过串口将数据发送到基带模块,并经射频模块将信息传输到附近的基站。

ppp数据发送流程.jpg

数据的接收流程

数据接收流程可以看做是发送的逆向,不过这里稍微有些区别,那就是接收方,在数据链路建立的时候,接收方是pppd拨号进程,建立之后,普通的上网数据,接收方就是一般的用户进程:

数据接收流程.jpg

总结

  • 手机上网走的是PPP协议
  • PPP协议没有MAC地址的概念
  • pppd主要用来铺路(建立链路),不负责运货
  • 链路建立后,对IP层而言,数据通信流程同以太网没有区别

Android 4G上网流程分析相关推荐

  1. Android SDCard UnMounted 流程分析(三)

    前篇地址 Android SDCard UnMounted 流程分析(一) Android SDCard UnMounted 流程分析(二) 前一篇讲到SDCard unmout onEvent 发送 ...

  2. android camera2 API流程分析

    Android camera2 API流程分析 Android5.0之后,新推出来了一个类,android.hardware.camera2,与原来的camera的类实现照相和拍视频的流程有所不同,原 ...

  3. Android UI绘制流程分析(三)measure

    源码版本Android 6.0 请参阅:http://androidxref.com/6.0.1_r10 本文目的是分析从Activity启动到走完绘制流程并显示在界面上的过程,在源码展示阶段为了使跟 ...

  4. Android -- Wifi启动流程分析

    Android -- Wifi启动流程分析 Android网络各个模式中,Wifi应该是目前最常用的一种网络方式了:下面就简单介绍下Android中Wifi的启动流程. 当我在Setting菜单里点击 ...

  5. 【SemiDrive源码分析】【X9芯片启动流程】27 - AP1 Android Preloader启动流程分析(加载atf、tos、bootloader镜像后进入BL31环境)

    [SemiDrive源码分析][X9芯片启动流程]27 - AP1 Android Preloader启动流程分析(加载atf.tos.bootloader镜像后进入BL31环境) 一.Android ...

  6. android volume挂载流程,Android SDCard UnMounted 流程分析(一)

    Android SDCard框架 Android SDCard框架,我们修改一般涉及到四大模块 Linux Kernel 用于检测热拔插,作为框架开发者来说,这者不用涉及 Vold 作为Kernel ...

  7. android app启动流程分析,Android应用开发之Android 7.0 Launcher3的启动和加载流程分析...

    本文将带你了解Android应用开发Android 7.0 Launcher3的启动和加载流程分析,希望本文对大家学Android有所帮助. Android 7.0 Launcher3的启动和加载流程 ...

  8. android 拨号上网流程

    android 网络拨号流程: frameworks\base\services\java\com\android\server\ ConnectivityService.java ->[MyH ...

  9. Android流媒体处理流程分析

    文章目录 1. WiFiDisplay简介 2.RTSP协议流程分析 3. 流媒体协议简介 4. RTP.RTCP协议简介 4.1 RTP协议 4.1 RTP载荷H264码流 4.2 RTP载荷PS码 ...

最新文章

  1. Android:Handler的消息机制
  2. QT利用lamda正则表达式取出字符串中的浮点数与整数
  3. jvm性能调优实战 - 43OOM内存溢出发生的原因及可能发生OOM的内存区域
  4. 优化DOTTEXT之二:缓存用户控件
  5. Python10分钟入门
  6. “棱镜”折射出了什么
  7. sqlserver迁移到mysql遇到的那些坑
  8. plsql存储过程修改后怎么保存_Solidity变量存储位置与gas成本详解
  9. 微信小程序下拉刷新/上拉加载更多
  10. C# 函数 传入 C++动态库中 做回调函数
  11. centOs 7.2*64 ECS nginx安装教程
  12. android studio升级时提示 Connection failed. Please check your network connection and try again
  13. 数据结构——单链表的C++实现
  14. 线性结构 —— 单调栈与单调队列
  15. 2018.1.23日记
  16. 惜时间_惜时间的作文
  17. Swift 声明(Declarations)
  18. ssh整合(spring+springmvc+hibernate)
  19. mysql eav_mysql – 如何使此eav查询生成水平结果
  20. 查看mysql数据库的定时任务_mysql数据库的定时任务

热门文章

  1. 单向链表反转(倒置)问题
  2. 使用WebRTC搭建前端视频聊天室系列文章
  3. Android RxJava操作符的学习---组合合并操作符---联合判断多个事件
  4. JHipster微服务之间的调用以及权限验证
  5. 规则/流程引擎ice-拯救秃头之编排神器
  6. 固定资产管理系统能帮助企业解决哪些问题?
  7. 钙蛋白酶Calpain酶切位点预测工具 —— GPS-CCD 1.0
  8. wifi5和wifi6差别 wifi5和wifi6区别
  9. 【TouchDesigner】生成艺术
  10. Linux-配置yum软件仓库