手機通常會提供兩種上網方式: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流量上網原理簡析
僅供參考,歡迎指正