ANDROID 系统网络连接和管理机制

   网络连接功能介绍
       ANDROID  系统网络连接和管理服务由四个系统服务C onnectivityService NetworkPolicyManagerService NetworkManagementService NetworkStatsService 共同配合完成网络连接和管理功能,四个服务只有C onnectivityService NetworkPolicyManagerService 两个服务通过 NetworkPolicyManager ConnectivityManager 两个客户端对象对应用程序提供对外 SDK 接口,而 NetworkManagementService NetworkStatsService 没有对外提供 SDK 接口 , 但设置应用程序可以通过获取系统服务接口使用 NetworkManagementService NetworkStatsService 服务 .
     四个服务之间的关系类图如下:

         

1346643661_1973.jpg (146.17 KB, 下载次数: 26)

下载附件  保存到相册

2012-9-19 17:02 上传


                                                     图 1   网络连接系统类图

        ConnectivityService 提供数据连接管理服务,N etworkPolicyManagerService 提供网络策略管理服务, NetworkStatsService 提供网络传输数据统计服务, NetworkManagementService 提供对物理网络接口的管理服务, connectivityService 也包括 VPN Tethering 对象提供虚拟连接及共享连接管理。
        ConnectivityService 、N etworkPolicyManagerService NetworkStatsService 三个服务都通过 INetworkManagementService 接口跨进程访问 NetworkManagementService 服务,实现与网络接口的交互及信息读取。
        NetworkStatsService NetworkPolicyManagerService 两个服务还通过 IConnectivityManager 接口与 connectivityService 服务通讯,从 connectivityService 读取网络连接的信息及打开数据连接的策略控制。
        ConnectivityService 服务也通过 INetworkPolicyManager 接口调用 NetworkPolicyManagerService API ,读取网络限额信息,登记监听对象。 connectivityService 服务通过 NetworkPolicyManagerService 服务的 registerListener 函数向 NetworkPolicyManagerService 服务注册一个 INetworkPolicyListener.Stub 监听桩对象。  NetworkPolicyManagerService 通过该监听对象的远程代理接口向 ConnectivityService 服务传送规则变化通知。
        另外C onnectivityService 服务的 Tethering VPN 对象及 NetworkPolicyManagerService NetworkStatsService 服务的内部 NetworkAlertObserver 类型的对象都直接或间接派生自 INetworkManagementEventObserver.Stub ,且四个对象都登记为 NetworkManagementService 的监听对象, NetworkManagementService 服务通过 INetworkManagementEventObserver 接口向这些对象传送网络接口事件通知。
       NetworkPolicyManagerService 维护网络使用策略,策略可以从一个策略文件读取(策略文件保存在系统目录下的 netpolicy.xml 文件中)。也可以通过 NetworkPolicyManager 对外提供的设置策略接口( setNetworkPolicies setUidPolicy )进行设置, NetworkPolicyManagerService 能够根据这些设置或从策略文件中读取的策略控制网络连接。另外 NetworkPolicyManagerService 还具有动态调节网络连接限额及动态设置网络连接的功能,动态调节网络连接限额机制是通过 INetworkStatsService 访问 NetworkStatsService 服务获得上面设置或读取的策略匹配的网络连接类型的传输统计信息( NetworkPolicyManagerService 采用 NetworkTemplate 进行网络连接类型的匹配),并根据这些信息生成有效的规则,并提交给C onnectivityService 服务,并调用 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  连接实现机制
      整个类图中C onnectivityService 服务是核心,实现对系统的所有数据连接进行管理,包括物理连接、虚拟连接以及共享连接。
        ConnectivityService 服务通过 NetworkStateTracker 类对象进行物理连接的管理、监控各种类型的网络连接,从中获取网络信息,C onnectivityService 服务通过 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 点对点连接)。
      

1346643677_3057.jpg (81.18 KB, 下载次数: 14)

下载附件  保存到相册

2012-9-19 17:02 上传


                     
                                                        2  NetworkStateTracker 类图
         ConnectivityService 在实例化时读取 frameworksasecoreeses alues 下的 config.xml 资源文件的networkAttributes 属性 ,并 networkAttributes 属性的每个连接实例化一个 NetworkConfig 对象,然后根据 NetworkConfig 对象 为每个默认的数据连接类型采用单例模式实例化一个具体 NetworkStateTracker 对象(每个具体 NetworkStateTracker 对象的派生关系如图 所示)。
          每个具体的实际 NetworkStateTracker 对象都对应一个特定连接的服务,如 EthernetDataTracker 对应一个 EthernetService ,且每个具体的 NetworkStateTracker 对象通过对应服务的远程管理对象与服务交互,读取服务的信息。如 EthernetDataTracker通过 读取 EthernetService 对应的信息,  MobileDataStateTracker通过 接口I Telephony Telephony 服务交互, 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 描述一个网络连接属性信息(包含网络地址、网关、 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 服务。
  

1346643688_9710.jpg (93.57 KB, 下载次数: 10)

下载附件  保存到相册

2012-9-19 17:02 上传



                                                                       图 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 对象从 frameworksasecoreeses alues 下的 config.xml 的资源文件中的 config_tether_upstream_types 属性中读取可用的共享连接类型, item 值为 对应 WIFI 类型。
    
        1
    

         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 连接地址和路由。

猜你喜欢

转载自blog.csdn.net/zhgeliang/article/details/80512178