第八板块:Android 网络体系与连接管理 | 第二十二篇:ConnectivityService 与 Netd 网络架构

42 阅读7分钟

第八板块:Android 网络体系与连接管理 | 第二十二篇:ConnectivityService 与 Netd 网络架构

所属板块:第八板块 — Android 网络体系与连接管理

前置知识:第二十一篇中的存储体系、Linux 内核网络栈(Netfilter/iptables)、Binder IPC、SELinux 安全上下文

本篇定位:这是 Android 设备连接世界的神经网络。如果说应用进程是孤岛,那么 ConnectivityService 就是路由中枢Netd 就是边界网关。本篇将彻底拆解 Network Stack 的分层架构、ConnectivityService 的网络评分(Network Score)机制Netd (Network Daemon) 的命令执行流水线策略路由(Policy Routing)与 iptables 防火墙VPN 的路由劫持。我们将深入 Kernel Network StackNative DaemonFramework Service,揭示 Android 如何在复杂的网络环境中(Wi-Fi/蜂窝/以太网/VPN)选择最优路径并确保安全。


1. 核心结论先行(Thesis Statement)

Android 的网络管理是一个基于评分的动态路由系统

  • ConnectivityService 的本质网络仲裁者。它运行在 System Server 中,监控所有可用的网络(Wi-Fi, Cellular, Ethernet),根据 NetworkCapabilitiesNetworkScore 决定哪个网络是默认出口(Default Route)
  • Netd 的本质内核配置的执行者。它是一个 Native 守护进程,作为 Framework 与 Kernel 之间的桥梁,负责执行具体的网络操作:设置 IP 地址、配置路由表、刷新 DNS、操作 iptables 规则。
  • 网络评分的本质多维度的权重计算。系统不仅看网络快慢(Bandwidth),还看成本(Metered)、可靠性(Congested)和信任度(Trusted)。
  • 策略路由的本质多路由表共存。Android 不使用单一的 main 路由表,而是为不同场景(默认、VPN、多用户)创建独立的路由表,并通过 ip rule 决定数据包走哪张表。

2. 网络架构全景图

2.1 从应用 Socket 到物理网卡

graph TB
    subgraph App ["应用进程"]
        A["App (HTTP Request)"]
    end

    subgraph Framework ["System Server"]
        CS["ConnectivityService"]
        NM["NetworkManagementService"]
        VPN["VpnManagerService"]
    end

    subgraph Native ["Native 层"]
        Netd["Netd (Network Daemon)"]
        Dnsmasq["dnsmasq (DNS 服务)"]
    end

    subgraph Kernel ["Linux 内核"]
        VS["Virtual Switch (veth)"]
        IPT["Netfilter/iptables"]
        RT["Routing Tables (main/100/200)"]
        NIC["Physical NIC (wlan0/rmnet0)"]
    end

    subgraph Network ["外部网络"]
        WIFI["Wi-Fi AP"]
        LTE["基站"]
    end

    A -->|"Socket"| CS
    CS -->|"决策"| NM
    NM -->|"Binder IPC"| Netd
    Netd -->|"syscall/ioctl"| Kernel
    Kernel -->|"IP Packet"| NIC
    NIC --> WIFI
    NIC --> LTE

    VPN -.->|"路由劫持"| RT
    Netd -->|"配置"| IPT
    Netd -->|"配置"| RT
    Netd -->|"配置"| Dnsmasq

2.2 核心组件职责表

组件层级职责学术定义
ConnectivityServiceFramework仲裁者管理 NetworkAgent,计算 NetworkScore,切换默认网络。
NetworkAgentFramework代理每个网络连接的代表(如 Wi-Fi Agent, Cell Agent),向 CS 汇报状态。
NetdNative执行者接收 Framework 命令,通过 syscall 配置内核网络参数。
NetworkManagementServiceFramework接口封装与 Netd 的 Binder 通信。
Netfilter (iptables)Kernel防火墙过滤数据包,实现 NAT、端口重定向、流量统计。

3. ConnectivityService 的评分机制

3.1 网络评分(Network Score)

系统通过 NetworkCapabilitiesNetworkScore 来评估网络质量。

学术定义

  • Transport Type: 传输类型(Wi-Fi, Cellular, Ethernet, Bluetooth)。
  • Capability: 能力(Internet, Not Metered, Trusted, Not Congested)。
  • Signal Strength: 信号强度(Wi-Fi RSSI, Cell Signal)。

3.2 评分算法

ConnectivityService 维护一个 NetworkRanker

网络类型基础分扣分因素结果
Ethernet7070 (最高)
Wi-Fi60信号弱 (-10), 计费 (-20)30 - 60
Cellular (LTE)50计费 (-20), 漫游 (-30)0 - 30
VPN40依赖底层网络继承底层

决策逻辑

  1. 当 Wi-Fi 连接时,CS 计算 Wi-Fi 得分(例如 55)。
  2. CS 比较 Wi-Fi (55) 和 Cellular (20)。
  3. Wi-Fi 胜出,CS 命令 Netd 将默认路由切换到 wlan0

3.3 网络切换(Handover)

当 Wi-Fi 断开时,CS 会无缝切换到 Cellular。

sequenceDiagram
    participant App as 应用
    participant CS as ConnectivityService
    participant Netd as Netd
    participant Kernel as Kernel

    App->>CS: 请求网络
    CS->>CS: 评估 Wi-Fi (Score: 55)
    CS->>Netd: 设置默认路由 ->> wlan0
    CS->>App: 网络可用 (Wi-Fi)

    Note over CS: Wi-Fi 断开
    CS->>CS: 评估 Cellular (Score: 20)
    CS->>Netd: 删除 wlan0 路由
    CS->>Netd: 设置默认路由 ->> rmnet0
    CS->>App: 网络变更 (Cellular)

4. Netd 的执行流水线

4.1 Netd 的模块划分

Netd 是一个非常复杂的守护进程,包含多个模块。

模块职责学术定义
FirewallController防火墙管理 iptables 规则,控制应用联网权限。
RouteController路由管理路由表和 ip rule。
DnsControllerDNS配置 DNS 服务器,管理 dnsmasq。
BandwidthController带宽流量统计和限速(Quota)。
NatController地址转换配置 SNAT/DNAT,实现热点共享。

4.2 命令执行流程

Framework 通过 Binder 向 Netd 发送命令字符串。

示例:设置默认路由

// Framework 端
mNetdService.routeAdd("default", "wlan0", "192.168.1.1");

// Netd 端 (CommandListener.cpp)
void CommandListener::RouteCmd::runCommand(...) {
    if (strcmp(argv[1], "add") == 0) {
        // 调用 libcutils 或执行 iproute2 命令
        runIpRouteAdd(argv);
    }
}

// 实际执行的 shell 命令
ip route add default via 192.168.1.1 dev wlan0 table 100

5. 策略路由(Policy Routing)

5.1 多路由表机制

Android 不使用默认的 main 路由表,而是为不同场景创建独立的表。

路由表 ID名称用途
255local本地路由
254main系统默认(通常不用)
253default备用
100wlan0Wi-Fi 路由
200rmnet0蜂窝路由
61oif输出接口规则

5.2 ip rule 规则

ip rule 决定什么时候哪张表

学术定义

  • Rule: 匹配条件(源 IP、目标 IP、接口、fwmark)。
  • Lookup: 要查询的路由表。

Android 的典型规则

# 查看规则
ip rule show

# 输出:
0:      from all lookup local
10000:  from all fwmark 0xc0000/0xd0000 lookup legacy_system
13000:  from all fwmark 0x10063/0x1ffff lookup local_network
14000:  from all oif wlan0 lookup wlan0
15000:  from all oif rmnet0 lookup rmnet0
16000:  from all lookup main
17000:  from all lookup default

解释

  • 如果数据包来自 wlan0 接口,查表 wlan0
  • 如果数据包带有特定的 fwmark(防火墙标记),查表 legacy_system

6. 防火墙与 iptables

6.1 应用联网控制

当你在设置中禁止某个应用联网时,Netd 实际上是在操作 iptables。

学术定义

  • Owner Match: iptables 的 --uid-owner 模块,匹配数据包属于哪个 UID。
  • DROP: 丢弃数据包。

命令示例

# 禁止 UID 10001 (应用) 访问网络
iptables -A OUTPUT -m owner --uid-owner 10001 -j DROP

6.2 VPN 的路由劫持

VPN 的核心是将所有流量重定向到 VPN 隧道接口(tun0)。

学术定义

  • NAT (SNAT): 将源 IP 改为 VPN 服务器的 IP。
  • Routing: 添加默认路由指向 tun0。

Netd 操作

# 创建 tun0 接口
ip link add tun0 type tun
ip addr add 10.0.0.2/24 dev tun0

# 添加默认路由
ip route add default via 10.0.0.1 dev tun0 table 200

# 添加 ip rule
ip rule add from all table 200

7. 关键源码深度解析

7.1 ConnectivityService 的评分逻辑

// frameworks/base/services/core/java/com/android/server/connectivity/ConnectivityService.java
private int evaluateNetworkScore(NetworkAgentInfo nai) {
    int score = nai.getCurrentScore();

    // 如果是计费网络,扣分
    if (nai.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED) == false) {
        score -= 20;
    }

    // 如果信号弱,扣分
    int signal = nai.getCurrentSignalStrength();
    if (signal < SIGNAL_STRENGTH_THRESHOLD) {
        score -= 10;
    }

    return score;
}

7.2 Netd 的 iptables 调用

// system/netd/server/FirewallController.cpp
int FirewallController::setUidRule(int childChain, int uid, FirewallRule rule) {
    std::string command = "*filter\n";
    command += StringPrintf("-A %s -m owner --uid-owner %d -j %s\n",
                            chainName, uid, rule == ALLOW ? "ACCEPT" : "DROP");
    command += "COMMIT\n";

    // 通过 socket 发送给 iptables 进程
    sendCommand(command);
}

8. 网络管理的常见误区

误区学术解释
Wi-Fi 一定比 4G 快不一定。Wi-Fi 信号弱或有线拥塞时,评分可能低于 4G。
VPN 会影响所有流量是的。VPN 通过路由劫持,强制所有流量走 tun0。
禁止应用联网就是关 Socket不是。是通过 iptables 的 Owner Match 在 Kernel 层丢弃数据包。
多网卡可以叠加网速Android 默认不支持。策略路由只能选一条默认路,除非应用自己绑定 Socket 到特定网卡。

9. 本篇总结(Knowledge Closure)

关键点纯学术定义
ConnectivityService 的本质网络仲裁者,基于 NetworkScore 动态选择默认路由。
Netd 的本质内核配置执行者,通过 iptables 和 iproute2 配置网络。
策略路由多路由表共存,通过 ip rule 实现基于条件的路由选择。
防火墙机制基于 UID 的 iptables 过滤,实现应用级联网控制。
VPN 原理路由劫持 + NAT,强制流量进入隧道接口。

10. 第八板块结语

至此,第八板块:Android 网络体系与连接管理 已全部完结。

我们从 ConnectivityService 的评分仲裁 出发,深入 Netd 的执行流水线,探索 策略路由与 iptables 防火墙,最终抵达 VPN 的路由劫持与多网卡管理

我们揭示了 Android 网络管理的核心逻辑:用评分选择最优路径,用策略路由隔离流量,用防火墙控制访问。

下一篇预告第九板块:Android 多媒体体系 | 第二十三篇:AudioFlinger 与 AudioPolicyService 音频架构