ANDROID 系統網絡連接和管理機制

  網絡連接功能介紹
       ANDROID 系統網絡連接和管理服務由四個系統服務ConnectivityServiceNetworkPolicyManagerServiceNetworkManagementServiceNetworkStatsService共同配合完成網絡連接和管理功能,四個服務只有ConnectivityServiceNetworkPolicyManagerService兩個服務通過NetworkPolicyManagerConnectivityManager兩個客戶端對象對應用程序提供對外SDK接口,而NetworkManagementServiceNetworkStatsService沒有對外提供SDK接口,但設置應用程序可以通過獲取系統服務接口使用NetworkManagementServiceNetworkStatsService服務.
     四個服務之間的關係類圖如下:

           
                                                     圖1  網絡連接系統類圖

        ConnectivityService提供數據連接管理服務,NetworkPolicyManagerService提供網絡策略管理服務,NetworkStatsService提供網絡傳輸數據統計服務,NetworkManagementService提供對物理網絡接口的管理服務,connectivityService也包括VPNTethering對象提供虛擬連接及共享連接管理。
        ConnectivityService、NetworkPolicyManagerServiceNetworkStatsService三個服務都通過INetworkManagementService接口跨進程訪問NetworkManagementService服務,實現與網絡接口的交互及信息讀取。
        NetworkStatsServiceNetworkPolicyManagerService兩個服務還通過IConnectivityManager接口與connectivityService服務通訊,從connectivityService讀取網絡連接的信息及打開數據連接的策略控制。
        ConnectivityService服務也通過INetworkPolicyManager接口調用NetworkPolicyManagerServiceAPI,讀取網絡限額信息,登記監聽對象。connectivityService服務通過NetworkPolicyManagerService服務的registerListener函數向NetworkPolicyManagerService服務註冊一個INetworkPolicyListener.Stub監聽樁對象。 NetworkPolicyManagerService通過該監聽對象的遠程代理接口向ConnectivityService服務傳送規則變化通知。
       另外ConnectivityService服務的TetheringVPN對象及NetworkPolicyManagerServiceNetworkStatsService服務的內部NetworkAlertObserver類型的對象都直接或間接派生自INetworkManagementEventObserver.Stub,且四個對象都登記爲NetworkManagementService的監聽對象,NetworkManagementService服務通過INetworkManagementEventObserver接口向這些對象傳送網絡接口事件通知。
       NetworkPolicyManagerService維護網絡使用策略,策略可以從一個策略文件讀取(策略文件保存在系統目錄下的netpolicy.xml文件中)。也可以通過NetworkPolicyManager對外提供的設置策略接口(setNetworkPoliciessetUidPolicy)進行設置,NetworkPolicyManagerService能夠根據這些設置或從策略文件中讀取的策略控制網絡連接。另外NetworkPolicyManagerService還具有動態調節網絡連接限額及動態設置網絡連接的功能,動態調節網絡連接限額機制是通過INetworkStatsService訪問NetworkStatsService服務獲得上面設置或讀取的策略匹配的網絡連接類型的傳輸統計信息(NetworkPolicyManagerService採用NetworkTemplate進行網絡連接類型的匹配),並根據這些信息生成有效的規則,並提交給ConnectivityService服務,並調用NetworkManagementService setInterfaceQuota函數對網絡連接的帶寬限額進行控制。
     動態設置網絡連接規則的機制是NetworkPolicyManagerService服務通過檢測系統發出的一些相關事件(在NetworkPolicyManagerService的啓動systemReady函數中註冊),包括ActivityManager服務中IProcessObserveronForegroundActivitiesChangedonProcessDied回調事件,NetworkManager服務中INetworkManagementEventObserverlimitReached回調事件,以及ACTION_SCREEN_ON  CONNECTIVITY_ACTION_IMMEDIATEACTION_PACKAGE_ADDEDACTION_UID_REMOVEDACTION_NETWORK_STATS_UPDATEDACTION_ALLOW_BACKGROUNDINTENT事件,當這些事件發生時,根據事件不同對網絡規則進行不同設置,如與應用程序相關的事件調用updateRulesForUidLocked函數對uid 涉及的NetworkRule進行更新,其它事件通過updateNetworkEnabledLocked函數調用connectivityServicesetPolicyDataEnable函數對特定網絡連接類型的數據連接進行設置。
         NetworkStatsService服務定期調用performPoll函數獲得網絡傳輸統計信息,performPoll函數通過調用NetworkManagementService服務的getNetworkStatsUidDetailgetNetworkStatsSummarygetNetworkStatsTethering函數從/proc/目錄下的包含網絡傳輸統計數據的文件中讀取網絡統計信息,並轉換爲NetworkStatsHistory數據結構,保存到以網絡接口名稱對應的NetworkIdentitySet類型和UID 對應的UidStatsKey類型的變量爲key NetworkStatsService的三個HashMap變量中。然後根據performPoll傳進來的參數標誌信息(指示不同的PERSIST方法)調用writeNetworkDevStatsLockedwriteNetworkXtStatsLockedwriteUidStatsLocked函數把HashMap變量中的統計信息分別寫入系統目錄下的三個相應的BIN文件(netstats.binnetstats_xt.binnetstats_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 _ TYPEWIFI _ TYPEBLUETOOTH _ TYPEETHERNET _ TYPEWIMAX _ TYPEWIMAX _ 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點對點連接)。
        
                     
                                                       2  NetworkStateTracker類圖
         ConnectivityService在實例化時讀取frameworksasecoreeses alues下的config.xml資源文件的networkAttributes屬性,並networkAttributes屬性的每個連接實例化一個NetworkConfig對象,然後根據NetworkConfig對象爲每個默認的數據連接類型採用單例模式實例化一個具體NetworkStateTracker對象(每個具體NetworkStateTracker對象的派生關係如圖所示)。
         每個具體的實際NetworkStateTracker對象都對應一個特定連接的服務,如EthernetDataTracker對應一個EthernetService,且每個具體的NetworkStateTracker對象通過對應服務的遠程管理對象與服務交互,讀取服務的信息。如EthernetDataTracker通過讀取EthernetService對應的信息, MobileDataStateTracker通過接口ITelephonyTelephony服務交互,WifiStateTracker通過WifiManager接口與WifiService服務交互。
         ConnectivityService通過NetworkStateTracker對象實現對網絡連接的控制和管理,每個連接都對應一個優先級,當幾個默認類型的連接同時可用時,ConnectivityService選擇最高優先級的可用連接。系統默認的網絡優先級定義在frameworksasecoreeses alues下的config.xml中的networkAttributes屬性中
    
        "ethernet,9,9,1,-1,true"
        "wifi,1,1,1,-1,true"
        "mobile,0,0,0,-1,true"
        "mobile_mms,2,0,2,60000,true"
        "mobile_supl,3,0,2,60000,true"
        "mobile_hipri,5,0,3,60000,true"
        "mobile_fota,10,0,2,60000,true"
        "mobile_ims,11,0,2,60000,true"
        "mobile_cbs,12,0,2,60000,true"
        "wifi_p2p,13,1,0,-1,true"
    
         ConnectivityService服務也通過NetworkStateTracker獲得連接的狀態信息及對網絡狀態事件進行監控。ConnectivityService通過NetworkStateTracker對象的startMonitoring函數啓動數據連接的監控,ConnectivityService服務的消息處理句柄通過startMonitoring函數傳給NetworkStateTracker對象,NetworkStateTracker對象通過該句柄向ConnectivityService傳送網絡狀態事件。   
         ConnectivityService通過NetworkStateTracker對象可以獲取的數據連接信息主要包含三類:LinkProperties描述一個網絡連接屬性信息(包含網絡地址、網關、DNSHTTP代理等屬性信息),一個網絡連接可能由多個地址、多個網關、多個DNS,但僅有一個HTTP代理,LinkCapabilities(描述一個網絡連接能力方面的信息,包括帶寬、延遲等),NetworkInfo(描述一個給定類型的網絡接口的狀態方面的信息,包括網絡連接狀態、網絡類型、網絡可連接性、是否漫遊等信息)。ConnectivityService通過NetworkStateTracker對象的三個接口可以獲得這些信息(getNetworkInfogetLinkPropertiesgetLinkCapabilities),並通過getActiveNetworkInfogetNetworkInfogetAllNetworkInfogetLinkPropertiesgetAllNetworkState等函數對外提供這方面的信息。ConnectivityService服務調用NetworkStateTrackerreconnectteardownsetRadiosetUserDataEnablesetPolicyDataEnable等函數實現對特定網絡連接的控制。
        ConnectivityService服務通過Tethering對象爲WIFIBLUETOOTH連接提供連接共享服務(其它設備使用另一個設備的連接,如WIFI熱點等),connectivityService服務通過tether函數啓動網絡接口的Tethering服務。可以通過藍牙、WIFIUSB對其它設備提供Tethering服務。
    

                                                                      圖3  Tethering 類圖
        Tethering對象使用了狀態模式來實現共享連接機制的實現,爲每個狀態創建一個狀態對象,一個狀態對象根據不同情景可以切換到另一個狀態對象。Tethering類圖見圖3所示, Tethering對象爲每一個使用共享連接的物理接口維護一個TetherInterfaceSM類型的狀態機,管理Tethering接口的狀態。TetherInterfaceSM狀態機在NetworkManagementService服務觸發的interfaceAdded回調中實例化。TetherInterfaceSM類型的狀態機包括InitialState(初始狀態)、StartingState(啓動狀態)、TetheredState(共享狀態)、UnavailableState(連接不可用狀態)四個狀態。TetherInterfaceSM通過isAvailableisTetheredisErroredgetLastError等函數對外提供Tethering接口的狀態信息,從而使TetheringgetTetherableIfacesgetTetheredIfacesgetTetheredIfacePairsgetTetheringErroredIfacesgetLastTetherError等函數可以從接口對應的狀態機中獲得Tethering接口的狀態。TetherInterfaceSM狀態機在正常共享工作情況下應該處於TetheredState狀態,在TetheredState狀態通過NetworkManagementServicetetherInterface的函數來添加使用共享連接的接口。
      另外Tethering對象還提供了一個TetherMasterSM類型的主控狀態機,提供共享連接的啓動、停止等管理及連接狀態事件的監控並向TetherInterfaceSM狀態機發送事件通知。TetherMasterSM狀態機的狀態包括兩個大類:TetherMasterUtilStateErrorStateTetherMasterUtilState類型的狀態包括InitialState(初始狀態)、TetherModeAliveState(共享模式激活狀態)兩個狀態。ErrorState類型的狀態包括SetIpForwardingEnabledErrorStateSetIpForwardingEnabledErrorStateSetIpForwardingDisabledErrorStateStartTetheringErrorStateStopTetheringErrorStateSetDnsForwardersErrorState等出錯狀態。正常共享工作情況下TetherMasterSM狀態機處於TetherModeAliveState狀態,在TetherModeAliveState狀態打開共享連接,並調用NetworkManagementService服務的setIpForwardingEnabledsetDnsForwardersstartTethering函數啓動共享連接服務。
          Tethering對象從frameworksasecoreeses alues下的config.xml的資源文件中的config_tether_upstream_types屬性中讀取可用的共享連接類型,item值爲對應WIFI類型。
    
        1
    

         TetherInterfaceSM狀態機由Tethering對象的tether函數啓動,並使TetherInterfaceSMTetherMasterSM狀態機從初始狀態推進到正常共享狀態。
         TetherMasterSM還採用觀察者模式向TetherMasterSM狀態機發送事件,TetherMasterSM狀態機維護一個TetherInterfaceSM狀態機數組列表,TetherMasterSM狀態機通過該列表向列表中登記的每個TetherInterfaceSM狀態機發送Tethering接口狀態事件(包括錯誤狀態)。TetherMasterSM狀態機也可以直接向某個TetherInterfaceSM狀態機發送Tethering接口狀態事件。
         Tethering接口的添加及共享連接的啓動、停止、tether dns set Ip Forward  Enabled 等功能由NetworkManagementService服務通過調用NativeDaemonConnectordoCommand函數向底層netd  進程發送命令完成,由netd  進程實際完成以上工作。
         ConnectivityService服務通過prepareVpn establishVpn、、protectVpn三個函數並調用VPN對象的相應函數(prepareestablishprotect)建立VPN連接和維護VPN連接。VPN對象在establish函數中通過JNI 調用建立VPN連接接口並設置VPN連接地址和路由。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章