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)
├→ 通过默认路由选择网络(WiFi 或 Cellular)
├→ 数据包通过选定网络发送
└→ 接收 DNS 响应(example.com → 93.184.216.34)
↓
[TCP 三次握手建立连接]
├→ SYN: UE → Server (source: 10.123.45.67:12345)
├→ SYN-ACK: Server → UE
└→ ACK: UE → Server
↓
[HTTP 请求]
├→ 构造 HTTP GET 请求
├→ 分段为 TCP 段(典型 1460 字节)
└→ 每个段通过数据链路发送
↓
[LTE 编码链路]
├→ TCP/IP 报头
├→ PDCP 加密/完整性保护
│ ├→ 算法:EEA2 (AES-CTR)
│ └→ 密钥:从初始附着时派生
├→ RLC 分段/重组
│ ├→ 分段为 75-1600 字节 RLC PDU
│ └→ 添加 RLC 报头
├→ MAC 调度
│ ├→ 资源块分配(1-100 块,每块 180 KHz)
│ └→ 功率控制
├→ 物理层编码
│ ├→ 极化码或 Turbo 码
│ ├→ 16QAM 或 64QAM 调制
│ └→ MIMO 处理(4x4 天线)
└→ 基站转发到核心网
↓
[核心网处理]
├→ 边界网关(S-GW)
│ └→ 通过隧道转发到 P-GW
├→ P-GW(Packet 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 |
| DataServiceManager | Modem 数据服务接口 | DataServiceManager.java |
| TelephonyNetworkAgent | ConnectivityService 集成 | 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 框架中的 ServiceStateTracker、DataNetworkController、DataNetwork 等关键类来管理和协调,最终通过 ConnectivityService 为应用程序提供网络服务。
这是面试中非常重要的知识点,涵盖了从硬件(Modem)到应用层的完整网络通信堆栈!