Android 物理网络接口管理服务深度分析

2 阅读6分钟

一、核心架构分层

4 层架构体系

应用层 (App Layer)
  ├─ EthernetManager         [以太网管理 API]
  ├─ WifiManager             [WiFi 管理 API]
  ├─ TelephonyManager        [蜂窝网络 API]
  └─ ConnectivityManager     [统一网络 API]
        ↓
框架层 (Framework Layer)
  ├─ EthernetService/Tracker    [以太网服务]
  ├─ WifiService                [WiFi 服务]
  ├─ Phone/DataNetwork          [蜂窝数据服务]
  ├─ ConnectivityService        [连接协调]
  └─ NetworkManagementService   [网络管理]
        ↓
Binder 通信层 (IPC)
  ├─ INetd                       [netd Binder 接口]
  ├─ IEthernetManager            [以太网 Binder 接口]
  ├─ ITelephony                  [电话 Binder 接口]
  └─ INetdUnsolicitedEventListener [事件回调]
        ↓
内核层 (Kernel Layer)
  ├─ Netlink 事件监听           [/proc/net/netlink]
  ├─ 网络接口驱动               [eth0, wlan0, rmnet_data0]
  ├─ 路由表管理                 [ip route]
  └─ Firewall/eBPF              [netfilter, tc]

二、物理接口的 3 大类型管理

1. 以太网接口管理(EthernetService)

EthernetTracker (主要服务)
    ├─ EthernetNetlinkMonitor
    │   └─ 监听 RTM_NEWLINK/RTM_DELLINK 事件
    │
    ├─ EthernetNetworkFactory
    │   ├─ 创建 NetworkInterfaceState
    │   ├─ 注册 NetworkOffer(候选网络)
    │   └─ 管理 NetworkAgent(活跃网络)
    │
    └─ IP 配置管理
        ├─ DHCP 获取
        ├─ 静态 IP 配置
        └─ LinkProperties 更新

关键事件

// EthernetTracker 事件处理
EthernetNetlinkMonitor.processRtNetlinkLinkMessage()
    ├─ RTM_NEWLINK → onNewLink()
    │   ├─ maybeTrackInterface(ifname)
    │   └─ updateInterfaceState(ifname, linkUp)
    │
    └─ RTM_DELLINK → onDelLink()
        └─ stopTrackingInterface(ifname)

2. WiFi 接口管理

WiFiStateMachine / WifiService
    ├─ 接口 ENABLE/DISABLE
    │   └─ wlan0 创建/销毁
    │
    ├─ 链接事件
    │   ├─ 扫描 (SCAN)
    │   ├─ 连接 (CONNECT)
    │   ├─ 关联 (ASSOCIATED)
    │   └─ 获取 IP (OBTAINING_IPADDR)
    │
    └─ LinkProperties
        ├─ IP 地址
        ├─ DNS 服务器
        ├─ 路由表
        └─ 代理信息

3. 蜂窝网络接口管理(Telephony)

DataNetwork / DataConnection
    ├─ APN 设置
    │   ├─ 互联网 APN (default)
    │   ├─ IMS APN
    │   └─ 彩信 APN (mms)
    │
    ├─ 接口创建
    │   └─ rmnet_data0, rmnet_data1 等
    │
    ├─ 连接状态
    │   ├─ DISCONNECTED
    │   ├─ CONNECTING
    │   ├─ CONNECTED
    │   ├─ SUSPENDED
    │   ├─ DISCONNECTING
    │   └─ HANDOVER_IN_PROGRESS
    │
    └─ LinkProperties
        ├─ IPv4 地址 + Prefix
        ├─ IPv6 地址 + Prefix
        ├─ 默认路由
        └─ DNS 服务器

三、物理接口发现与监控机制

Netlink 事件流

内核网络栈
    ↓ [RTM_NEWLINK/RTM_DELLINK 消息]
Netlink Socket (/proc/sys/kernel/netlink/*)
    ↓
NetlinkHandler (system_netd)
    ├─ parseIfInfoMessage()        [解析接口信息]
    ├─ parseIfAddrMessage()        [解析地址信息]
    ├─ parseRtMessage()            [解析路由信息]
    └─ notifyInterfaceAdded()      [回调上层][Binder IPC]
    
NetdUnsolicitedEventListener (framework)
    ├─ onInterfaceAdded(ifName)
    ├─ onInterfaceRemoved(ifName)
    ├─ onInterfaceChanged(ifName, up)
    ├─ onInterfaceLinkStateChanged(ifName, up)
    ├─ onInterfaceAddressUpdated(addr, ifName)
    └─ onInterfaceAddressRemoved(addr, ifName)
    
    ↓
NetworkManagementService
    ├─ notifyInterfaceStatusChanged()
    ├─ notifyInterfaceLinkStateChanged()
    └─ 通知注册的观察者
    
    ↓
各服务响应
    ├─ EthernetTracker
    ├─ WifiService
    ├─ TelephonyManager
    └─ ConnectivityService

关键 Netlink 消息类型

消息类型触发条件处理方式
RTM_NEWLINK接口创建或状态改变检查 IFF_UP, IFF_LOWER_UP 标记
RTM_DELLINK接口删除清理本地状态
RTM_NEWADDRIP 地址添加更新 LinkProperties
RTM_DELADDRIP 地址删除移除 LinkAddress
RTM_NEWROUTE路由添加更新路由表
RTM_DELROUTE路由删除移除路由规则

四、NetworkStateSnapshot:接口状态快照

这是管理接口状态的统一数据结构

public final class NetworkStateSnapshot implements Parcelable {
    // 网络对象
    @NonNull private final Network mNetwork;
    
    // 网络能力(transport、capability)
    @NonNull private final NetworkCapabilities mNetworkCapabilities;
    
    // 链路属性(IP、DNS、路由、MTU)
    @NonNull private final LinkProperties mLinkProperties;
    
    // 蜂窝网络订阅 ID
    @Nullable private final String mSubscriberId;
    
    // 遗留网络类型(TYPE_WIFI、TYPE_MOBILE 等)
    private final int mLegacyType;
}

LinkProperties 的核心字段

public final class LinkProperties implements Parcelable {
    // 接口名称(wlan0、rmnet_data0、eth0 等)
    private String mIfaceName;
    
    // IP 地址列表
    private final ArrayList<LinkAddress> mLinkAddresses;
    
    // DNS 服务器
    private final ArrayList<InetAddress> mDnses;
    
    // 路由信息
    private ArrayList<RouteInfo> mRoutes;
    
    // DHCP 服务器
    private Inet4Address mDhcpServerAddress;
    
    // 代理配置
    private ProxyInfo mHttpProxy;
    
    // MTU(最大传输单元)
    private int mMtu;
    
    // NAT64 前缀(IPv6 only 网络)
    private IpPrefix mNat64Prefix;
}

五、接口配置与管理流程

以太网接口完整流程

1. 硬件/驱动层
   └─ 以太网设备插入
      └─ 内核创建 eth0 接口
   
2. Netlink 事件
   └─ RTM_NEWLINK (eth0, flags=0)
      └─ IFF_LOWER_UP 标记
   
3. NetlinkHandler (netd)
   ├─ 解析: INTERFACE=eth0, IFINDEX=4
   ├─ Action = kLinkUp
   └─ 调用 notifyInterfaceLinkChanged("eth0", true)
   
4. NetworkManagementService (Java)
   └─ onInterfaceLinkStateChanged("eth0", true)
      └─ 调用 mNetdService.interfaceGetCfg("eth0")
   
5. EthernetTracker 响应
   ├─ maybeTrackInterface("eth0")
   │   ├─ 检查是否有效以太网接口
   │   ├─ 创建 NetworkInterfaceState
   │   └─ 注册 IpClient (DHCP)
   │
   └─ updateInterfaceState("eth0", true)
       ├─ 启动 DHCP 获取
       └─ 创建 NetworkAgent
   
6. DHCP 获取完成
   └─ InterfaceConfiguration 更新
       ├─ IP 地址
       ├─ 网关
       ├─ DNS 服务器
       └─ 路由
   
7. LinkProperties 更新
   └─ ConnectivityService
       ├─ 检查网络质量
       ├─ 评分并排名
       └─ 可能升级为默认网络

蜂窝网络接口流程

1. RIL (Radio Interface Layer) 接收网络可用性
   └─ DATA_CALL_LIST_CHANGED
   
2. Phone.onDataConnectionStateChanged()
   └─ DataNetworkController 创建 DataNetwork
   
3. DataNetwork 初始化
   ├─ 设置 APN
   ├─ 调用 DataService.setupDataCall()
   └─ 传递给 Modem
   
4. Modem 创建 PDN 连接
   └─ 例:rmnet_data0 接口
   
5. RIL 返回连接信息
   ├─ IP 地址
   ├─ DNS 服务器
   ├─ 网关
   └─ PCO (Protocol Configuration Options)
   
6. InterfaceController 配置接口
   ├─ ifconfig rmnet_data0 up
   ├─ ip addr add 10.0.0.1/8
   ├─ ip route add default via 10.0.0.254
   └─ echo "10.0.0.254" > /sys/class/net/rmnet_data0/gw
   
7. NetworkAgent 上报
   └─ ConnectivityService
       ├─ 发送 OBTAINED_IPV4_STATE 事件
       └─ 可能升级为默认网络

六、InterfaceConfiguration 管理

接口配置的低层 API:

InterfaceConfiguration (framework)
    ├─ 标记 (Flags)
    │   ├─ "up" / "down"
    │   ├─ "broadcast"
    │   ├─ "loopback"
    │   ├─ "point-to-point"
    │   ├─ "running"
    │   └─ "multicast"
    │
    └─ IP 地址
        └─ LinkAddress

netd 通过 INetd Binder 接口操作

// 获取接口配置
interfaceGetCfg(String ifName) → InterfaceConfigurationParcel

// 设置接口配置
interfaceSetCfg(InterfaceConfigurationParcel cfg)

// 添加地址
interfaceAddAddress(String ifName, String address, int prefixLength)

// 移除地址
interfaceDelAddress(String ifName, String address, int prefixLength)

// 清空所有地址
interfaceClearAddrs(String ifName)

// 设置 MTU
interfaceSetMtu(String ifName, int mtu)

// 启用/禁用 IPv6
interfaceSetEnableIPv6(String ifName, boolean enable)

七、物理网络与虚拟网络的关系

物理网络 (PhysicalNetwork)
    ├─ ID: 通常 100-200
    ├─ 接口: wlan0, rmnet_data0, eth0
    ├─ 权限: PERMISSION_NETWORK, PERMISSION_SYSTEM
    │
    └─ 默认网络管理
        ├─ 默认路由表 (100)
        ├─ 优先级规则
        └─ UID 路由选择

虚拟网络 (VirtualNetwork)
    ├─ ID: VPN (1-99)
    ├─ 类型: SECURE (VPN) / NON_SECURE (forward)
    │
    └─ 隧道接口: tun0, ipsec0, vti0

关键映射关系
    └─ RouteController
        ├─ addInterfaceToPhysicalNetwork()
        │   └─ 添加 FIB 规则 (策略路由)
        │
        ├─ addInterfaceToVirtualNetwork()
        │   └─ 绑定 VPN 用户
        │
        └─ modifyPhysicalNetworkPermission()
            └─ 更新权限规则

八、接口生命周期状态机

EthernetManager 定义的状态

public static final int STATE_ABSENT = 0;        // 接口不存在
public static final int STATE_LINK_DOWN = 1;     // 链路未就绪
public static final int STATE_LINK_UP = 2;       // 链路就绪

public static final int ROLE_NONE = 0;           // 无特殊角色
public static final int ROLE_CLIENT = 1;        // 客户端(获取网络)
public static final int ROLE_SERVER = 2;        // 服务器(提供网络/热点)

状态转移图

STATE_ABSENT
    ↓ [硬件插入/创建]
STATE_LINK_DOWN (链路未就绪,驱动未加载)
    ↓ [驱动加载,链路检测]
STATE_LINK_UP (链路就绪,可获取 IP)
    ↓ [获取 IP 完成]
[ROLE 变更]
    ├─ ROLE_NONE → ROLE_CLIENT (获取网络)
    └─ ROLE_NONE → ROLE_SERVER (热点)
    ↓ [移除配置 / 禁用]
STATE_LINK_DOWN
    ↓ [硬件移除]
STATE_ABSENT

九、接口事件观察者模式

// 观察者接口
public interface INetworkManagementEventObserver {
    void interfaceStatusChanged(String iface, boolean up);
    void interfaceLinkStateChanged(String iface, boolean up);
    void interfaceAdded(String iface);
    void interfaceRemoved(String iface);
    void addressUpdated(String iface, LinkAddress address);
    void addressRemoved(String iface, LinkAddress address);
}

// 实现观察者
EthernetTracker implements INetworkManagementEventObserver
    ├─ onInterfaceAdded()
    ├─ onInterfaceRemoved()
    ├─ onInterfaceChanged()
    └─ ...

// 注册观察者
mNetworkManagementService.registerObserver(
    ethernetTracker, OBSERVING_MASK);

十、多接口同时在线的优先级管理

ConnectivityService.chooseNetworkForRequest()
    ├─ NetworkScore 计算
    │   ├─ TransportType 分值 (WIFI > Cellular)
    │   ├─ Capability 分值
    │   ├─ 用户偏好 (ConnectivityManager.startUsingNetworkFeature())
    │   └─ 时间戳
    │
    ├─ 排序所有可用网络
    │   └─ mNetworks.sort(byScore)
    │
    └─ 选择最优网络
        └─ mDefaultNetwork = networks[0]

示例多接口场景
┌─────────────────────────────────────┐
│ 可用接口优先级                       │
├─────────────────────────────────────┤
│ [1] WIFI   (Score: 80, 优先)        │ ← 默认网络
│ [2] 5G     (Score: 75)              │
│ [3] 以太网 (Score: 70)              │
│ [4] 4G LTE (Score: 60)              │
└─────────────────────────────────────┘

当 WIFI 断开
    └─ 自动切换到 5G (Score 75)

WIFI 重新连接
    └─ 自动切换回 WIFI (Score 80)

总结:物理接口管理的 3 大核心服务

服务职责关键接口
EthernetService以太网检测、配置、生命周期管理EthernetManager.setInterfaceEnabled()
WiFiServiceWiFi 接口启用/禁用、连接管理WifiManager.setWifiEnabled()
DataNetwork蜂窝数据 APN、连接、接口创建TelephonyManager.getDataState()
ConnectivityService接口监控、网络评分、默认网络选择、路由管理ConnectivityManager.getActiveNetwork()

这 4 个服务通过 Netlink 事件通知机制 实时监控物理接口变化,通过 NetworkStateSnapshot 统一表示接口状态,通过 RouteController 管理内核路由和 FIB 规则,最终实现 Android 的 多网并存与智能选择 能力!