手機一般會提供兩種上網方式: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地位如下圖:
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服務建立鏈路的流程圖:
資料的傳送流程
應用程式通過socket傳送TCP/IP資料包時候,核心通過IP地址和路由表找到對應的網路介面(ppp0或者rmnetxxx),然後呼叫ppp協議相應的實現函式,經PPP協議封裝,傳送資料,最終通過串列埠將資料傳送到基帶模組,並經射頻模組將資訊傳輸到附近的基站。
資料的接收流程
資料接收流程可以看做是傳送的逆向,不過這裡稍微有些區別,那就是接收方,在資料鏈路建立的時候,接收方是pppd撥號程式,建立之後,普通的上網資料,接收方就是一般的使用者程式:
總結
- 手機上網走的是PPP協議
- PPP協議沒有MAC地址的概念
- pppd主要用來鋪路(建立鏈路),不負責運貨
- 鏈路建立後,對IP層而言,資料通訊流程同乙太網沒有區別
作者:看書的小蝸牛 Android 3G/4G流量上網原理簡析
僅供參考,歡迎指正