安卓/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(稳定):
| 特性 | 内核版本 | 说明 |
|---|---|---|
| 基础 MPTCP | 5.6 | 多子流建立、数据调度、路径管理 |
| MPTCP v1 (RFC 8684) | 5.6+ | 标准协议,与 MPTCP v0 互操作 |
| path manager | 5.6+ | full-mesh(默认)、ndiffports |
| scheduler | 5.6+ | default(min-RTT)、redundant |
| active backup | 5.7+ | 主备模式,仅主路径传输 |
| MPTCP sockopt | 5.11+ | MPTCP_ENABLED、MPTCP_INFO |
| MPTCP syn cookie | 5.13+ | SYN flood 防护兼容 |
| MPTCP DSS checksum | 5.15+ | 数据校验 |
| MPTCP fastclose | 5.18+ | 快速关闭子流 |
| MPTCP infinite mapping | 6.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 对比
| 维度 | MPTCP | QUIC |
|---|---|---|
| 设计层级 | 内核传输层(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) |
| SACK | 2.x+ | 选择性确认(RFC 2018) |
| F-RTO | 2.6.22+ | 伪重传检测(RFC 5682) |
| RACK | 4.12+ | Recent ACKnowledgment(Google 提案) |
| TLP | 3.10+ | Tail Loss Probe,尾丢包探测 |
| RTO Restart | 4.13+ | RTO 定时器重启优化 |
| Early Retransmit | 3.5+ | 小窗口早期重传(RFC 5827) |
| Eifel | 2.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_retries2 | 15 | 15-20 | 卫星间歇性连接需更多重试 |
tcp_thin_linear_timeouts | 0 | 1 | 瘦流(如 SMS)线性超时更高效 |
tcp_rmem_max | 2MB | 4-8MB | 高 BDP 需更大接收窗口 |
tcp_wmem_max | 2MB | 4-8MB | 高 BDP 需更大发送窗口 |
tcp_congestion_control | cubic | bbr | BBR 对高延迟、随机丢包更友好 |
tcp_slow_start_after_idle | 1 | 0 | 卫星间歇传输避免反复慢启动 |
tcp_no_metrics_save | 0 | 1 | 不缓存旧路径的 TCP 指标 |
tcp_frto | 2 | 2 | F-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 +
brotliinterceptor:广泛使用 - 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 的封装
netd(system/netd/)是 Android 的网络管理守护进程,对 tc 有有限封装:
| netd 接口 | tc 功能 | AOSP 使用场景 |
|---|---|---|
BandwidthController | tc + iptables | 数据流量限制、告警 |
TetherController | tc + nat | 热点带宽控制 |
TrafficController | tc + 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 不暴露 netem | netd 的 AIDL 接口无 netem 相关方法 |
| 接口不稳定 | 移动网络接口(rmnet0 等)频繁重建,tc 规则丢失 |
| BPF 替代 | Android 正用 eBPF 替代 tc/iptables 做流量统计 |
4.4 卫星弱网测试的困难与替代方案
困难:
- 无法在真机上用 netem 模拟卫星延迟
- 卫星 Demo 模式(
DemoSimulator)仅模拟信号和消息,不模拟网络延迟 - Android 模拟器(AVD)的网络模拟功能有限
替代方案:
- 中间代理:在 Wi-Fi 路由器或 PC 上运行
tc netem,手机通过该路由器上网 - Charles/mitmproxy:HTTP 代理,可模拟延迟和丢包
- Android Network Security Config:无法模拟延迟,但可配置证书
- ConnectivityService 测试:
TestNetworkManager可创建测试网络接口 - 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 | 系统签名 | ❌ 不可用 |
| 创建 VPN | VpnService | ✅ 可用(用户授权) |
| 执行 iptables | root | ❌ 不可用 |
VpnService 是唯一的例外:应用可通过 VpnService 创建 TUN 接口,自行处理 IP 包,实现:
- 流量过滤和转发
- 自定义路由规则
- 压缩/加密
5.4 卫星场景中防火墙规则、NAT 的应用
| 场景 | iptables/NAT 用途 | AOSP 支持 |
|---|---|---|
| 卫星热点 | TetherController NAT 转发 | ✅ 原生支持 |
| 卫星流量优先 | 按 UID 设置 fw 规则,限制后台流量 | ⚠️ 需系统权限 |
| 卫星数据节省 | iptables DROP 非必要流量 | ⚠️ 需系统权限 |
| 卫星 VPN | VpnService 路由卫星流量到 VPN | ✅ 应用可用 |
| 卫星 NAT64 | clatd (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-1190 | config_network_type_tcp_buffers 解析 |
| TCP 缓冲区更新 | DataNetwork.java L3318-3331 | updateTcpBufferSizes() |
| 卫星约束数据 | NetworkTypeController.java L251 | mIsSatelliteConstrainedData |
| netd | system/netd/server/ | FirewallController, BandwidthController, TetherController |
| ConnectivityService | frameworks/base/services/core/java/com/android/server/ConnectivityService.java | 网络评分、TCP 缓冲区应用 |
| eBPF 流量统计 | system/bpf/progs/netd.c | 替代 xt_qtaguid |
| Linux TCP 栈 | net/ipv4/tcp_*.c | RTO、重传、拥塞控制 |
| Linux MPTCP | net/mptcp/ | MPTCP 协议实现 |
| Linux tc | net/sched/ | qdisc、class、filter、netem |
| Linux netfilter | net/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 厂商
-
MPTCP 启用:
- 在内核配置中启用
CONFIG_MPTCP=y - 在
netd中添加 MPTCP path manager 集成 - 实现
ConnectivityService的多路径感知 - 参考:华为 LinkTurbo、三星 Intelligent Wi-Fi
- 在内核配置中启用
-
TCP 参数动态适配:
- 在
config_network_type_tcp_buffers中添加 NTN 类型的配置 - 实现按网络类型切换拥塞控制算法(CUBIC → BBR)
- 在
DataNetwork.updateTcpBufferSizes()中检测 NTN 网络并应用更大的缓冲区
- 在
-
卫星流量优化:
- 使用 iptables/eBPF 限制后台应用在卫星链路上的流量
- 实现
NetworkTypeController.mIsSatelliteConstrainedData的完整策略 - 在
BandwidthController中为卫星接口设置更严格的带宽限制
针对应用开发者
-
HTTP 压缩:
- 使用 OkHttp + Brotli interceptor,在卫星场景下可节省 15-25% 带宽
- 对小消息(< 1KB),压缩收益有限,不值得额外 CPU 开销
-
QUIC 连接迁移:
- 使用 Cronet 替代 HttpURLConnection,获得 QUIC 连接迁移能力
- 卫星↔地面切换时,QUIC Connection ID 迁移比 TCP 重连快得多
-
VpnService:
- 通过 VpnService 可实现卫星流量过滤和路由,无需系统权限
- 适合开发卫星数据节省工具
-
网络感知:
-
监听
ConnectivityManager.NetworkCallback感知网络切换 -
使用
TelephonyManager.getDataNetworkType()检测 NTN 网络 -
在卫星网络下降低数据传输频率、启用更激进的缓存策略
-
报告已完成。以下是几个关键发现的总结:
最重要的发现:AOSP 在 DataConfigManager.java 中已经建立了按网络类型动态调整 TCP 缓冲区的框架(config_network_type_tcp_buffers),通过 DataNetwork.java 的 updateTcpBufferSizes() 在网络类型变化时自动更新。这是卫星 TCP 适配最直接的切入点——只需在资源 overlay 中添加 NTN 类型的 TCP 缓冲区配置即可。
卫星约束数据标记:NetworkTypeController.java 中的 mIsSatelliteConstrainedData 标志表明 Android 16 已经开始感知卫星网络对数据传输的约束,但目前仅用于重置网络类型显示定时器,尚未扩展到 TCP 参数调优。
MPTCP 的现实:Google 明确倾向于 QUIC 而非 MPTCP。对于卫星场景,QUIC 的连接迁移(Connection ID 迁移)比 MPTCP 的多路径更实际——前者只需客户端改动,后者需要全网设备升级。 模型请求失败,请稍后重试。 (3003)