NetworkStack是什么

0 阅读10分钟

一、NetworkStack 总体架构

1.1 概念定义

NetworkStack 是 Android 系统网络管理框架的总称,由多个独立但相互协作的模块组成:

┌─────────────────────────────────────────────────────┐
│                  应用层(APP Framework)              │
│        ConnectivityManager / VpnManager / DNS        │
└─────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────┐
│        SystemServer 管理层(frameworks_base)         │
│  ┌────────────────────────────────────────────────┐  │
│  │  ConnectivityService(可更新部分)                │  │
│  │  ├─ 网络管理                                    │  │
│  │  ├─ DNS 解析                                    │  │
│  │  ├─ 路由管理                                    │  │
│  │  └─ VPN 管理                                    │  │
│  └────────────────────────────────────────────────┘  │
│                                                      │
│  ┌────────────────────────────────────────────────┐  │
│  │  其他网络服务                                    │  │
│  │  ├─ NetworkManagementService (管理层)           │  │
│  │  ├─ NetworkPolicyManagerService (策略层)        │  │
│  │  ├─ WifiService (WiFi)                         │  │
│  │  └─ TelephonyService (蜂窝)                     │  │
│  └────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────┐
│      系统服务实现层(packages_modules_Connectivity)  │
│  ┌────────────────────────────────────────────────┐  │
│  │  ConnectivityService 具体实现                    │  │
│  │  ├─ NetworkAgentInfo 管理                       │  │
│  │  ├─ 网络评分与选择                               │  │
│  │  ├─ 网络切换逻辑                                 │  │
│  │  └─ 观察者回调机制                               │  │
│  └────────────────────────────────────────────────┘  │
│                                                      │
│  ┌────────────────────────────────────────────────┐  │
│  │  DNS 解析模块 (DnsResolver)                     │  │
│  │  ├─ DNS 查询                                    │  │
│  │  ├─ Private DNS (DoH/DoT)                       │  │
│  │  └─ DNS 缓存                                    │  │
│  └────────────────────────────────────────────────┘  │
│                                                      │
│  ┌────────────────────────────────────────────────┐  │
│  │  路由管理模块 (RoutingCoordinator)               │  │
│  │  ├─ 路由表管理                                   │  │
│  │  ├─ NAT64 转换 (clatd)                          │  │
│  │  └─ IPv4/IPv6 协议栈                            │  │
│  └────────────────────────────────────────────────┘  │
│                                                      │
│  ┌────────────────────────────────────────────────┐  │
│  │  VPN 模块                                       │  │
│  │  ├─ VPN 代理管理                                 │  │
│  │  ├─ TUN/TAP 驱动                                │  │
│  │  └─ Always-on VPN                              │  │
│  └────────────────────────────────────────────────┘  │
│                                                      │
│  ┌────────────────────────────────────────────────┐  │
│  │  其他功能模块                                    │  │
│  │  ├─ Tethering (网络共享)                        │  │
│  │  ├─ Nearby (WiFi Direct)                       │  │
│  │  ├─ Thread Network (IoT)                       │  │
│  │  └─ QoS 管理                                    │  │
│  └────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────┐
│          内核接口层 (system_netd / native)           │
│  ┌────────────────────────────────────────────────┐  │
│  │  netd (网络守护进程)                             │  │
│  │  ├─ 防火墙规则                                   │  │
│  │  ├─ 路由表操作                                   │  │
│  │  ├─ DNS 配置                                    │  │
│  │  ├─ 网络接口管理                                 │  │
│  │  └─ Tethering/VPN 实现                         │  │
│  └────────────────────────────────────────────────┘  │
│                                                      │
│  ├─ 与 Linux kernel 通信                           │
│  │  ├─ netlink socket                             │  │
│  │  ├─ iptables / nftables                        │  │
│  │  └─ iproute2 命令                               │  │
│  └                                                  │
└─────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────┐
│           无线/蜂窝驱动层 (hardware_ril)             │
│  ├─ WiFi 驱动                                       │
│  ├─ 蜂窝 RIL 驱动                                    │
│  ├─ Bluetooth 驱动                                  │
│  └─ Ethernet 驱动                                   │
└─────────────────────────────────────────────────────┘

1.2 关键仓库分布

让我深入各个核心仓库进行分析:

现在让我详细分析核心服务的实现:

好的,现在让我深入分析 NetworkStack 的各个层次。我会系统地展示完整的技术分析:

二、NetworkStack 启动流程与初始化

2.1 SystemServer 中的启动顺序

SystemServer.java 启动流程:

1. InitConnectivityModuleConnector (line 1988-1994)
   ├─ ConnectivityModuleConnector 初始化
   └─ 用于加载可更新模块

2. InitNetworkStackClient (line 1996-2002)
   ├─ NetworkStackClient 初始化
   └─ NetworkStack 的客户端接口

3. StartNetworkManagementService (line 2004-2011)
   ├─ NetworkManagementService.create()
   ├─ 负责与 netd 通信
   └─ 处理底层网络管理

4. StartNetworkStatsService (line 2034-2039)
   ├─  APEX 加载: com.android.tethering
   ├─ 类:NetworkStatsServiceInitializer
   └─ 必须在 NetworkPolicyManager 之前启动

5. StartNetworkPolicyManagerService (line 2041-2049)
   ├─ NetworkPolicyManagerService
   ├─ 依赖 NetworkManagementService
   └─ 管理网络策略和数据省流

6. StartWifiService (line 2055-2058)
   ├─  APEX 加载: com.android.wifi
   ├─ 类:WifiService
   └─ WiFi 服务

7. StartConnectivityService (line 2115-2122)
   ├─  APEX 加载: com.android.tethering
   ├─ 类:ConnectivityServiceInitializer
   ├─ 依赖以上所有服务
   └─ 核心网络管理服务

8. StartVpnManagerService (line 2133-2140)
   ├─ VpnManagerService.create()
   ├─ 管理 VPN 应用
   └─  ConnectivityService 配合

systemReady() 阶段:
   
   ├─ MakeNetworkManagementServiceReady (line 3115-3122)
   ├─ MakeConnectivityServiceReady (line 3129-3137)
   ├─ MakeVpnManagerServiceReady (line 3138-3142)
   
   └─ StartNetworkStack (line 3189-3196)
      ├─ NetworkStackClient.getInstance().start()
      └─ 真正启动网络栈

   StartTethering (line 3198-3211)
      ├─ ConnectivityModuleConnector 启动 Tethering 模块
      └─ 注册 Context.TETHERING_SERVICE

看核心的初始化启动代码,查看APEX模块加载:

现在让我继续深入分析核心模块的职责和数据流:

现在让我深入分析VPN、DNS、路由等关键模块,以及RIL层:

基于我的研究,现在让我生成完整的 NetworkStack 全面分析:

三、NetworkStack 核心模块职责详解

3.1 ConnectivityService - 网络管理核心

位置packages_modules_Connectivity/service/src/com/android/server/ConnectivityService.java(超过14000行)

核心职责

  1. 网络生命周期管理

    • NetworkAgent 注册和注销
    • 网络连接/断开/销毁
    • 网络状态转换
  2. 网络请求匹配算法

    • NetworkRequest 与 NetworkAgent 的关联
    • 网络评分和排序(NetworkRanker)
    • 默认网络选择
  3. 网络能力管理

    NetworkCapabilities 属性:
    ├─ 传输类型 (TRANSPORT_WIFI, TRANSPORT_CELLULAR, TRANSPORT_VPN)
    ├─ 网络能力 (NET_CAPABILITY_INTERNET, VALIDATED, NOT_METERED等)
    ├─ 链路属性 (LinkProperties)
    └─ 网络信息 (NetworkInfo)
    
  4. 网络验证流程

    NetworkMonitor 验证流程:
    ├─ DNS 探测
    ├─ HTTP/HTTPS 探测
    ├─ Private DNS (DoH/DoT) 探测
    ├─ 验证结果:
    │  ├─ VALID (完全连接)
    │  ├─ PARTIAL (部分连接)
    │  ├─ INVALID (无连接)
    │  └─ SKIP (跳过验证)
    └─ 验证状态影响网络分数
    
  5. BPF 网络策略(Android 12+)

    BPF (eBPF) 程序:
    ├─ 流量计费标记 (metered marking)
    ├─ 应用流量控制
    └─ 系统级防火墙规则
    

3.2 NetworkAgentInfo - 网络代理信息容器

关键数据结构

public class NetworkAgentInfo implements NetworkRanker.Scoreable {
    // 网络标识
    @NonNull public final Network network;
    @NonNull public NetworkInfo networkInfo;
    @NonNull public LinkProperties linkProperties;
    @NonNull public NetworkCapabilities networkCapabilities;
    
    // 网络状态时间戳
    private long mCreatedTime;      // netd 创建时间
    private long mConnectedTime;    // 连接时间
    private long mDestroyedTime;    // 销毁时间
    private long mFirstValidationTime;    // 首次验证通过时间
    private long mCurrentValidationTime;  // 最新验证时间
    
    // 网络评分
    private FullScore mScore;       // 完整评分(包含 ConnectivityService 管理部分)
    
    // 网络请求管理
    private final SortedSet<InactivityTimer> mInactivityTimers;
    private final List<NetworkRequest> mNetworkRequests;
    
    // VPN 相关
    public @Nullable volatile Network[] declaredUnderlyingNetworks;
    
    // NAT64 转换
    public Nat464Xlat clatd;
    
    // QoS 回调追踪
    private QosCallbackTracker mQosCallbackTracker;
}

网络状态机

        ┌─────────────────┐
        │   NASCENT       │   新建状态
        │  (未连接)        │
        └────────┬────────┘
                 │
                 ▼
        ┌─────────────────┐
        │   CONNECTED     │  已连接
        │  (可提供服务)     │
        └────────┬────────┘
                 │
         ┌──────▼──────┐
         │   LINGERS   │  保活状态
         │  (等待销毁)   │  (网络评分下降后)
         └──────┬──────┘
                 │
                 ▼
        ┌─────────────────┐
        │   DESTROYED     │  已销毁
        │  (临时保留)      │
        └─────────────────┘

3.3 DNS 管理模块 (DnsManager)

位置packages_modules_Connectivity/service/src/com/android/server/connectivity/DnsManager.java

功能

  1. DNS 配置管理

    DNS 设置来源:
    ├─ DHCP 获取的 DNS
    ├─ 手动配置的 DNS
    └─ Private DNS 服务器
    
  2. Private DNS 支持

    Private DNS 模式:
    ├─ PRIVATE_DNS_MODE_OFF (关闭)
    ├─ PRIVATE_DNS_MODE_OPPORTUNISTIC (机会性)
    │  └─ 尝试 DNS over HTTPS (DoH)
    │  └─ 尝试 DNS over TLS (DoT)
    └─ PRIVATE_DNS_MODE_PROVIDER_HOSTNAME (指定主机)
       └─ 强制使用特定的 Private DNS 服务器
    
  3. DNS 验证流程

    步骤:
    1. 接收 Private DNS 配置变更
    2. 解析 Private DNS 主机名 (hostname resolution)
    3. 建立 DNS over TLS 连接验证
    4. 将解析的 IP 地址配置到 netd
    5. 执行 DNS 探测验证网络连接
    

3.4 路由管理模块 (RoutingCoordinator)

位置packages_modules_Connectivity/service/src/com/android/server/connectivity/RoutingCoordinatorService.java

核心功能

  1. IPv4/IPv6 路由管理

    ├─ 默认路由配置
    ├─ 进程级路由标记 (fwmark)
    ├─ 应用级策略路由
    └─ VPN 路由拦截
    
  2. NAT64 转换 (clatd)

    NAT64 用途:
    ├─ 在仅 IPv6 网络上模拟 IPv4 连接
    ├─ 将 IPv4 流量转换为 IPv6
    └─ 将 IPv6 响应转换回 IPv4
    
    实现:
    ├─ 系统守护进程:clatd
    ├─ TUN 虚拟网卡
    └─ 数据包转换规则
    
  3. netlink 通信

    • 与 Linux kernel 网络栈通信
    • 路由表更新
    • 网络接口管理

3.5 VPN 管理系统

架构

VPN 框架分层:

┌─────────────────────────┐
│   应用层 VPN 服务         │
│  (如 OpenVPN、WireGuard)  │
└────────────┬────────────┘
             │
    ┌────────▼─────────┐
    │  VpnService      │  App 使用的 API
    │  (Builder)       │  配置 VPN 连接
    └────────┬─────────┘
             │
┌────────────▼────────────────────┐
│  VPN 管理层 (frameworks_base)     │
│  ├─ VpnManagerService           │
│  └─ VpnManagerService.Lifecycle │
└────────────┬────────────────────┘
             │
┌────────────▼─────────────────────┐
│  系统集成层 (Connectivity)         │
│  ├─ VPN 作为 NetworkAgent 注册    │
│  ├─ VPN NetworkCapabilities 设置 │
│  └─ VPN 选择算法                  │
└────────────┬─────────────────────┘
             │
┌────────────▼──────────────────┐
│  内核层                        │
│  ├─ TUN/TAP 虚拟网卡驱动      │
│  ├─ netd 路由和防火墙配置      │
│  └─ Linux 网络栈             │
└───────────────────────────────┘

VPN 工作流程

1. VpnService.prepare() - 获取 VPN 权限
2. Builder.establish() - 创建 VPN 连接
   ├─ 创建 TUN 虚拟网卡
   ├─ 设置 IP 地址和路由
   ├─ 返回 ParcelFileDescriptor
3. 应用从 FD 读取传出数据包
4. 应用处理数据包(加密等)
5. 应用将响应数据写入 FD
6. 系统将数据包注入网络栈
7. VPN 断开时清理资源

Split Tunnel (分隧道) 支持:

declaredUnderlyingNetworks 机制:

VPN ─┬─→ WiFi    ┐
     │           ├─ 不同应用使用不同网络
     └─→ Cellular┘

mDeclaredUnderlyingNetworks: Network[]
这个数组指定了该 VPN 下面的真实网络
ConnectivityService 使用这个信息决定数据包最终从哪个网络发送

3.6 系统网络守护进程 (netd)

位置system_netd/

C++ 实现的核心功能

  1. 防火墙规则管理

    ├─ iptables/nftables 规则
    ├─ 背景应用限制 (background restrict)
    ├─ Data Saver 限制
    └─ VPN 路由规则
    
  2. DNS 解析守护

    ├─ DNS 查询代理
    ├─ DNS 缓存(可选)
    └─ DNS 隐私支持 (DoH/DoT)
    
  3. 网络接口管理

    ├─ 网络接口创建/销毁
    ├─ IP 地址配置
    ├─ 路由表操作
    └─ MTU 设置
    
  4. Tethering (网络共享)

    ├─ USB Tethering
    ├─ WiFi Hotspot
    ├─ Bluetooth NAP
    └─ Ethernet 共享
    

3.7 RIL 层 - 电话通信子系统

位置hardware_ril/, frameworks_opt_telephony/

关键组件

RIL (Radio Interface Layer) 架构:

┌──────────────────────────────────┐
│  Phone.java / DataConnection     │
│  (应用与通信管理)                │
└───────────────┬──────────────────┘
                │
     ┌──────────▼──────────┐
     │  RIL.java           │  RIL 引擎
     │  ├─ 请求/响应处理   │
     │  └─ Unsolicited 事件│
     └──────────┬──────────┘
                │
      ┌─────────▼─────────┐
      │  Hardware AIDL    │  AIDL 接口
      │  ├─ IRadio        │  (与硬件通信)
      │  └─ HAL Service   │
      └─────────┬─────────┘
                │
      ┌─────────▼─────────┐
      │  Modem 硬件        │  无线电固件
      │  ├─ BaseBand      │
      │  └─ 协议栈         │
      └───────────────────┘

关键 RIL 请求

RIL_REQUEST_SETUP_DATA_CALL
  ├─ 参数:accessNetworkType, dataProfile, allowRoaming等
  ├─ 响应:SetupDataCallResult
  └─ 用途:建立数据连接

RIL_REQUEST_DEACTIVATE_DATA_CALL
  ├─ 参数:cid (connection ID)
  └─ 用途:断开数据连接

RIL_REQUEST_GET_DATA_CALL_LIST
  └─ 用途:查询当前数据连接列表

RIL Unsolicited 事件

响应类型(主动上报):
├─ DATA_CALL_LIST_CHANGED
│  └─ Modem 数据连接状态变化
├─ VOICE_RADIO_TECH_CHANGED
│  └─ 无线电技术变化 (2G/3G/4G/5G)
├─ NETWORK_STATE_CHANGED
│  └─ 网络注册状态变化
└─ SIGNAL_STRENGTH
   └─ 信号强度变化

3.8 WiFi 子系统交互

WiFi Service 与 Connectivity 交互:

WiFi Service
    ▼
registerNetworkAgent() → ConnectivityService
    │
    ├─ NetworkCapabilities (WiFi, INTERNET等)
    ├─ LinkProperties (SSID, IP等)
    └─ NetworkScore
    
事件回调:
├─ 连接成功 → broadcastNetworkStateChange()
├─ IP 获取 → updateLinkProperties()
├─ 验证结果 → updateNetworkInfo()
└─ 断开连接 → unregisterNetworkAgent()

四、NetworkStack 数据流和通信机制

4.1 网络连接建立流程

1. WiFi/蜂窝连接成功
   ▼
2. 驱动通知系统,创建网络接口
   ├─ wlan0 (WiFi)
   ├─ rndis0 (USB 蜂窝)
   └─ ccmni0 (蜂窝)
   ▼
3. DHCP/静态 IP 配置 (通过 IpClient)
   ├─ 获得 IP 地址
   ├─ 获得 DNS 服务器
   └─ 配置路由
   ▼
4. NetworkAgent 注册
   ├─ ConnectivityService 记录网络信息
   ├─ 创建 NetworkAgentInfo
   └─ 设置初始 NetworkCapabilities
   ▼
5. NetworkMonitor 验证网络
   ├─ DNS 探测
   ├─ HTTP/HTTPS 探测
   └─ 设置 VALIDATED capability
   ▼
6. 网络评分和选择
   ├─ 计算 NetworkScore
   ├─ 与其他网络比较
   └─ 决定是否成为默认网络
   ▼
7. 网络状态通知应用
   ├─ NetworkCallback 回调
   ├─ CONNECTIVITY_ACTION 广播
   └─ Settings 数据库更新

4.2 网络请求匹配流程

应用请求网络:

NetworkCapabilities.Builder()
    .addTransportType(TRANSPORT_WIFI)
    .addCapability(NET_CAPABILITY_INTERNET)
    .build()
        ▼
connectivityManager.requestNetwork()
        ▼
ConnectivityService.requestNetwork()
        ▼
创建 NetworkRequestInfo (NRI)
        ▼
rematchAllNetworksAndRequests()
    │
    ├─ 遍历所有网络 (NetworkAgentInfo)
    ├─ 测试能否满足请求
    │   request.canBeSatisfiedBy(nai.networkCapabilities)
    │
    ├─ NetworkRanker 评分
    │   ├─ Transport priority (WiFi > Cellular)
    │   ├─ Network validation state
    │   ├─ Network score
    │   └─ User preference
    │
    ├─ 选择最佳网络 (Best Network)
    │   mNetworkRanker.getBestNetwork(request, allNetworks, currentSatisfier)
    │
    └─ 分配给应用
        Network → app

4.3 模块间通信模式

跨进程通信 (IPC):

ConnectivityService (system_server)
        ↕  Binder
┌───────┴─────────────────────────────┐
│                                     │
▼                                     ▼
INetworkAgent                    NetworkStackClient
(NetworkAgent 上报)              (请求 NetworkStack 服务)
                                      │
                         ┌────────────┴────────────┐
                         │                         │
                         ▼                         ▼
                   NetworkStack 进程          In-Process
                   (独立或 system_server)      (Android 12+)
                         │
            ┌────────────┬┴────────┬────────────┐
            ▼            ▼         ▼            ▼
         IpClient    NetworkMonitor DnsResolver netd
         DHCP/静态IP   验证网络      DNS解析     防火墙等

4.4 关键的 AIDL 接口

IConnectivityManager.aidl (系统 API)
├─ getDefaultNetwork()
├─ requestNetwork()
├─ unregisterNetworkCallback()
├─ getNetworkCapabilities()
└─ getNetworkTypeName()

INetworkAgent.aidl (NetworkAgent → ConnectivityService)
├─ sendNetworkCapabilities()
├─ sendLinkProperties()
├─ sendNetworkInfo()
├─ markConnected()
└─ markDisconnected()

INetworkStackConnector.aidl (ConnectivityService → NetworkStack)
├─ makeNetworkMonitor()
├─ makeIpClient()
├─ makeDhcpServer()
└─ fetchIpMemoryStore()

INetd.aidl (ConnectivityService → netd)
├─ interfaceGetCfg()
├─ networkCreatePhysical()
├─ routeAdd()
├─ firewallSetUidRule()
└─ tetherAddForward()

五、Android 15 新增特性

5.1 eBPF 网络策略增强

eBPF Programs 用于:
├─ Metered Network 流量标记
│  └─ 使用 BPF maps 存储流量统计
├─ 应用级防火墙规则
│  └─ 比传统 iptables 性能更好
├─ 网络切片支持
│  └─ 为不同应用提供 QoS
└─ 实时性能监测
   └─ 低开销的网络统计收集

5.2 VPN 改进

VPN 新特性:
├─ Better split tunnel 支持
├─ App-by-app VPN 管理
├─ VPN per-app 权限控制
└─ VPN 网络隔离增强

5.3 网络切片 (Network Slicing)

5G 网络切片支持:
├─ URSP (UE Route Selection Policy)
├─ 流量描述符 (Traffic Descriptor)
├─ NSSAI (Network Slice Selection Assistance Information)
└─ 动态网络切片选择

5.4 Private DNS 改进

├─ DNS over QUIC (DoQ) 支持
├─ 多 DNS 服务器支持
├─ DNS 故障自动转移
└─ 企业 Private DNS 配置

六、性能优化和调试

6.1 网络诊断工具

ConnectivityDiagnosticsManager:
├─ NetworkValidationResult 检查
│  ├─ INVALID (验证失败)
│  ├─ VALID (完全连接)
│  ├─ PARTIALLY_VALID (部分连接)
│  └─ SKIPPED (跳过验证)
├─ 网络探测结果
│  ├─ DNS 探测
│  ├─ HTTP/HTTPS 探测
│  ├─ Private DNS 探测
│  └─ 流量检测
└─ 数据停滞检测 (Data Stall Detection)
   ├─ DNS 连续超时
   └─ TCP 数据包丢失率

6.2 调试命令

# 查看网络状态
dumpsys connectivity

# 查看 NetworkMonitor 状态
dumpsys connectivity --verbose

# 查看网络接口
ip link show

# 查看路由表
ip route show
ip route show table all

# 查看 DNS 配置
getprop persist.sys.usb.config
getprop net.dns1

# 检查 VPN 状态
dumpsys wifi
dumpsys telephony

# 网络验证日志
logcat | grep NetworkMonitor

6.3 关键性能指标

KPI:
├─ 网络连接延迟 (<3s)
├─ 网络验证时间 (<5s)
├─ DNS 查询时间 (<100ms)
├─ 网络切换时间 (<500ms)
├─ 内存占用 (< 50MB)
└─ CPU 使用率 (< 5% idle)

总结

NetworkStack 是一个高度解耦、模块化的系统架构,通过 APEX 模块实现了系统网络栈的可升级。核心 ConnectivityService 通过网络评分、请求匹配等机制选择最佳网络,支持 VPN、DNS、路由等高级功能。底层通过 RIL 层与蜂窝网络、通过驱动与 WiFi 等无线网络通信,最终通过 netd 与 Linux 内核网络栈交互。