天天看點

第十一篇 ANDROID 系統網絡連接配接和管理機制與架構

一  網絡連接配接功能介紹

          ANDROID 系統網絡連接配接和管理服務由四個系統服務ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成網絡連接配接和管理功能,四個服務隻有ConnectivityService、NetworkPolicyManagerService兩個服務通過NetworkPolicyManager、ConnectivityManager兩個用戶端對象對應用程式提供對外SDK接口,而NetworkManagementService、NetworkStatsService沒有對外提供SDK接口,但設定應用程式可以通過擷取系統服務接口使用NetworkManagementService、NetworkStatsService服務.

       四個服務之間的關系類圖如下:

第十一篇 ANDROID 系統網絡連接配接和管理機制與架構

                                                     圖1 網絡連接配接系統類圖

          ConnectivityService提供資料連接配接管理服務,NetworkPolicyManagerService提供網絡政策管理服務,NetworkStatsService提供網絡傳輸資料統計服務,NetworkManagementService提供對實體網絡接口的管理服務,connectivityService也包括VPN、Tethering對象提供虛拟連接配接及共享連接配接管理。

        ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三個服務都通過INetworkManagementService接口跨程序通路NetworkManagementService服務,實作與網絡接口的互動及資訊讀取。

        NetworkStatsService、NetworkPolicyManagerService兩個服務還通過IConnectivityManager接口與connectivityService服務通訊,從connectivityService讀取網絡連接配接的資訊及打開資料連接配接的政策控制。

        ConnectivityService服務也通過INetworkPolicyManager接口調用NetworkPolicyManagerService的API,讀取網絡限額資訊,登記監聽對象。connectivityService服務通過NetworkPolicyManagerService服務的registerListener函數向NetworkPolicyManagerService服務注冊一個INetworkPolicyListener.Stub監聽樁對象。 NetworkPolicyManagerService通過該監聽對象的遠端代理接口向ConnectivityService服務傳送規則變化通知。

       另外ConnectivityService服務的Tethering、VPN對象及NetworkPolicyManagerService、NetworkStatsService服務的内部NetworkAlertObserver類型的對象都直接或間接派生自INetworkManagementEventObserver.Stub,且四個對象都登記為NetworkManagementService的監聽對象,NetworkManagementService服務通過INetworkManagementEventObserver接口向這些對象傳送網絡接口事件通知。

       NetworkPolicyManagerService維護網絡使用政策,政策可以從一個政策檔案讀取(政策檔案儲存在系統目錄下的netpolicy.xml檔案中)。也可以通過NetworkPolicyManager對外提供的設定政策接口(setNetworkPolicies及setUidPolicy)進行設定,NetworkPolicyManagerService能夠根據這些設定或從政策檔案中讀取的政策控制網絡連接配接。另外NetworkPolicyManagerService還具有動态調節網絡連接配接限額及動态設定網絡連接配接的功能,動态調節網絡連接配接限額機制是通過INetworkStatsService通路NetworkStatsService服務獲得上面設定或讀取的政策比對的網絡連接配接類型的傳輸統計資訊(NetworkPolicyManagerService采用NetworkTemplate進行網絡連接配接類型的比對),并根據這些資訊生成有效的規則,并送出給ConnectivityService服務,并調用NetworkManagementService的setInterfaceQuota函數對網絡連接配接的帶寬限額進行控制。

       動态設定網絡連接配接規則的機制是NetworkPolicyManagerService服務通過檢測系統發出的一些相關事件(在NetworkPolicyManagerService的啟動systemReady函數中注冊),包括ActivityManager服務中IProcessObserver的onForegroundActivitiesChanged及onProcessDied回調事件,NetworkManager服務中INetworkManagementEventObserver的limitReached回調事件,以及ACTION_SCREEN_ON 、CONNECTIVITY_ACTION_IMMEDIATE、ACTION_PACKAGE_ADDED、ACTION_UID_REMOVED、ACTION_NETWORK_STATS_UPDATED、ACTION_ALLOW_BACKGROUND等INTENT事件,當這些事件發生時,根據事件不同對網絡規則進行不同設定,如與應用程式相關的事件調用updateRulesForUidLocked函數對uid涉及的NetworkRule進行更新,其它事件通過updateNetworkEnabledLocked函數調用connectivityService的setPolicyDataEnable函數對特定網絡連接配接類型的資料連接配接進行設定。

        NetworkStatsService服務定期調用performPoll函數獲得網絡傳輸統計資訊,performPoll函數通過調用NetworkManagementService服務的getNetworkStatsUidDetail、getNetworkStatsSummary及getNetworkStatsTethering函數從/proc/目錄下的包含網絡傳輸統計資料的檔案中讀取網絡統計資訊,并轉換為NetworkStatsHistory資料結構,儲存到以網絡接口名稱對應的NetworkIdentitySet類型和UID對應的UidStatsKey類型的變量為key的NetworkStatsService的三個HashMap變量中。然後根據performPoll傳進來的參數标志資訊(訓示不同的PERSIST方法)調用writeNetworkDevStatsLocked、writeNetworkXtStatsLocked、writeUidStatsLocked函數把HashMap變量中的統計資訊分别寫入系統目錄下的三個相應的BIN檔案(netstats.bin、netstats_xt.bin、netstats_uid.bin)中。

        NetworkManagementService的一個重要功能是與本地netd程序進行通訊,完成對網絡實體接口的操作。NetworkManagementService通過NativeDaemonConnector與本地netd程序通過LocalSocket建立連接配接進行雙向通訊,發送指令,讀取事件和指令應答消息,對網絡接口的實際操作由netd程序完成。NativeDaemonConnector對象是一個實作Runnable接口的對象,NativeDaemonConnector對象在NetworkManagementService建立的線程中運作。

        NativeDaemonConnector通過執行個體化時從NetworkManagementService傳進來的回調函數向NetworkManagementService傳送從netd程序讀取的事件,主要事件有接口增加、接口移出、接口狀态變化、LINK狀态變化等接口改變事件以及帶寬控制事件。

二 connectivityService連接配接實作機制

        整個類圖中ConnectivityService服務是核心,實作對系統的所有資料連接配接進行管理,包括實體連接配接、虛拟連接配接以及共享連接配接。

       ConnectivityService服務通過NetworkStateTracker類對象進行實體連接配接的管理、監控各種類型的網絡連接配接,從中擷取網絡資訊,ConnectivityService服務通過Tethering對象提供網絡連接配接共享服務,通過Vpn對象提供VPN連接配接服務。

       ANDROID 4.0 版本準備支援的網絡連接配接類型包括五個預設的同時隻能激活一個的資料連接配接類型:MOBILE _ TYPE、WIFI _ TYPE、BLUETOOTH _ TYPE、ETHERNET _ TYPE、WIMAX _ TYPE(WIMAX _ TYPE尚未實際實作)。另外還有八個可以和獨立的資料連接配接類型共存的子類型: MOBILE_MMS _ TYPE(用于多媒體消息服務的移動資料連接配接類型,可以和MOBILE_TYPE資料連接配接類型相同也可以不同);MOBILE_SUPL_ TYPE(定位裝置的安全使用者平面定位服務用的移動資料連接配接類型,可以和MOBILE_ TYPE資料連接配接類型相同也可以不同);MOBILE_DUN_ TYPE(用于執行撥号網絡橋接的移動資料連接配接類型,可以和MOBILE_ TYPE資料連接配接類型相同也可以不同);MOBILE_HIPRI_ TYPE(一個具有最高優先級的移動資料連接配接類型,與MOBILE _ TYPE類型除了路由設定不同外,其它方面都相同。在路由設定時,如果預設路由存在,則僅當請求程序必須存取移動DNS服務及IP明确的通過requestRouteToHost函數請求時使用這個資料連接配接接口);MOBILE_FOTA_ TYPE(用于空中固件更新的移動資料連接配接);MOBILE_IMS_ TYPE(用于IP多媒體子系統的移動資料連接配接類型);MOBILE_CBS_ TYPE(用于品牌服務的移動資料連接配接類型),WIFI_P2P(用于WIFI點對點連接配接)。

第十一篇 ANDROID 系統網絡連接配接和管理機制與架構

                                                      圖2  NetworkStateTracker類圖

         ConnectivityService在執行個體化時讀取frameworks\base\core\res\res\values下的config.xml資源檔案的networkAttributes屬性,并networkAttributes屬性的每個連接配接執行個體化一個NetworkConfig對象,然後根據NetworkConfig對象為每個預設的資料連接配接類型采用單例模式執行個體化一個具體NetworkStateTracker對象(每個具體NetworkStateTracker對象的派生關系如圖2所示)。

         每個具體的實際NetworkStateTracker對象都對應一個特定連接配接的服務,如EthernetDataTracker對應一個EthernetService,且每個具體的NetworkStateTracker對象通過對應服務的遠端管理對象與服務互動,讀取服務的資訊。如EthernetDataTracker通過讀取EthernetService對應的資訊, MobileDataStateTracker通過接口ITelephony與Telephony服務互動,WifiStateTracker通過WifiManager接口與WifiService服務互動。

         ConnectivityService通過NetworkStateTracker對象實作對網絡連接配接的控制和管理,每個連接配接都對應一個優先級,當幾個預設類型的連接配接同時可用時,ConnectivityService選擇最高優先級的可用連接配接。系統預設的網絡優先級定義在frameworks\base\core\res\res\values下的config.xml中的networkAttributes屬性中。

    <string-array translatable="false" name="networkAttributes">

        <item>"ethernet,9,9,1,-1,true"</item>

        <item>"wifi,1,1,1,-1,true"</item>

        <item>"mobile,0,0,0,-1,true"</item>

        <item>"mobile_mms,2,0,2,60000,true"</item>

        <item>"mobile_supl,3,0,2,60000,true"</item>

        <item>"mobile_hipri,5,0,3,60000,true"</item>

        <item>"mobile_fota,10,0,2,60000,true"</item>

        <item>"mobile_ims,11,0,2,60000,true"</item>

        <item>"mobile_cbs,12,0,2,60000,true"</item>

        <item>"wifi_p2p,13,1,0,-1,true"</item>

    </string-array>

        ConnectivityService服務也通過NetworkStateTracker獲得連接配接的狀态資訊及對網絡狀态事件進行監控。ConnectivityService通過NetworkStateTracker對象的startMonitoring函數啟動資料連接配接的監控,ConnectivityService服務的消息處理句柄通過startMonitoring函數傳給NetworkStateTracker對象,NetworkStateTracker對象通過該句柄向ConnectivityService傳送網絡狀态事件。  

       ConnectivityService通過NetworkStateTracker對象可以擷取的資料連接配接資訊主要包含三類:LinkProperties描述一個網絡連接配接屬性資訊(包含網絡位址、網關、DNS、HTTP代理等屬性資訊),一個網絡連接配接可能由多個位址、多個網關、多個DNS,但僅有一個HTTP代理,LinkCapabilities(描述一個網絡連接配接能力方面的資訊,包括帶寬、延遲等),NetworkInfo(描述一個給定類型的網絡接口的狀态方面的資訊,包括網絡連接配接狀态、網絡類型、網絡可連接配接性、是否漫遊等資訊)。ConnectivityService通過NetworkStateTracker對象的三個接口可以獲得這些資訊(getNetworkInfo,getLinkProperties、getLinkCapabilities),并通過getActiveNetworkInfo、getNetworkInfo、getAllNetworkInfo、getLinkProperties、getAllNetworkState等函數對外提供這方面的資訊。ConnectivityService服務調用NetworkStateTracker的reconnect、teardown、setRadio、setUserDataEnable、setPolicyDataEnable等函數實作對特定網絡連接配接的控制。

       ConnectivityService服務通過Tethering對象為WIFI、BLUETOOTH連接配接提供連接配接共享服務(其它裝置使用另一個裝置的連接配接,如WIFI熱點等),connectivityService服務通過tether函數啟動網絡接口的Tethering服務。可以通過藍牙、WIFI、USB對其它裝置提供Tethering服務。

第十一篇 ANDROID 系統網絡連接配接和管理機制與架構

                                                                      圖3  Tethering類圖

         Tethering對象使用了狀态模式來實作共享連接配接機制的實作,為每個狀态建立一個狀态對象,一個狀态對象根據不同情景可以切換到另一個狀态對象。Tethering類圖見圖3所示, Tethering對象為每一個使用共享連接配接的實體接口維護一個TetherInterfaceSM類型的狀态機,管理Tethering接口的狀态。TetherInterfaceSM狀态機在NetworkManagementService服務觸發的interfaceAdded回調中執行個體化。TetherInterfaceSM類型的狀态機包括InitialState(初始狀态)、StartingState(啟動狀态)、TetheredState(共享狀态)、UnavailableState(連接配接不可用狀态)四個狀态。TetherInterfaceSM通過isAvailable、isTethered、isErrored、getLastError等函數對外提供Tethering接口的狀态資訊,進而使Tethering的getTetherableIfaces、getTetheredIfaces、getTetheredIfacePairs、getTetheringErroredIfaces、getLastTetherError等函數可以從接口對應的狀态機中獲得Tethering接口的狀态。TetherInterfaceSM狀态機在正常共享工作情況下應該處于TetheredState狀态,在TetheredState狀态通過NetworkManagementService的tetherInterface的函數來添加使用共享連接配接的接口。

        另外Tethering對象還提供了一個TetherMasterSM類型的主要狀态機,提供共享連接配接的啟動、停止等管理及連接配接狀态事件的監控并向TetherInterfaceSM狀态機發送事件通知。TetherMasterSM狀态機的狀态包括兩個大類:TetherMasterUtilState及ErrorState。TetherMasterUtilState類型的狀态包括InitialState(初始狀态)、TetherModeAliveState(共享模式激活狀态)兩個狀态。ErrorState類型的狀态包括SetIpForwardingEnabledErrorState、SetIpForwardingEnabledErrorState、SetIpForwardingDisabledErrorState、StartTetheringErrorState、StopTetheringErrorState、SetDnsForwardersErrorState等出錯狀态。正常共享工作情況下TetherMasterSM狀态機處于TetherModeAliveState狀态,在TetherModeAliveState狀态打開共享連接配接,并調用NetworkManagementService服務的setIpForwardingEnabled、setDnsForwarders、startTethering函數啟動共享連接配接服務。

          Tethering對象從frameworks\base\core\res\res\values下的config.xml的資源檔案中的config_tether_upstream_types屬性中讀取可用的共享連接配接類型,item值為1對應WIFI類型。

    <integer-array translatable="false" name="config_tether_upstream_types">

        <item>1</item>

    </integer-array>

         TetherInterfaceSM狀态機由Tethering對象的tether函數啟動,并使TetherInterfaceSM和TetherMasterSM狀态機從初始狀态推進到正常共享狀态。

         TetherMasterSM還采用觀察者模式向TetherMasterSM狀态機發送事件,TetherMasterSM狀态機維護一個TetherInterfaceSM狀态機數組清單,TetherMasterSM狀态機通過該清單向清單中登記的每個TetherInterfaceSM狀态機發送Tethering接口狀态事件(包括錯誤狀态)。TetherMasterSM狀态機也可以直接向某個TetherInterfaceSM狀态機發送Tethering接口狀态事件。

         Tethering接口的添加及共享連接配接的啟動、停止、tether dns set、Ip Forward  Enabled等功能由NetworkManagementService服務通過調用NativeDaemonConnector的doCommand函數向底層netd 程序發送指令完成,由netd 程序實際完成以上工作。

         ConnectivityService服務通過prepareVpn、establishVpn、、protectVpn三個函數并調用VPN對象的相應函數(prepare、establish、protect)建立VPN連接配接和維護VPN連接配接。VPN對象在establish函數中通過JNI調用建立VPN連接配接接口并設定VPN連接配接位址和路由。

                                                       版權所有,轉載時請尊重原創顯要處注明連結,謝謝!

上一篇

下一篇