安卓/Linux 网络技术在 AOSP 终端上的现状分析报告

0 阅读16分钟

安卓/Linux 网络技术在 AOSP 终端上的现状分析报告

一、执行摘要

整体现状:在五项分析技术中,iptables/netfilter 和 TCP 重传机制在 AOSP 中原生支持最为成熟,前者通过 netd 系统服务深度集成,后者由 Linux 内核完整继承且通过 DataConfigManager 提供了按网络类型动态调整 TCP 缓冲大小的能力。HTTP 压缩(Gzip)在系统层原生可用,Brotli 通过 OkHttp 生态广泛使用但非系统级集成。MPTCP 在 Android 通用内核(ACK)中已编译但默认未启用,无用户态框架集成,普通应用完全不可用。Traffic Control(tc/netem) 在 Android 中被 netd 有限封装(仅带宽限制和热点 QoS),netem 模拟功能基本不可用,需 root 权限。卫星通信场景下,TCP 参数动态适配和 MPTCP 多路径切换价值最大,但当前 AOSP 均未针对 NTN 做专门优化。


二、各技术详细分析

1. MPTCP

1.1 Linux 支持现状

Linux 内核自 5.6(2020年3月)起主线支持 MPTCP,当前已演进至 v1(稳定):

特性内核版本说明
基础 MPTCP5.6多子流建立、数据调度、路径管理
MPTCP v1 (RFC 8684)5.6+标准协议,与 MPTCP v0 互操作
path manager5.6+full-mesh(默认)、ndiffports
scheduler5.6+default(min-RTT)、redundant
active backup5.7+主备模式,仅主路径传输
MPTCP sockopt5.11+MPTCP_ENABLEDMPTCP_INFO
MPTCP syn cookie5.13+SYN flood 防护兼容
MPTCP DSS checksum5.15+数据校验
MPTCP fastclose5.18+快速关闭子流
MPTCP infinite mapping6.0+降级为普通 TCP 的回退机制

关键内核配置:

CONFIG_MPTCP=y
CONFIG_INET_MPTCP_DIAG=y
CONFIG_MPTCP_IPV6=y

关键 sysctl 参数:

net.mptcp.enabled=1                    # 全局启用
net.mptcp.add_addr_timeout=30          # ADD_ADDR 超时(秒)
net.mptcp.allow_join_initial_addr_port=1  # 允许初始地址端口加入
net.mptcp.checksum_enabled=0           # DSS 校验(默认关闭)
net.mptcp.pm_type=0                    # path manager: 0=full-mesh, 1=ndiffports
1.2 Android 支持现状

内核层面:Android 通用内核(ACK)自 android13-5.15 起包含 MPTCP 代码,但默认未启用

# 典型 ACK .config 中
# CONFIG_MPTCP is not set   ← 大多数设备如此

Pixel 7/8 系列的内核配置中 MPTCP 未编译。部分 OEM(如华为 LinkTurbo)使用私有 MPTCP 实现。

用户态框架:AOSP 中无任何 MPTCP 用户态集成

  • netd:无 MPTCP 相关命令
  • ConnectivityService:无多路径 TCP 感知
  • NetworkAgent:不区分 MPTCP 子流
  • LinkProperties:无 MPTCP 信息字段

应用可见性:普通应用完全无法使用 MPTCP。即使内核启用,应用也无法:

  • 指定某连接使用 MPTCP
  • 获取子流状态
  • 控制路径选择策略
1.3 卫星场景价值与限制

价值

  • 地面+卫星双路径:MPTCP 可同时维持 Wi-Fi/蜂窝和卫星两条路径,实现无缝切换
  • Make-Before-Break:卫星信号丢失时,TCP 连接不中断,数据自动切换到地面路径
  • 带宽聚合:在地面和卫星同时可用时,聚合带宽

限制

  • 需要两端(终端和服务器)同时支持 MPTCP
  • 卫星链路的高 RTT(500ms+)会导致 MPTCP 调度器持续选择地面路径,卫星子流仅作备份
  • Android 未启用 MPTCP,需 OEM 深度定制
  • 运营商 NTN 漫游场景下,卫星和地面可能使用不同 IP 地址,NAT 穿透困难
1.4 MPTCP 与 QUIC 对比
维度MPTCPQUIC
设计层级内核传输层(L4)用户态应用层(L7 over UDP)
多路径原生核心设计IETF MP-QUIC(RFC 9221,实验性)
加密可选(TLS over MPTCP)强制 TLS 1.3
连接迁移子流增删Connection ID 迁移
部署难度需内核支持 + 网络设备升级仅需客户端/服务端软件升级
中间设备兼容被 Middlebox 干扰(MP选项被剥离)UDP 穿透,较少干扰
Android 支持内核有代码但未启用广泛支持(Cronet、OkHttp)
卫星适用性地面+卫星双路径(需两端支持)连接迁移(仅客户端改动)
标准成熟度RFC 8684(2020,成熟)RFC 9000(2021,成熟);MP-QUIC 实验性
Google 立场未在 Android 启用主推(Cronet/Chrome 默认)

结论:Google 更倾向于 QUIC 而非 MPTCP。QUIC 的连接迁移功能可部分替代 MPTCP 的多路径能力,且部署成本更低。


2. TCP 重传机制

2.1 Linux 重传算法

Linux 内核实现了完整的 TCP 重传体系:

算法内核版本说明
RTO 计算2.x+基于 SRTT/RTTVAR 的经典算法(RFC 6298)
快速重传2.x+3 个重复 ACK 触发(RFC 5681)
SACK2.x+选择性确认(RFC 2018)
F-RTO2.6.22+伪重传检测(RFC 5682)
RACK4.12+Recent ACKnowledgment(Google 提案)
TLP3.10+Tail Loss Probe,尾丢包探测
RTO Restart4.13+RTO 定时器重启优化
Early Retransmit3.5+小窗口早期重传(RFC 5827)
Eifel2.6.22+伪重传检测与恢复

关键 sysctl 参数:

# RTO 范围
net.ipv4.tcp_retr1=3                    # 重传次数(放弃前)
net.ipv4.tcp_retr2=15                   # 重传次数(关闭连接前)
net.ipv4.tcp_retries1=3                 # 同 tcp_retr1
net.ipv4.tcp_retries2=15                # 同 tcp_retr2
net.ipv4.tcp_thin_linear_timeouts=1     # 瘦流线性超时

# RACK/TLP
net.ipv4.tcp_recovery=1                 # RACK 启用
net.ipv4.tcp_early_retrans=3            # Early Retransmit + TLP

# 拥塞控制
net.ipv4.tcp_congestion_control=cubic   # 默认 CUBIC
net.ipv4.tcp_allowed_congestion_control=cubic reno
2.2 Android 继承情况与调优接口

内核层面:Android 完整继承 Linux TCP 重传机制,但默认参数未针对高延迟链路优化

AOSP 框架层:最关键的适配是 TCP 缓冲区大小按网络类型动态调整

// DataConfigManager.java L955-980
private void updateTcpBuffers() {
    mTcpBufferSizeMap.clear();
    String[] configs = mResources.getStringArray(
            com.android.internal.R.array.config_network_type_tcp_buffers);
    // 格式: "network_type:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max"
    for (String config : configs) {
        String[] split = config.split(":");
        mTcpBufferSizeMap.put(split[0], split[1]);
    }
}
// DataNetwork.java L3318-3331
private void updateTcpBufferSizes() {
    mTcpBufferSizes = mDataConfigManager.getTcpConfigString(mTelephonyDisplayInfo);
    LinkProperties linkProperties = new LinkProperties(mLinkProperties);
    linkProperties.setTcpBufferSizes(mTcpBufferSizes);
    if (!linkProperties.equals(mLinkProperties)) {
        mLinkProperties = linkProperties;
        mNetworkAgent.sendLinkProperties(mLinkProperties);
    }
}

TCP 缓冲区通过 LinkProperties 传递到 ConnectivityService,最终由 netd 写入内核:

ConnectivityService → netd → /proc/sys/net/ipv4/tcp_rmem / tcp_wmem

卫星约束数据标记(Android 16 新增):

// NetworkTypeController.java L251
private boolean mIsSatelliteConstrainedData = false;

当卫星数据被标记为 constrained 时,会触发网络类型控制器重置定时器,可能影响 TCP 参数选择。

限制

  • AOSP 仅调整 TCP 缓冲区大小,不调整 RTO、重传次数等参数
  • 无按网络类型(如 NTN)动态切换拥塞控制算法的机制
  • 普通应用无法修改 sysctl 参数(需要 root)
2.3 卫星链路下的参数建议
参数地面默认值卫星建议值理由
tcp_retries21515-20卫星间歇性连接需更多重试
tcp_thin_linear_timeouts01瘦流(如 SMS)线性超时更高效
tcp_rmem_max2MB4-8MB高 BDP 需更大接收窗口
tcp_wmem_max2MB4-8MB高 BDP 需更大发送窗口
tcp_congestion_controlcubicbbrBBR 对高延迟、随机丢包更友好
tcp_slow_start_after_idle10卫星间歇传输避免反复慢启动
tcp_no_metrics_save01不缓存旧路径的 TCP 指标
tcp_frto22F-RTO 对卫星伪重传检测有帮助

BDP 计算:卫星链路 BDP = 带宽 × RTT。例如 LEO 1Mbps × 40ms = 5KB;GEO 1Mbps × 600ms = 75KB。TCP 缓冲区至少应大于 BDP。


3. HTTP 压缩

3.1 Gzip(系统级支持)

Android 原生支持:✅ 完整

  • java.util.zip.GZIPInputStream / GZIPOutputStream:自 Android 1.0 起内置
  • HttpURLConnection 默认添加 Accept-Encoding: gzip,自动解压
  • Android 系统服务(如 ContentProvider)内部使用 Gzip

压缩率:文本约 60-70%(典型 Web 内容)

3.2 Brotli

Android 系统级支持:❌ 无原生集成

  • java.util.zip不包含 Brotli
  • Android WebView 自 Android 5.0 起支持 Brotli 解码(Chromium 内核)
  • OkHttp 自 3.x 起通过 okio 可选支持 Brotli

第三方生态

  • org.brotli:dec:Google 官方 Brotli Java 解码器
  • OkHttp + brotli interceptor:广泛使用
  • Cronet(Chromium 网络栈):原生支持 Brotli

压缩率:比 Gzip 高 15-25%(文本内容)

3.3 Zstd / LZMA

Android 系统级支持:❌

  • Zstd:Facebook 开源,压缩率接近 LZMA,速度接近 Gzip。Android 无原生支持
  • LZMA / LZMA2:java.util.zip 不包含,但 Android 系统使用 LZMA 压缩 APK(assets/
3.4 卫星场景压缩率与功耗权衡
算法压缩率(文本)压缩速度解压速度CPU 开销卫星适用性
Gzip (L6)基准 (60-70%)✅ 最佳平衡
Brotli (Q4)+15-25%✅ 高带宽节省
Brotli (Q11)+25-35%极慢⚠️ 压缩成本高
Zstd (L3)+10-20%极快✅ 理想但不可用
LZMA+25-30%极慢❌ 不适合

卫星场景建议

  • 发送端(终端→卫星):使用 Brotli Q4 或 Gzip L6,牺牲少量压缩率换取更快的压缩速度(终端 CPU 受限、功耗敏感)
  • 接收端(卫星→终端):可接受 Brotli Q11,解压速度快于压缩
  • 关键指标:每节省 1KB 数据传输 ≈ 节省数秒卫星链路时间,值得适度增加 CPU 开销

4. Traffic Control (tc)

4.1 Linux tc 框架与 netem 介绍

Linux tc(Traffic Control)是内核流量控制框架,位于 net/sched/

组件说明
qdisc排队规则:pfifo_fast、htb、tbf、fq_codel、fq
class分类器:htb class
filter过滤器:u32、fw、flower
netem网络模拟器:延迟、丢包、重复、乱序、速率限制

netem 典型用法:

# 添加 500ms 延迟 + 1% 丢包(模拟卫星链路)
tc qdisc add dev eth0 root netem delay 500ms loss 1%
# 添加 50ms 抖动
tc qdisc add dev eth0 root netem delay 500ms 50ms loss 1% 25%
4.2 Android 中 netd 对 tc 的封装

netdsystem/netd/)是 Android 的网络管理守护进程,对 tc 有有限封装

netd 接口tc 功能AOSP 使用场景
BandwidthControllertc + iptables数据流量限制、告警
TetherControllertc + nat热点带宽控制
TrafficControllertc + bpf流量统计(替代 xt_qtaguid)

AOSP 中 tc 的实际使用

netd → BandwidthController
  → tc qdisc add dev <ifname> root handle 10: htb
  → tc class add dev <ifname> parent 10: classid 10:1 htb rate <bw>
  → tc filter add dev <ifname> parent 10: protocol ip u32 ...

热点 QoS(Android 11+):

netd → TetherController
  → 设置下游接口的 tc 规则
  → 限制每个客户端的带宽
4.3 限制:netem 通常禁用、需要 root

关键限制

限制说明
netem 未编译大多数 Android 设备内核未启用 CONFIG_NET_SCH_NETEM
root 权限tc 命令需要 root,普通应用无法执行
netd 不暴露 netemnetd 的 AIDL 接口无 netem 相关方法
接口不稳定移动网络接口(rmnet0 等)频繁重建,tc 规则丢失
BPF 替代Android 正用 eBPF 替代 tc/iptables 做流量统计
4.4 卫星弱网测试的困难与替代方案

困难

  • 无法在真机上用 netem 模拟卫星延迟
  • 卫星 Demo 模式(DemoSimulator)仅模拟信号和消息,不模拟网络延迟
  • Android 模拟器(AVD)的网络模拟功能有限

替代方案

  1. 中间代理:在 Wi-Fi 路由器或 PC 上运行 tc netem,手机通过该路由器上网
  2. Charles/mitmproxy:HTTP 代理,可模拟延迟和丢包
  3. Android Network Security Config:无法模拟延迟,但可配置证书
  4. ConnectivityService 测试TestNetworkManager 可创建测试网络接口
  5. DemoSimulator(AOSP 卫星框架内置):模拟卫星信号和消息收发延迟

5. iptables / netfilter

5.1 Android netd 中的控制器

netd 通过以下控制器封装 iptables/netfilter:

控制器功能iptables 命令
FirewallController防火墙规则(应用联网控制)iptables -A fw_<chain> -m owner --uid <uid> -j DROP
BandwidthController流量限制和告警iptables -A bw_<chain> -m owner --uid <uid> -j RETURN
TetherController热点 NAT 和转发iptables -t nat -A POSTROUTING -o <upstream> -j MASQUERADE
StrictController严格网络隔离iptables -A st_<chain> -m owner --uid <uid> -j REJECT

Android 防火墙链

fw_INPUT        → 入站过滤
fw_OUTPUT       → 出站过滤(按 UID)
fw_FORWARD      → 转发过滤
bw_INPUT        → 带宽入站
bw_OUTPUT       → 带宽出站
bw_FORWARD      → 带宽转发
st_INPUT        → 严格入站
st_OUTPUT       → 严格出站
5.2 xt_qtaguid 扩展与流量统计

历史:Android 4.x-9 使用 xt_qtaguid 内核模块按 UID/Tag 统计流量:

cat /proc/net/xt_qtaguid/stats
# idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets ...

现状:Android 10+ 用 eBPF 替代 xt_qtaguid

  • system/bpf/progs/netd.c:eBPF 程序
  • NetworkStatsService:从 eBPF map 读取流量统计
  • 优势:无需内核模块、性能更好、更安全
5.3 应用权限限制
操作权限要求普通应用
读取流量统计PACKAGE_USAGE_STATS⚠️ 需用户授权
设置防火墙规则系统签名❌ 不可用
配置 NAT系统签名❌ 不可用
创建 VPNVpnService✅ 可用(用户授权)
执行 iptablesroot❌ 不可用

VpnService 是唯一的例外:应用可通过 VpnService 创建 TUN 接口,自行处理 IP 包,实现:

  • 流量过滤和转发
  • 自定义路由规则
  • 压缩/加密
5.4 卫星场景中防火墙规则、NAT 的应用
场景iptables/NAT 用途AOSP 支持
卫星热点TetherController NAT 转发✅ 原生支持
卫星流量优先按 UID 设置 fw 规则,限制后台流量⚠️ 需系统权限
卫星数据节省iptables DROP 非必要流量⚠️ 需系统权限
卫星 VPNVpnService 路由卫星流量到 VPN✅ 应用可用
卫星 NAT64clatd (464xlat) 做 IPv4-over-IPv6✅ 原生支持

三、综合对比表

技术Linux 内核支持AOSP 框架集成普通应用可用需 root/系统权限卫星适用性OEM 定制常见度
MPTCP✅ 5.6+❌ 未集成需内核启用+root⭐⭐⭐⭐⭐ 极高高(华为LinkTurbo等)
TCP 重传/缓冲✅ 完整⚠️ 仅TCP缓冲区sysctl 需 root⭐⭐⭐⭐⭐ 极高中(部分OEM调优)
HTTP 压缩-Gzip✅ 系统级不需要⭐⭐⭐ 有价值低(默认可用)
HTTP 压缩-Brotli⚠️ WebView/OkHttp✅(第三方库)不需要⭐⭐⭐⭐ 高价值
tc/netem✅ 完整⚠️ 有限封装需 root⭐⭐⭐⭐ 测试价值
iptables/netfilter✅ 完整✅ netd 深度集成需系统签名⭐⭐⭐ 有价值高(运营商定制)

四、AOSP 关键代码路径与调试命令

4.1 关键源码路径

技术路径说明
TCP 缓冲区配置DataConfigManager.java L955-1190config_network_type_tcp_buffers 解析
TCP 缓冲区更新DataNetwork.java L3318-3331updateTcpBufferSizes()
卫星约束数据NetworkTypeController.java L251mIsSatelliteConstrainedData
netdsystem/netd/server/FirewallController, BandwidthController, TetherController
ConnectivityServiceframeworks/base/services/core/java/com/android/server/ConnectivityService.java网络评分、TCP 缓冲区应用
eBPF 流量统计system/bpf/progs/netd.c替代 xt_qtaguid
Linux TCP 栈net/ipv4/tcp_*.cRTO、重传、拥塞控制
Linux MPTCPnet/mptcp/MPTCP 协议实现
Linux tcnet/sched/qdisc、class、filter、netem
Linux netfilternet/netfilter/iptables、conntrack、NAT

4.2 运行时调试命令

# === TCP 参数 ===
# 查看当前 TCP 缓冲区
cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/ipv4/tcp_wmem

# 查看当前拥塞控制算法
cat /proc/sys/net/ipv4/tcp_congestion_control
cat /proc/sys/net/ipv4/tcp_available_congestion_control

# 查看 TCP 重传统计
cat /proc/net/snmp | grep Tcp:  # RetransSegs
cat /proc/net/netstat | grep TcpExt  # TCPLostRetransmit, TCPFastRetrans

# 查看 TCP 连接详细状态
ss -ti  # 显示每个连接的 RTT、重传、拥塞窗口

# === MPTCP ===
# 检查内核是否支持 MPTCP
zcat /proc/config.gz | grep MPTCP
# 或
cat /boot/config-$(uname -r) | grep MPTCP

# 查看 MPTCP 连接
ss -M  # 需要 iproute2 支持 MPTCP

# === tc/netem ===
# 查看当前 qdisc
tc qdisc show dev rmnet0

# 添加卫星延迟模拟(需 root)
tc qdisc add dev rmnet0 root netem delay 500ms loss 1%

# 删除 netem 规则
tc qdisc del dev rmnet0 root

# === iptables ===
# 查看防火墙规则
iptables -L -v -n
iptables -t nat -L -v -n

# 查看按 UID 的流量统计(旧版)
cat /proc/net/xt_qtaguid/stats

# 查看 eBPF 流量统计(Android 10+)
cat /sys/fs/bpf/map_netd_app_uid_stats_map

# === 网络接口 ===
# 查看活跃网络接口
ip addr show
ip link show

# 查看 TCP 缓冲区(ConnectivityService 设置的值)
dumpsys connectivity | grep tcpBuffer
dumpsys phone | grep mTcpBufferSizes

# === 卫星状态 ===
dumpsys satellite | grep -i "constrained\|network\|tcp"

4.3 TCP 缓冲区配置格式

config_network_type_tcp_buffers 数组格式:

"network_type:rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max"

典型值:

"GPRS:4096,8760,16384,4096,8760,16384"
"LTE:4096,16384,6291456,4096,16384,6291456"
"NR:4096,16384,8388608,4096,16384,8388608"

卫星 NTN 建议添加:

"NTN:4096,32768,8388608,4096,32768,8388608"

五、Android 16 展望与建议

5.1 预测的技术演进

技术Android 16 预期置信度依据
MPTCP仍不会默认启用Google 主推 QUIC,MPTCP 投入有限
TCP 缓冲区可能增加 NTN 网络类型的 TCP 缓冲区配置DataConfigManager 已有按网络类型配置的框架
BBR 拥塞控制可能作为 NTN 网络的可选拥塞控制算法中低BBR v3 已在 Linux 6.x 合入,但 Android 未启用
Brotli不会成为系统默认压缩库Gzip 生态太成熟,迁移成本高
eBPF继续替代 iptables/tc 做流量控制明确的 Android 技术方向
netem不会在 Android 中启用仅测试用途,非生产功能

5.2 开发者/厂商适配建议

针对 OEM 厂商
  1. MPTCP 启用

    • 在内核配置中启用 CONFIG_MPTCP=y
    • netd 中添加 MPTCP path manager 集成
    • 实现 ConnectivityService 的多路径感知
    • 参考:华为 LinkTurbo、三星 Intelligent Wi-Fi
  2. TCP 参数动态适配

    • config_network_type_tcp_buffers 中添加 NTN 类型的配置
    • 实现按网络类型切换拥塞控制算法(CUBIC → BBR)
    • DataNetwork.updateTcpBufferSizes() 中检测 NTN 网络并应用更大的缓冲区
  3. 卫星流量优化

    • 使用 iptables/eBPF 限制后台应用在卫星链路上的流量
    • 实现 NetworkTypeController.mIsSatelliteConstrainedData 的完整策略
    • BandwidthController 中为卫星接口设置更严格的带宽限制
针对应用开发者
  1. HTTP 压缩

    • 使用 OkHttp + Brotli interceptor,在卫星场景下可节省 15-25% 带宽
    • 对小消息(< 1KB),压缩收益有限,不值得额外 CPU 开销
  2. QUIC 连接迁移

    • 使用 Cronet 替代 HttpURLConnection,获得 QUIC 连接迁移能力
    • 卫星↔地面切换时,QUIC Connection ID 迁移比 TCP 重连快得多
  3. VpnService

    • 通过 VpnService 可实现卫星流量过滤和路由,无需系统权限
    • 适合开发卫星数据节省工具
  4. 网络感知

    • 监听 ConnectivityManager.NetworkCallback 感知网络切换

    • 使用 TelephonyManager.getDataNetworkType() 检测 NTN 网络

    • 在卫星网络下降低数据传输频率、启用更激进的缓存策略

报告已完成。以下是几个关键发现的总结:

最重要的发现:AOSP 在 DataConfigManager.java 中已经建立了按网络类型动态调整 TCP 缓冲区的框架(config_network_type_tcp_buffers),通过 DataNetwork.javaupdateTcpBufferSizes() 在网络类型变化时自动更新。这是卫星 TCP 适配最直接的切入点——只需在资源 overlay 中添加 NTN 类型的 TCP 缓冲区配置即可。

卫星约束数据标记NetworkTypeController.java 中的 mIsSatelliteConstrainedData 标志表明 Android 16 已经开始感知卫星网络对数据传输的约束,但目前仅用于重置网络类型显示定时器,尚未扩展到 TCP 参数调优。

MPTCP 的现实:Google 明确倾向于 QUIC 而非 MPTCP。对于卫星场景,QUIC 的连接迁移(Connection ID 迁移)比 MPTCP 的多路径更实际——前者只需客户端改动,后者需要全网设备升级。 模型请求失败,请稍后重试。 (3003)