全景图与调用链路概览)
系列目录第一篇全景图与调用链路概览 | 第二篇内核层—netfilter/iptables与路由策略 | 第三篇Native层(上)—netd守护进程与CommandListener | 第四篇Native层(下)—netd Controller详解 | 第五篇Framework层(上)—ConnectivityService核心机制 | 第六篇Framework层(下)—NMS/NPMS/NSS三大服务 | 第七篇连接建立—WiFi/移动数据/以太网完整流程 | 第八篇应用API层—ConnectivityManager使用与实战调试 |第九篇车机定制—多接口绑定/流量配额/网络共享一、为什么要系统学习 Android 网络模块每个 Android 开发者都写过HttpURLConnection.connect()当这个调用没有按预期返回数据时问题可能出在哪一层是 DNS 解析被 netd 代理拦截了是 netfilter 防火墙规则丢弃了包还是 ConnectivityService 错误地切换了默认网络网络是 Android 设备最核心的能力之一。从应用发起一个 HTTP 请求到数据包从 WiFi 或 4G 接口发出中间经过了 Linux 内核协议栈、netd 守护进程、Framework 层的多个服务、以及各类网络代理——每一步都可能成为问题排查的关键环节。当遇到以下问题时仅凭搜索是远远不够的“WiFi 已连接但无法上网”是 DNS 解析失败是路由表配置错误还是 netfilter 防火墙规则阻止了流量“WiFi 切换到移动数据太慢”ConnectivityService 的评分机制是怎么判断的NetworkAgent 的注册和注销流程是什么“VPN 连上后网络断了”netd 的 RouteController 如何管理 fwmark多网络并存时路由策略如何协调“热点共享失败”TetherController 的 NAT 转发规则是怎么生成的接口桥接和 DHCP 配置在哪个环节本系列以AOSP 7android-7.1.2_r36为基准带你从 Linux 内核一路走到 Android 应用 API逐层拆解 Android 网络子系统。二、宏观架构五层模型Android 网络系统可以用一个清晰的五层模型来描述┌─────────────────────────────────────────────────────────────┐ │ 应用 API 层 │ │ ConnectivityManager / WifiManager / NetworkRequest │ │ NetworkCallback / bindProcessToNetwork() │ ├─────────────────────────────────────────────────────────────┤ │ 网络代理层 (NetworkAgent) │ │ WifiStateMachine → WiFi 连接的代理 │ │ DataConnection → 移动数据的代理 │ │ EthernetNetworkFactory → 以太网的代理 │ ├─────────────────────────────────────────────────────────────┤ │ Framework 服务层 │ │ ConnectivityService → 网络连接状态机、评分与切换 │ │ NetworkManagementService → 与 netd 通信、接口管理 │ │ NetworkPolicyManagerService → 网络策略省电/流量限制 │ │ NetworkStatsService → 按 UID/接口 统计流量 │ ├─────────────────────────────────────────────────────────────┤ │ Native 守护进程层 │ │ netd (Network Daemon) │ │ ├── CommandListener → 接收并分发 Framework 层命令 │ │ ├── NetlinkManager → 监听内核 netlink 事件 │ │ ├── DnsProxyListener → DNS 代理拦截所有 DNS 请求 │ │ ├── NetworkController → 接口管理 │ │ ├── RouteController → 路由表与 fwmark 策略 │ │ ├── FirewallController → 基于 UID 的 iptables 防火墙 │ │ ├── BandwidthController → 带宽控制 │ │ ├── TetherController → USB/WiFi 网络共享 │ │ ├── IdletimerController → 接口空闲检测 │ │ └── SoftapController → WiFi 热点管理 │ ├─────────────────────────────────────────────────────────────┤ │ 内核层 │ │ Linux netfilter/iptables / 路由表 / fwmark │ │ 网络设备驱动 (wlan0 / rmnet0 / eth0 / tun0) │ └─────────────────────────────────────────────────────────────┘三、核心组件速览3.1 netd — 网络管理守护进程netd 是 Android 网络管理的枢纽位于 Framework 和内核之间向下通过 NetlinkManager 监听内核 netlink 事件接口插拔、链路状态等向上通过 CommandListener 接收来自 NetworkManagementService 的命令内部通过各类 Controller 操作 iptables、路由表、DNS 配置等为应用提供 DNS 代理服务DnsProxyListener源码路径system/netd/server/netd.rcservicenetd /system/bin/netd class main socket netd stream 0660 root system socket dnsproxyd stream 0660 root inet socket mdns stream 0660 root system socket fwmarkd stream 0660 root inet关键设计netd 通过四个独立的 Socket 实现职责分离——控制命令、DNS 代理、服务发现、fwmark 各走各的通道互不干扰。Framework 层通过netdsocket 下发命令所有应用的 DNS 查询则统一走dnsproxydsocket。四个 Socket 各司其职Socket类型权限用途netdstream0660 root systemFramework 层控制命令通道dnsproxydstream0660 root inetDNS 代理所有进程的 DNS 查询都走这里mdnsstream0660 root system多播 DNS 服务发现fwmarkdstream0660 root inetfwmark 命令通道3.2 ConnectivityService — 网络总调度ConnectivityService是 Framework 层的网络状态机负责管理所有 NetworkAgentWiFi、移动数据、以太网等根据 NetworkFactory 的评分决定使用哪个网络处理 NetworkRequest应用请求网络协调多网络并存时的路由策略发送 CONNECTIVITY_ACTION 广播通知应用源码路径frameworks/base/services/core/java/com/android/server/ConnectivityService.java3.3 NetworkManagementService — netd 通信桥梁NetworkManagementService通过NativeDaemonConnector与 netd 的 CommandListener 通信封装了所有 netd 命令的发送和响应解析。源码路径frameworks/base/services/core/java/com/android/server/NetworkManagementService.java3.4 NetworkAgent / NetworkFactory — 网络代理模式每种网络类型都有自己的 NetworkFactory工厂和 NetworkAgent代理WifiStateMachine既是 WiFi 的状态机也是一个 NetworkAgentDataConnectiontelephony移动数据的连接注册为 NetworkAgentEthernetNetworkFactory以太网的工厂 代理源码路径frameworks/base/core/java/android/net/NetworkAgent.javaframeworks/base/core/java/android/net/NetworkFactory.java四、一条 HTTP 请求的完整旅程以应用发起HttpURLConnection.connect()为例跟踪数据包的完整路径T0: APP 调用 URL.openConnection() → HttpURLConnection.connect() → 创建 Socket T1: Socket 连接 → 查询 DNSgetaddrinfo() → 通过 /dev/socket/dnsproxyd 转发到 netd 的 DnsProxyListener → netd 查询上游 DNS 服务器 T2: TCP 三次握手 → Socket.connect() → 内核 TCP 协议栈 → netfilter OUTPUT 链防火墙检查 → netfilter POSTROUTING 链NAT 转换 → 路由表查询fwmark 选择正确的路由表 → 网卡驱动发送 (wlan0 / rmnet_data0) T3: HTTP 请求发送 → write(request) → 同上路径 T4: HTTP 响应接收 → 网卡驱动接收 → netfilter PREROUTING 链 → TCP 协议栈 → Socket → APP T5: 连接关闭 → Socket.close()关键路径注意 DNS 查询T1和路由选择T2是两个最关键的决策点——DNS 决定往哪去路由表决定从哪走两者共同决定了数据包的最终出口。五、多网络并存的挑战Android 的一大特色是多网络并存WiFi 连着、移动数据也连着、VPN 也连着它们如何协调关键在于netIdfwmark策略路由的组合以下为概念示意具体实现见第四篇 RouteController 详解netId100 (WiFi) → 路由表 100 → 默认走 wlan0 netId101 (移动数据) → 路由表 101 → 默认走 rmnet_data0 netId102 (VPN) → 路由表 102 → 默认走 tun0每个 Socket 创建时会根据绑定规则获得一个 fwmark内核根据 fwmark 查找对应的策略路由表Socket → fwmark0x00030064 (netId100) → 策略路由规则 → 查找路由表 100 → 默认路由指向 wlan0关键设计fwmark 是 Socket 的网络身份证——内核根据它决定查询哪张路由表从而实现多网络并存时的流量隔离避免 WiFi 和移动数据的路由互相干扰。ConnectivityService 在切换默认网络时会更新全局 fwmark 和路由确保未绑定到特定网络的应用走正确的出口。六、关键源码文件索引以下表格按模块汇总了本系列涉及的核心源码文件方便读者在阅读后续各篇时快速定位netd 守护进程文件说明system/netd/server/main.cppnetd 入口system/netd/server/CommandListener.cpp命令监听与分发system/netd/server/NetlinkManager.cpp内核事件监听system/netd/server/NetworkController.cpp接口管理system/netd/server/RouteController.cpp路由策略system/netd/server/DnsProxyListener.cppDNS 代理system/netd/server/ResolverController.cppDNS 解析器system/netd/server/FirewallController.cpp防火墙system/netd/server/BandwidthController.cpp带宽控制system/netd/server/TetherController.cpp网络共享system/netd/server/SoftapController.cppWiFi 热点system/netd/server/IdletimerController.cpp空闲检测Framework 层文件说明frameworks/base/services/core/java/com/android/server/ConnectivityService.java网络总调度frameworks/base/services/core/java/com/android/server/NetworkManagementService.javanetd 通信桥梁frameworks/base/services/core/java/com/android/server/net/NetworkPolicyManagerService.java网络策略frameworks/base/services/core/java/com/android/server/net/NetworkStatsService.java流量统计frameworks/base/services/core/java/com/android/server/NativeDaemonConnector.java与 netd 的命令通信协议NetworkAgent / 网络类型文件说明frameworks/base/core/java/android/net/NetworkAgent.java网络代理基类frameworks/base/core/java/android/net/NetworkFactory.java网络工厂基类frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.javaWiFi 状态机应用 API文件说明frameworks/base/core/java/android/net/ConnectivityManager.java应用网络 APIframeworks/base/core/java/android/net/NetworkRequest.java网络请求构建frameworks/base/core/java/android/net/Network.java网络连接句柄七、本篇总结本篇建立了 Android 7 网络子系统的五层全景图内核 → netd → Framework → NetworkAgent → 应用 API并跟踪了一条 HTTP 请求在各层之间穿行的完整路径。核心结论关键理解netd 是网络控制的中枢——Framework 层的所有网络策略防火墙、带宽、路由、DNS最终都通过 netd 的 Controller 落地为 iptables 规则和路由表条目。理解 netd就理解了 Android 网络的操作系统。从下一篇开始我们将从内核层逐层向上拆解首先深入 netfilter/iptables 和 fwmark 策略路由机制。八、各篇预告篇目聚焦第二篇内核层netfilter/iptables、fwmark、路由策略第三篇netd 启动、四个 Socket、CommandListener、NetlinkManager第四篇八个 Controller 逐一详解第五篇ConnectivityService 评分机制、网络切换第六篇NMS/NPMS/NSS 三大服务防火墙、策略、统计第七篇WiFi/移动数据/以太网三种网络建立的完整源码流程第八篇实战调试dumpsys/ndc/tcpdump 6 个典型问题分析第九篇车机定制多接口绑定/流量配额/网络共享