蜂窝数据连接管理:异常恢复与切换机制

7 阅读4分钟

蜂窝数据连接管理:异常恢复与切换机制

除了正常的数据连接建立,Android 系统还包含了一套复杂的异常检测与恢复以及网络切换机制,以确保在网络不稳定或环境变化时的数据连续性。

1. 数据停滞恢复 (Data Stall Recovery)

当数据连接显示“已连接”但实际上无法传输数据时,DataStallRecoveryManager 会介入。

1.1 检测机制

系统通过以下方式检测数据停滞:

  1. ConnectivityService 验证失败: 网络验证(Ping/HTTP 探测)失败。
  2. Modem 报告: 信号强度极差或 Modem 内部错误。
  3. 用户行为: 用户频繁开关飞行模式或数据开关(启发式检测)。

1.2 恢复动作 (Recovery Actions)

恢复过程是分级递进的,从轻微操作到重置 Modem:

级别动作常量描述影响
1RECOVERY_ACTION_GET_DATA_CALL_LIST查询 Modem 当前的数据调用列表,同步状态。无感知
2RECOVERY_ACTION_CLEANUP请求 DataNetworkController 重新建立 Internet 连接(Deactivate + Setup)。短暂断网
3RECOVERY_ACTION_RADIO_RESTART重启无线电(Radio Power Off -> On)。信号重搜,通话中断
4RECOVERY_ACTION_RESET_MODEM重启 Modem 硬件(NV_RESET_CONFIG)。彻底重置,耗时较长

1.3 恢复流程

检测到数据停滞 (Validation Failed)
    ↓
isRecoveryNeeded()?
  ├─ 信号强度是否太差? (太差则不恢复)
  ├─ 是否正在通话? (通话中不进行重操作)
  └─ 是否刚恢复过? (避免频繁操作)
    ↓
执行 Level 1: GET_DATA_CALL_LIST
    ↓
等待验证... 仍失败?
    ↓
执行 Level 2: CLEANUP (重连数据)
    ↓
等待验证... 仍失败?
    ↓
执行 Level 3: RADIO_RESTART (重启射频)
    ↓
等待验证... 仍失败?
    ↓
执行 Level 4: RESET_MODEM (重启 Modem)

2. 智能重试机制 (Data Retry Manager)

当数据连接建立失败或意外断开时,DataRetryManager 负责调度重试。

2.1 重试规则 (DataRetryRule)

重试不是盲目的,而是基于配置规则:

  • 基于失败原因 (Fail Cause):

    • RADIO_OFF, ROAMING_NOT_ALLOWED: 不重试
    • INSUFFICIENT_RESOURCES: 指数退避 (3s, 6s, 12s...)。
    • TIMED_OUT: 立即重试
    • PERMANENT_FAILURE: 标记 APN 为永久失败,尝试其他 DataProfile。
  • 基于网络能力 (Capabilities):

    • MMS: 可能有更激进的重试策略。
    • INTERNET: 标准重试策略。

2.2 永久失败处理

如果一个 APN 被标记为 PERMANENT_FAILURE(例如运营商拒绝):

  1. DataProfileManager 会将其标记为不可用。
  2. 系统会尝试寻找下一个能满足相同 Capability 的 DataProfile。
  3. 如果所有 Profile 都失败,则停止重试,直到环境变化(如飞行模式开关、SIM 卡插拔)。

3. 数据切换 (Handover)

数据切换主要指在 蜂窝网络 (Cellular)WiFi (IWLAN) 之间无缝迁移数据连接。

3.1 切换触发

  • WiFi 呼叫 (VoWiFi): 语音数据切换到 IWLAN。
  • 数据卸载: 在 WiFi 质量好时,将 Internet 流量切换到 IWLAN。
  • 覆盖补充: 在蜂窝信号差时切换到 IWLAN。

3.2 切换流程 (Cellular -> IWLAN)

DataNetwork (Cellular)
    │
    ▼ startHandover(TRANSPORT_IWLAN)
    
1. 通知源传输层 (Cellular)
   - "准备切换,保持连接但暂停数据发送"
   
2. 在目标传输层 (IWLAN) 建立连接
   - DataServiceManager(IWLAN).setupDataCall(
       ..., 
       reason = REQUEST_REASON_HANDOVER,
       linkProperties = <Cellular IP/DNS>  // 关键:携带原 IP 信息
     )
     
3. IWLAN DataService 处理
   - 在 ePDG (evolved Packet Data Gateway) 上建立隧道
   - 请求核心网将流量路由到 WiFi
   - 核心网保留原 IP 地址 (IP Preservation)
   
4. 切换完成
   - onDataNetworkHandoverSucceeded()
   - 更新 LinkProperties (网络接口变为 wlan0 或 ipsec0)
   - 应用层无感知 (IP 不变)
   
5. 拆除源连接
   - DataNetworkController 拆除原 Cellular 连接

3.3 切换策略控制

DataNetworkController 使用 HandoverRule 来控制是否允许切换:

  • 不允许切换的场景: 某些运营商要求特定业务(如 MMS、IMS)必须保留在蜂窝网络上,即使有 WiFi 也不切换。
  • 漫游限制: 漫游时可能禁止切换到 IWLAN。

4. 总结:完整的健壮性体系

Android 的数据连接管理不仅仅是“建立连接”,更是一个闭环的健壮性体系

  1. 建立 (Setup): 智能选择 APN,适配 4G/5G 差异。
  2. 维护 (Maintain): 实时监控状态,处理网络变更。
  3. 恢复 (Recover): 分级策略应对死锁和异常。
  4. 重试 (Retry): 基于原因的智能退避,避免信令风暴。
  5. 切换 (Handover): 跨传输层的无缝迁移,保证业务连续。

这一整套机制共同保证了用户在移动过程中、信号波动时、甚至 Modem 异常时,都能获得尽可能稳定的数据服务。