Android 数据传输(Data Transfer)完整分析

4 阅读15分钟

1. PDN(Packet Data Network)连接建立

1.1 PDN 连接的概念

PDN 连接是在 UE 和数据网络(互联网、公司内网等)之间建立的逻辑连接。在 LTE 中称为 EPS Bearer(演进分组系统承载),在 5G 中称为 PDU Session(协议数据单元会话)。

┌─────────────────────────────────────────────────────────┐
│                   PDN 连接层次结构                         │
└─────────────────────────────────────────────────────────┘

应用层          Internet (Google, Facebook 等)
                        ↑
网络层          PGW/UPF (Packet Gateway / User Plane Function)
                        ↑
承载层          EPS Bearer / PDU Session(无线承载)
                        ↑
物理层          Base Station(基站无线传输)

1.2 Android 数据连接层次

在 Android 中的表示结构:

// DataNetwork 代表一个 PDN/PDU Session 实例
public class DataNetwork extends StateMachine {
    // 关键数据成员
    private int mPduSessionId;           // PDU 会话 ID(5G)或 EPS 承载上下文 ID(LTE)
    private DataProfile mDataProfile;    // 数据配置文件(APN 等)
    private LinkProperties mLinkProperties; // 网络配置(IP、DNS、网关等)
    private NetworkCapabilities mNetworkCapabilities; // 网络能力(5G/LTE 等)
    private TelephonyNetworkAgent mNetworkAgent; // 向 ConnectivityService 注册
}

// DataNetworkController 管理所有 PDN
public class DataNetworkController extends Handler {
    private final List<DataNetwork> mDataNetworkList = new ArrayList<>();
    // 例如:Internet PDN、IMS PDN、MMS PDN 等
}

1.3 PDN 建立流程

[应用请求数据][ConnectivityService 请求网络][DataNetworkController 选择或创建 DataNetwork][DataServiceManager.setupDataCall()][Modem/RIL 执行 SETUP_DATA_CALL][LTE RRC/5G RRC 建立无线承载]
        ├→ 信道编码/解码
        ├→ 链路控制
        └→ 资源分配
        ↓
[NAS 层 PDN 连接响应]
        ├→ 分配 IP 地址
        ├→ 分配 DNS
        ├→ 分配网关
        └→ 承载 QoS 参数
        ↓
[DataCallResponse 返回][LinkProperties 更新][TelephonyNetworkAgent 向 ConnectivityService 注册][系统路由通过该网络]

1.4 数据配置(DataProfile)

public class DataProfile {
    // APN 信息
    private ApnSetting mApnSetting;
    
    // 关键字段
    String apn;              // APN 名称(如 "internet", "ims", "mms")
    String protocol;         // 协议类型:IP/IPv6/IPV4V6
    String roamingProtocol;  // 漫游时协议
    String[] addresses;      // IP 地址
    String[] dnses;         // DNS 服务器地址
    String[] gateways;      // 网关地址
    int mtu;                // 最大传输单元(通常 1500 字节)
    
    // 流量描述符(5G/URSP)
    TrafficDescriptor mTrafficDescriptor;
    
    // QoS 参数
    QosPolicy mQosPolicy;
}

1.5 setupDataCall 详细参数

// 在 DataServiceManager.java 中
public void setupDataCall(
        int accessNetworkType,      // 接入网类型(EUTRAN/NGRAN/IWLAN)
        DataProfile dataProfile,    // 数据配置
        boolean isRoaming,          // 是否漫游
        boolean allowRoaming,       // 是否允许漫游
        int reason,                 // 原因(NORMAL/HANDOVER)
        LinkProperties linkProperties, // 现有链接属性(切换时)
        int pduSessionId,           // PDU 会话 ID(5G)
        NetworkSliceInfo sliceInfo, // 网络切片(5G)
        TrafficDescriptor trafficDescriptor, // 流量描述符(URSP)
        boolean matchAllRuleAllowed, // 是否允许默认 URSP 规则
        Message onCompleteMessage) {
    
    // 调用数据服务提供商(通常是 Modem)
    mIDataService.setupDataCall(
            mPhone.getPhoneId(),
            accessNetworkType,
            dataProfile,
            // ... 其他参数
            callback);
}

2. IP 地址分配(IP Address Assignment)

2.1 IPv4 地址分配流程(DHCP)

UE                                   PGW/核心网
 |                                     |
 |──── ACTIVATE_DEFAULT_EPS_BEARER ──→|
 |   (包含 PCO:Protocol Configuration Options)
 |                                     |
 |←──── ACTIVATE_DEFAULT_EPS_BEARER ──|
 |     (返回 IP 地址和配置)            |
 |                                     |
 |──── DHCP DISCOVER ──────────────────|
 |   (或直接从 PCO 获取)               |
 |                                     |
 |←──── DHCP OFFER ─────────────────────|
 |   (提供 IP 地址)                     |
 |                                     |
 |──── DHCP REQUEST ───────────────────|
 |                                     |
 |←──── DHCP ACK ─────────────────────|
 |   (确认分配)                        |
 |                                     |
[UE 获得 IP 地址]

2.2 Android 中的 IP 地址分配

// 在 DataCallResponse 中返回的地址信息
public class DataCallResponse {
    // IPv4/IPv6 地址列表
    private List<LinkAddress> mAddresses;
    
    // 示例:
    // IPv4: 10.123.45.67/32
    // IPv6: 2001:db8::1/64
    
    private List<InetAddress> mDnsAddresses;
    // 示例:
    // IPv4 DNS: 8.8.8.8, 8.8.4.4
    // IPv6 DNS: 2001:4860:4860::8888
    
    private List<InetAddress> mGateways;
    // 示例:
    // IPv4 网关: 10.0.2.1
    // IPv6 网关: fe80::1
    
    private int mMtu;      // 1500 字节(典型)
    private int mMtuV4;    // IPv4 特定 MTU
    private int mMtuV6;    // IPv6 特定 MTU
}

2.3 LinkProperties 构建

// 在 DataNetwork.java 中处理
public void processSetupDataCallResponse(DataCallResponse response) {
    LinkProperties linkProperties = new LinkProperties();
    
    // 1. 设置接口名称
    linkProperties.setInterfaceName(response.getIfname());
    
    // 2. 添加 IPv4/IPv6 地址
    for (LinkAddress address : response.getAddresses()) {
        linkProperties.addLinkAddress(address);
        // 例如:10.123.45.67/32
    }
    
    // 3. 设置 DNS 服务器
    for (InetAddress dns : response.getDnsAddresses()) {
        linkProperties.addDnsServer(dns);
        // 例如:8.8.8.8
    }
    
    // 4. 设置网关
    for (InetAddress gateway : response.getGateways()) {
        linkProperties.addRoute(new RouteInfo(gateway));
        // 例如:10.0.2.1
    }
    
    // 5. 设置 MTU
    linkProperties.setMtu(response.getMtu());
    
    // 6. 设置 HTTP 代理(如有)
    if (response.getHttpProxy() != null) {
        linkProperties.setHttpProxy(response.getHttpProxy());
    }
    
    // 更新内部状态
    mLinkProperties = linkProperties;
    updateNetworkCapabilities();
}

2.4 IP 地址类型(IPv4/IPv6)

IPv4 地址格式:
┌──────────────────────────────────┐
│ 192.168.1.100/24                 │
├──────────────────────────────────┤
│ 地址:192.168.1.100              │
│ 子网掩码:255.255.255.0            │
│ 前缀长度:24                       │
└──────────────────────────────────┘

IPv6 地址格式:
┌──────────────────────────────────┐
│ 2001:db8:1234:5678::1/64         │
├──────────────────────────────────┤
│ 地址:2001:db8:1234:5678::1      │
│ 前缀长度:64                       │
└──────────────────────────────────┘

3. 数据包路由(Packet Routing)

3.1 路由决策过程

[应用发送数据包][Socket 绑定到特定网络(可选)][操作系统查询路由表]
        ├→ 目的地址匹配
        ├→ 策略路由规则(Fwmark)
        └→ UID 规则
        ↓
[确定出接口]
        ├→ 基站无线接口(rmnet_data0 等)
        └→ 获取网关信息
        ↓
[数据链路层处理]
        ├→ ARP 解析(IPv4)
        ├→ MAC 地址填充
        └→ 链路层报头添加
        ↓
[PDCP 层(无线)]
        ├→ 数据压缩
        ├→ 加密/完整性保护
        └→ 序列号处理
        ↓
[RLC 层(无线)]
        ├→ 分段/重组
        ├→ ARQ(自动重传)
        └→ 流量控制
        ↓
[MAC 层(无线)]
        ├→ 资源分配
        ├→ 调度
        └→ HARQ
        ↓
[物理层]
        ├→ 编码调制
        └→ 天线发送
        ↓
[基站接收 → 核心网 → 互联网]

3.2 Android 中的路由表管理

// 在 RouteController.cpp 中(system_netd)
// 为网络添加接口
int RouteController::addInterfaceToPhysicalNetwork(
        unsigned netId,           // 网络 ID(例如 cellular = 0)
        const char* interface,    // 接口名称(rmnet_data0)
        Permission permission,
        const UidRangeMap& uidRangeMap,
        bool local) {
    
    // 1. 添加 IP 规则
    // ip rule add from <ip> lookup <netId>
    
    // 2. 添加路由表条目
    // ip route add default via <gateway> dev <interface> table <netId>
    
    // 3. 添加本地路由
    // ip route add local <ip>/32 dev <interface> table <netId>
    
    return 0;
}

3.3 Linux 路由表示例

对于 IP 地址 10.123.45.67,连接到 rmnet_data0,网关 10.0.2.1

# 主路由表(table 254)
10.0.2.0/24 dev rmnet_data0 proto kernel scope link src 10.123.45.67

# 运营商特定路由表(table 261)
default via 10.0.2.1 dev rmnet_data0 table 261
10.123.45.0/24 dev rmnet_data0 proto kernel scope link src 10.123.45.67 table 261

# 策略规则
from 10.123.45.67 lookup 261

3.4 数据包流经路径

┌─────────────────────────────────────────────────────────┐
│              应用层(HTTP/HTTPS/DNS 等)                  │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│           传输层(TCP/UDP)端口号处理                      │
│ 源端口: 12345, 目的端口: 80 (HTTP)                      │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│          网络层(IPv4/IPv6)路由查询                      │
│ 源地址: 10.123.45.67                                    │
│ 目的地址: 93.184.216.34 (example.com)                  │
│ 根据路由表选择 rmnet_data0 作为出接口                    │
│ 获取网关地址 10.0.2.1                                   │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│         链路层(ARP/MAC)地址解析                        │
│ ARP 查询:谁有 10.0.2.1?                               │
│ 获得网关 MAC 地址(例如 AA:BB:CC:DD:EE:FF)            │
│ 填充链路层报头:源 MAC/目的 MAC/EtherType             │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│            PDCP 层(Packet Data Convergence Protocol)   │
│ 数据压缩(可选)                                        │
│ 加密(使用 KUPenc)                                     │
│ 完整性保护(使用 KUPint)                               │
│ 添加 PDCP 序列号                                       │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│            RLC 层(Radio Link Control)                 │
│ 分段(Large packet → RLC PDUs)                        │
│ 重组(Reassembly)                                    │
│ 添加 RLC 报头(SN, polling bit)                      │
│ ARQ 处理(确认、重传)                                 │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│              MAC 层(Medium Access Control)             │
│ 资源分配(PUSCH 资源)                                 │
│ 优先级队列管理                                         │
│ HARQ 实体(混合自动重传)                             │
│ 添加 MAC 报头和子报头                                 │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│              物理层(Physical Layer)                    │
│ 信道编码(Turbo/Polar)                                │
│ 调制(QPSK/16QAM/64QAM)                              │
│ 预编码(Precoding)                                   │
│ 多天线处理(MIMO)                                    │
│ 时域/频域资源映射                                     │
│ 无线电模块发送                                        │
└─────────────────────────────────────────────────────────┘
                        ↓
        ┌─ UE 天线 ─┐
        │  │  │  │   │
        │  └──┬──┘   │
        │     ↓      │
        │  [基站]     │
        │     ↑      │
        │  接收和处理  │
        └────────────┘
                        ↓
            [核心网 - MME/S-GW/P-GW]
                        ↓
                    [互联网]

3.5 策略路由(Policy-Based Routing)

不同应用可能通过不同网络:

┌─────────────────┐
│  App 1 (Gmail)  │ ──→ [WiFi] ──→ 互联网
└─────────────────┘

┌─────────────────┐
│ App 2 (YouTube) │ ──→ [4G LTE] ──→ 互联网
└─────────────────┘

┌─────────────────┐
│ App 3 (VPN App) │ ──→ [VPN] ──→ 互联网
└─────────────────┘

通过 Fwmark + 策略路由实现:

# 规则
ip rule add fwmark 0x4000/0xc000 lookup 261   # 移动数据
ip rule add fwmark 0x0/0xc000 lookup 251      # WiFi

# 标记(由 netd 设置)
iptables -t mangle -A FORWARD -i wlan0 -j MARK --set-mark 0x0
iptables -t mangle -A FORWARD -i rmnet_data0 -j MARK --set-mark 0x4000

4. 完整的数据传输流程图

┌────────────────────────────────────────────────────────────────┐
│                        完整数据传输流程                           │
└────────────────────────────────────────────────────────────────┘

[用户打开浏览器访问 example.com][DNS 查询]
        ├→ DNS 客户端发送 DNS QUERY(目标:8.8.8.8:53)
        ├→ 通过默认路由选择网络(WiFiCellular)
        ├→ 数据包通过选定网络发送
        └→ 接收 DNS 响应(example.com93.184.216.34)
        ↓
[TCP 三次握手建立连接]
        ├→ SYN: UEServer (source: 10.123.45.67:12345)
        ├→ SYN-ACK: ServerUE
        └→ ACK: UEServer[HTTP 请求]
        ├→ 构造 HTTP GET 请求
        ├→ 分段为 TCP 段(典型 1460 字节)
        └→ 每个段通过数据链路发送
        ↓
[LTE 编码链路]
        ├→ TCP/IP 报头
        ├→ PDCP 加密/完整性保护
        │   ├→ 算法:EEA2 (AES-CTR)
        │   └→ 密钥:从初始附着时派生
        ├→ RLC 分段/重组
        │   ├→ 分段为 75-1600 字节 RLC PDU
        │   └→ 添加 RLC 报头
        ├→ MAC 调度
        │   ├→ 资源块分配(1-100 块,每块 180 KHz)
        │   └→ 功率控制
        ├→ 物理层编码
        │   ├→ 极化码或 Turbo 码
        │   ├→ 16QAM64QAM 调制
        │   └→ MIMO 处理(4x4 天线)
        └→ 基站转发到核心网
        ↓
[核心网处理]
        ├→ 边界网关(S-GW)
        │   └→ 通过隧道转发到 P-GW
        ├→ P-GWPacket Gateway)
        │   ├→ IP 地址翻译(NAT)
        │   ├→ 流量控制
        │   └→ DPI(深度包检查)
        └→ 互联网路由
        ↓
[互联网中的路由]
        ├→ 骨干网运营商
        ├→ 域间网关
        └→ example.com 所在数据中心
        ↓
[接收响应并回程]
        ├→ Web 服务器发送 HTTP 200 OK
        ├→ 响应被分段为多个 TCP 段
        ├→ 通过互联网返回到 P-GW
        ├→ P-GW 转发到 S-GW
        └→ S-GW 通过隧道发送到基站
        ↓
[LTE 接收和解码]
        ├→ 基站接收信号
        ├→ 物理层解码
        │   ├→ 信道估计
        │   ├→ 均衡
        │   └→ 解调/解码
        ├→ MAC 处理
        │   ├→ HARQ 反馈
        │   └→ 资源分配确认
        ├→ RLC 重组
        │   └→ 乱序 PDU 缓存
        ├→ PDCP 解密
        │   └→ 使用相同密钥解密
        └→ TCP/IP 重组
        ↓
[操作系统网络栈]
        ├→ IP 层:目的地址验证
        ├→ TCP 层:段重组、ACK 返回
        └→ Socket 缓冲区:应用可读
        ↓
[应用接收并显示]
        ├→ 浏览器收到 HTTP 响应
        ├→ HTML/CSS/JS 解析
        ├→ 图片加载(可能触发更多 PDN 连接)
        └→ 页面在屏幕上显示

5. 关键数据结构和类

5.1 DataCallResponse

// 代表 setupDataCall 的响应
public class DataCallResponse {
    private int mCid;                          // 上下文 ID
    private List<LinkAddress> mAddresses;      // IP 地址列表
    private List<InetAddress> mDnsAddresses;  // DNS 服务器
    private List<InetAddress> mGateways;      // 网关列表
    private List<InetAddress> mPcscfAddresses; // P-CSCF 地址(IMS)
    private int mMtu;                          // 最大传输单元
    private String mIfname;                    // 接口名称(rmnet_dataX)
    private @DataFailureCause int mCause;     // 失败原因代码
}

5.2 LinkProperties

// 代表网络链接属性
public class LinkProperties {
    private String mIfName;                   // 接口名称
    private List<LinkAddress> mLinkAddresses; // 地址列表
    private List<InetAddress> mDnses;        // DNS 服务器
    private List<RouteInfo> mRoutes;         // 路由表
    private InetAddress mHttpProxy;          // HTTP 代理
    private int mMtu;                        // MTU
}

5.3 NetworkCapabilities

// 网络能力描述
public class NetworkCapabilities {
    // 传输类型
    private long mTransportTypes;  // TRANSPORT_CELLULAR/WIFI/ETHERNET
    
    // 网络类型
    private long mNetworkTypes;   // NET_CAPABILITY_INTERNET/IMS/MMS
    
    // 速率(上/下行)
    private int mLinkUpstreamBandwidthKbps;
    private int mLinkDownstreamBandwidthKbps;
    
    // QoS 参数
    private int mSignalStrength;
    private boolean mUnmetered;
}

6. 数据路由中的关键概念

6.1 Fwmark(防火墙标记)

Fwmark 是 32 位整数,用于策略路由:

┌─────────────────────────────────────────┐
│          32 位 Fwmark 结构                │
├─────────────────────────────────────────┤
│  位 31-30: 网络类型                      │
│           00 = 未使用                    │
│           01 = WiFi                      │
│           10 = Cellular                  │
│           11 = 保留                      │
│                                         │
│  位 29-16: 运营商/VPN 标记               │
│  位 15-0: UID 标记或应用特定标记         │
└─────────────────────────────────────────┘

示例:
Cellular PDN: 0x40000000 (0x4000/0xc000 规则)
WiFi 连接: 0x00000000
VPN: 自定义标记值

6.2 MTU(最大传输单元)

典型值:
1500 字节 - 以太网/WiFi/LTE 标准
1492 字节 - PPPoE(减少 8 字节头)
1480 字节 - VPN(减少 IPsec 头)
1452 字节 - 6to4 隧道

数据包超过 MTU 时的处理:
[大数据包 1600 字节]
        
[分片为两个小包]
        ├→  1: 1500 字节 + IP 报头 (20字节 IPv4)
        └→  2: 100 字节 + IP 报头 + 标记为"更多分片"

7. 性能优化与故障排查

7.1 常见问题

问题 1:数据连接建立失败
原因:
- APN 配置错误
- 网络不支持数据服务
- SIM 卡没有数据套餐
- 网络拥塞

排查:
- 检查 APN 设置(设置 → 移动网络 → APN)
- 查看系统日志中的 DataNetworkController 错误
- 验证运营商支持

问题 2:数据速率慢
原因:
- 信号弱
- 网络拥塞
- 不支持新技术(5G/LTE)
- 缓冲区溢出

优化:
- 小区重选到信号强的基站
- 使用 5G 技术
- 增加 TCP 缓冲区大小
- 启用 QoS 优先级

现在我已经为你详细讲解了 Android 数据传输的完整机制。关键要点包括:

PDN 建立通过 setupDataCall 创建逻辑连接
IP 分配通过 DHCP 或 PCO 获取地址
路由决策基于目的地址和策略规则
数据编码经过多层处理(PDCP/RLC/MAC/PHY)
基站转发通过核心网到互联网

现在让我更新 TODO,然后为你提供一个整合性的总结:


综合总结:Android Cellular 网络通信完整过程

现在让我为你总结整个 Android 移动网络通信的完整生命周期:

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃         Android 移动网络通信完整阶段(Phase Summary)       ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

【第一阶段:网络搜索与选择】
╔════════════════════════════════════════════════════════╗
║ 1. Modem 通过天线搜索基站
║    - 扫描所有可用频段(2G/3G/4G/5G)
║    - 计算接收信号强度(RSSI)
║    - 读取小区信息(MCC/MNC, LAC, CID)
║
║ 2. 小区选择算法
║    - 优先选择 Home PLMN(家网络)
║    - 否则选择 Preferred PLMN
║    - 最后选择任意可用网络
║
║ 3. 重选机制(持续)
║    - 信号变弱 → 切换到更优小区
║    - 更优网络出现 → 迁移注册
║
║ Android ServiceStateTracker 与 Modem 交互:
║    - 定期调用 pollState()
║    - 获取 CS/PS 注册状态
║    - 更新 ServiceState 并广播
╚════════════════════════════════════════════════════════╝

【第二阶段:网络注册与鉴权】
╔════════════════════════════════════════════════════════╗
║ 1. RRC 连接建立
║    - RANDOM ACCESS(随机接入)
║    - RRC CONNECTION REQUEST
║    - 获取 SIB(系统信息块)信息
║
║ 2. EPS/NR 附着过程
║    - 发送 ATTACH REQUEST
║      - 包含 IMSI/GUTI(关键字)
║      - PDN 连接请求
║    - 状态转换
║      - NOT_REGISTERED_SEARCHING → 搜索中
║      - REGISTRATION_STATE_HOME/ROAMING → 已注册
║      - REGISTRATION_STATE_DENIED → 被拒绝
║
║ 3. 鉴权与安全协商
║    - 挑战-响应:RAND/AUTN → RES/XRES/CK/IK
║    - 密钥派生:Kasme(EPS)/ K_ausf(5G)
║    - 算法协商:加密(EEA1/2/3)& 完整性(EIA1/2/3)
║    - NAS 安全活动:启用加密/完整性保护
║
║ 4. 核心网响应
║    - ATTACH ACCEPT
║      - 分配 GUTI
║      - 分配 TAI 列表(跟踪区)
║      - 启动定期附着定时器(T3412)
║    - ATTACH COMPLETE
║      - UE 确认
║
║ Android 状态更新:
║    - ServiceState: REGISTRATION_STATE_HOME/ROAMING
║    - 广播 ACTION_SERVICE_STATE_CHANGED Intent
╚════════════════════════════════════════════════════════╝

【第三阶段:PDN 连接建立与 IP 分配】
╔════════════════════════════════════════════════════════╗
║ 1. PDN 连接请求
║    - 应用程序需要数据连接
║    - ConnectivityService 请求网络
║    - DataNetworkController 选择 APN
║
║ 2. setupDataCall 过程
║    - 参数:APN、协议(IPv4/IPv6)、QoS 等
║    - Modem 建立无线承载(EPS Bearer / PDU Session)
║      - 资源分配
║      - 调度和流量控制
║    - 链接属性返回
║
║ 3. IP 地址分配
║    - IPv4:DHCP DISCOVER → OFFER → REQUEST → ACK
║    - IPv6:SLAAC(无状态自动配置)
║    - 获得信息:
║      - IP 地址(IPv4/IPv6)
║      - DNS 服务器
║      - 网关地址
║      - MTU(最大传输单元)
║
║ 4. LinkProperties 构建与注册
║    - 构建 LinkProperties 对象
║    - 创建 TelephonyNetworkAgent
║    - 向 ConnectivityService 注册
║    - 系统启用该网络用于数据传输
╚════════════════════════════════════════════════════════╝

【第四阶段:数据传输】
╔════════════════════════════════════════════════════════╗
║ 1. 应用层数据生成
║    - HTTP 请求、DNS 查询、邮件 等
║
║ 2. 网络栈处理
║    Socket → TCP/UDP → IP → MAC → 链路层
║
║ 3. 操作系统路由决策
║    - 查询路由表
║    - 应用 Fwmark 标记
║    - 应用 UID 规则
║    - 选择出接口(rmnet_data0 等)
║
║ 4. 移动网络编码链(LTE 示例)
║    应用数据(HTTP)
║       ↓
║    TCP/IP 报头添加
║       ↓
║    PDCP(Packet Data Convergence Protocol)
║      - 数据压缩(可选)
║      - 加密(EEA2: AES-CTR)
║      - 完整性保护(EIA2: AES-MAC)
║      - 序列号
║       ↓
║    RLC(Radio Link Control)
║      - 分段(大包 → RLC PDU)
║      - ARQ 处理(自动重传)
║      - 序列号
║       ↓
║    MAC(Medium Access Control)
║      - 资源分配(PUSCH)
║      - 队列优先级
║      - HARQ(混合 ARQ)
║       ↓
║    物理层(Physical)
║      - 信道编码(Polar / Turbo)
║      - 调制(QPSK / 16QAM / 64QAM)
║      - 预编码
║      - MIMO 处理
║      - RF 发送
║
║ 5. 无线传输
║    基站接收 → 解调解码 → 转发到核心网
║
║ 6. 核心网处理
║    S-GW(Serving Gateway):隧道转发
║    P-GW(Packet Gateway):IP 翻译、路由
║
║ 7. 互联网路由
║    通过 BGP、IGP 等协议路由到目标服务器
║
║ 8. 回程过程(响应数据)
║    互联网 → 核心网 → 基站 → UE
║       ↓
║    物理层解码
║    MAC 处理(HARQ 反馈)
║    RLC 重组
║    PDCP 解密
║    TCP/IP 重组
║       ↓
║    应用收到数据
╚════════════════════════════════════════════════════════╝

关键架构组件总览

组件职责对应文件
ServiceStateTracker网络注册状态跟踪ServiceStateTracker.java
DataNetworkController数据网络生命周期管理DataNetworkController.java
DataNetwork单个 PDN 的状态机DataNetwork.java
DataServiceManagerModem 数据服务接口DataServiceManager.java
TelephonyNetworkAgentConnectivityService 集成TelephonyNetworkAgent.java
RouteController内核路由管理RouteController.cpp
Netd网络守护进程System Netd 服务
Modem硬件无线模块RIL 层接口

Android 框架层次

┌─────────────────────────────────────────────────┐
│          应用程序(App)                         │
│   (浏览器、邮件、社交媒体等)                  │
└────────────────┬────────────────────────────────┘
                 ↓
┌─────────────────────────────────────────────────┐
│      ConnectivityService(连接服务)            │
│   - 管理所有网络请求                           │
│   - 网络优选                                   │
│   - NetworkAgent 注册                         │
└────────────┬──────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│      TelephonyManager / TelephonyCallback      │
│   - 提供应用 API                              │
│   - 监听状态变化                              │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│     Phone / GsmCdmaPhone / DataNetworkCtrl    │
│   - 电话管理                                 │
│   - 数据网络管理                             │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│     INetd(Binder 接口)                      │
│   - 与 netd 守护进程通信                      │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│          netd(Native)                       │
│   - iptables / netfilter 管理                 │
│   - 路由表管理                               │
│   - DNS 解析                                │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│      Linux Kernel                             │
│   - 网络协议栈(TCP/UDP/IP)                 │
│   - 路由表和策略路由                         │
│   - 网络接口管理                            │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│       HAL / RIL(Radio Interface Layer)      │
│   - Modem 命令序列                           │
│   - setupDataCall / pollState 等             │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│      Modem(基带处理器 - Qualcomm/MTK)       │
│   - LTE/5G 协议栈                           │
│   - 加密/解密                              │
│   - 编码/调制                              │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│      基站(eNodeB/gNodeB)                    │
│   - 无线信号发送/接收                        │
│   - 资源调度                                 │
└────────────┬─────────────────────────────────┘
             ↓
┌────────────────────────────────────────────────┐
│    核心网(MME/S-GW/P-GW 或 AMF/UPF)        │
│   - 会话管理                                 │
│   - 数据转发                                 │
└────────────┬─────────────────────────────────┘
             ↓
          互联网

核心面试知识点总结

1. 小区选择与重选

  • 选择标准:Home PLMN > Preferred PLMN > Any PLMN
  • 重选触发:信号变弱、更优网络出现、小区禁用
  • Android 实现:ServiceStateTracker 定期 pollState()

2. 鉴权与加密

  • 协议:EAP-AKA(LTE)/ EAP-SIM(2G/3G)
  • 密钥派生:Kasme(EPS)分派生为 KNASenc、KNASint、Kenb
  • 算法:加密 EEA1/2/3(SNOW/AES/ZUC)、完整性 EIA1/2/3
  • 实现:USIM 卡计算,Android 通过 getIccAuthentication() 调用

3. 核心网注册

  • 附着过程:ATTACH REQUEST → 鉴权 → 安全协商 → ATTACH ACCEPT
  • 状态机:NOT_REGISTERED → SEARCHING → HOME/ROAMING/DENIED
  • 失败处理:IMSI_UNKNOWN、PLMN_NOT_ALLOWED、NETWORK_FAILURE 等
  • Android 状态:NetworkRegistrationInfo 维护,通过 Intent 广播

4. PDN 建立

  • 参数:APN、协议(IPv4/IPv6/IPV4V6)、QoS、流量描述符
  • 响应:LinkAddress(IP)、DNS、网关、MTU
  • 多 PDN:Internet(默认)、IMS(语音)、MMS(彩信)等

5. IP 地址分配

  • IPv4:DHCP 获取
  • IPv6:SLAAC 自动配置
  • LinkProperties 更新所有网络参数

6. 数据路由

  • 决策:目的地址 → 路由表查询 → 出接口 → 网关
  • Fwmark:策略路由实现多网络隔离
  • 协议栈:PDCP → RLC → MAC → PHY

让我标记最后一个 TODO 为完成:


总结

我已经为你详细讲解了 Android 移动网络通信的完整三个阶段:

第一阶段:网络注册与附着

  • 小区选择与重选:Modem 通过信号强度、网络优先级选择和重选基站
  • 鉴权与加密:USIM 使用 EAP-AKA 进行身份验证,派生密钥进行加密/完整性保护
  • 核心网注册:UE 与 MME 完成附着握手,获得 GUTI 和位置更新定时器

第二阶段:PDN 连接与 IP 分配

  • PDN 建立:setupDataCall 创建 EPS Bearer/PDU Session
  • IP 地址分配:DHCP 获取 IPv4 或 SLAAC 获取 IPv6
  • LinkProperties:收集所有网络配置并向 ConnectivityService 注册

第三阶段:数据传输

  • 网络栈路由:根据目的地址、Fwmark、UID 规则选择网络
  • 编码链处理:应用数据 → PDCP(加密)→ RLC(重组)→ MAC(调度)→ PHY(调制)
  • 基站转发:通过核心网 P-GW 路由到互联网

所有这些过程都通过 Android 框架中的 ServiceStateTrackerDataNetworkControllerDataNetwork 等关键类来管理和协调,最终通过 ConnectivityService 为应用程序提供网络服务。

这是面试中非常重要的知识点,涵盖了从硬件(Modem)到应用层的完整网络通信堆栈!