第一阶段:附着(Attach)
1. 控制面流程
UE 基站(eNodeB/gNodeB) 核心网(MME/AMF)
│
├─ RRC Connection Setup ─→ eNodeB ─────────────────────→ MME/AMF
│ (SIB 信息)
│
├─ NAS Attach Request ───→ eNodeB ─────────────────────→ MME/AMF
│ (IMSI/GUTI + 功能) (附着请求+鉴权)
│
├─ Authentication ───────→ eNodeB ─────────────────────→ UE
│ (Challenge: RAND+AUTN)
│
├─ Auth Response ────────→ eNodeB ─────────────────────→ MME/AMF
│ (RES) (验证成功)
│
├─ Security Commands ───→ UE (激活密钥)
│
└─ Attach Accept ────────→ UE (临时标识P-TMSI/GUTI + VoLTE能力)
关键代码位置:
// 附着结果类型(3GPP TS 24.301)
DataSpecificRegistrationInfo.java:
- LTE_ATTACH_TYPE_EPS_ONLY = 1 // 仅EPS附着
- LTE_ATTACH_TYPE_COMBINED = 2 // 组合附着(PS+CS)
// Android获取附着信息
EutranRegistrationInfo.aidl:
AttachResultType:
- EPS_ONLY // 仅数据面
- COMBINED // 数据+语音
LteVopsInfo:
- isVopsSupported // VoLTE能力
- isEmcBearerSupported // 紧急承载
AttachResultType 的含义:
| 类型 | 说明 | 应用场景 |
|---|---|---|
| EPS_ONLY | 附着到LTE EPS domain | 数据专网(5G NSA/SA、LTE Category M) |
| COMBINED | 附着到LTE+2G/3G | CSFB场景(VoLTE不可用时)、SMS场景 |
附着中的关键参数:
// 来自核心网(MME/AMF)的附着接受消息
AttachAccept {
P-TMSI / 5G-GUTI // 临时标识(用于后续寻呼)
EPS network feature support // VoPS/EMC BS标志
ESM Information Container // ESM消息(包含默认承载参数)
TAI List // 允许的TA列表
Equivalent PLMNs // 等效PLMN
}
第二阶段:默认承载建立(Default Bearer Setup)
ESM(EPS Session Management)层的默认承载激活
附着过程必然伴随默认承载建立。这是 EPS 的强制特性。
UE RAN(eNodeB) 核心网(S-GW/PGW/UPF)
│
├─ Attach Accept 含 ESM
│ (含默认Bearer参数)
│
├─ Activate Default EPS Bearer Context Request
│ (EPS Bearer ID #5, QCI, APN, IP)
│
├─ RRC Connection Reconfiguration ────→ 分配无线承载资源
│ (DRB#1 with AMBR/MBR QoS)
│
├─ Activate Default EPS Bearer Context Accept ─→ 完成
│
└─ IP Address Allocation
从PGW/UPF获取:
- IPv4: 10.x.x.x(DHCP或静态)
- IPv6: /64前缀 (SLAAC)
Android中的相应代码:
// 数据承载生命周期状态机(DataNetwork.java)
DataNetwork.java:
ConnectingState → setupData() → DataServiceManager.setupDataCall()
// 传递的参数
DataProfile {
apn // "internet", "IMS", "MMS" 等
protocol // IPV4, IPV6, IPV4V6
authType // PAP, CHAP, PAP_CHAP
roamingProtocol
}
SetupDataCallRequest {
accessNetwork: EUTRAN/NGRAN
dataProfile
isModemCognitive
roamingAllowed
}
默认承载的QoS参数(硬件接口):
// hardware_interfaces/radio/1.6/types.hal
SetupDataCallResult {
int32_t cid // Call ID(1-255)
int32_t ifname // "rmnet_data0"等
PdpProtocolType protocol // IP/IPV6/IPV4V6
string[] addresses // IP地址列表
string[] dnses // DNS服务器
string[] gateways // 默认网关
Qos defaultQos // 默认承载QoS
{
QosPdu sessionFlow {
int qfi // QoS Flow ID (5G)
int maxUplinkBitrate
int maxDownlinkBitrate
int guaranteedUplinkBitrate
int guaranteedDownlinkBitrate
}
}
vec<QosSession> qosSessions // 专网承载(可选)
int32_t pduSessionId // PDU Session ID (5G)
OptionalSliceInfo sliceInfo // 网络切片(5G)
}
EpsBearerQosSessionAttributes 的 QCI(QoS Class Indicator):
| QCI | 优先级 | 类型 | 延迟 | 丢包率 | 应用 |
|---|---|---|---|---|---|
| 1-4 | 高 | GBR | < 100ms | 10^-2 | VoLTE/视频 |
| 5 | 中高 | GBR | <100ms | 10^-6 | IMS信令 |
| 6 | 中 | GBR | <300ms | 10^-3 | 实时视频 |
| 7-9 | 低 | Non-GBR | >100ms | 10^-6 | 互联网数据 |
第三阶段:切换(Handover)
3.1 同一RAT内的切换(Intra-RAT HO)
UE(Cell A) ──→ 基站A/B ──→ 核心网(MME)
(X2切换接口)
UE发现信号差 → 测量报告(Measurement Report)
基站A决策 → 准备切换(HO Preparation)
│
├─ S1-AP: HandoverRequired (BSs in Target)
│
└─ 基站B: HandoverRequest
│
└─ 检查DRB资源是否可用
UE进行HO: SynchInTime + RRC Reconfiguration
基站B: Path Switch → MME更新UE路由
关键代码(IWLAN↔LTE切换):
// DataNetwork.java 中的Handover状态机
HandoverState {
enter() {
// 1. 通知源transport切换开始
sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE,
handoverTimeoutMs);
notifyPreciseDataConnectionState();
updateNetworkScore(keepConnectedForHandover=true);
}
processMessage(EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE) {
// 2. 在目标transport上发起setupDataCall
onStartHandover(retryEntry);
// → DataServiceManager.setupDataCall() 在目标transport上
}
// 3. 接收新transport的setupDataCall响应
processMessage(EVENT_SETUP_DATA_NETWORK_RESPONSE) {
// 切换成功,转入ConnectedState(新transport)
transitionTo(mConnectedState);
}
}
// RIL层的切换接口(IRadio.hal)
startHandover(callId) // 通知modem开始切换
cancelHandover(callId) // 取消切换
deactivateDataCall(callId, HANDOVER) // 源transport释放
3.2 数据层路由更新
当切换发生时,路由表必须更新:
# 切换前(LTE)
ip route add default via 10.0.0.1 dev rmnet_data0
ip route add 8.8.8.8/32 dev rmnet_data0
# 切换后(IWLAN)
ip route add default via 192.168.1.1 dev wlan0
ip route add 8.8.8.8/32 dev wlan0
Android中的实现:
// DataNetwork.java
mLinkProperties {
mAddresses: [192.168.1.100/32]
mRoutes: [
RouteInfo{
destination: 0.0.0.0/0
gateway: 192.168.1.1
interface: wlan0
}
]
mDnses: [8.8.8.8, 8.8.4.4]
}
// 通过NetworkAgent更新
mNetworkAgent.sendLinkProperties(mLinkProperties);
第四阶段:释放(Release)
4.1 正常释放流程
Framework决策 RIL 核心网(MME/PGW)
│ │ │
├─ tearDown() │ │
│ (TEAR_DOWN_REASON) │ │
│ │ │
├─ onTearDown() │ │
│ (invoked deactivate)│ │
│ │ │
└─ deactivateDataCall()├─ ESM: Deactivate │
│ EPS Bearer Request │
│──────────────────────→ PGW/UPF
│ 删除承载、释放IP
│
│←──────────────────────
│ Deactivate Confirm
DisconnectingState 中的优雅关闭:
DisconnectingState {
enter() {
// 设置超时(默认10秒)
sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE,
disconnectingTimeoutMs);
notifyPreciseDataConnectionState(); // 通知APP状态变化
}
processMessage(EVENT_DEACTIVATE_DATA_NETWORK_RESPONSE) {
int resultCode = msg.arg1;
if (resultCode != DataServiceCallback.RESULT_SUCCESS) {
// RIL没有及时响应,强制关闭
transitionTo(mDisconnectedState);
}
}
processMessage(EVENT_STUCK_IN_TRANSIENT_STATE) {
// 超时未完成,异常关闭
reportAnomaly("RIL did not send data call list changed...");
transitionTo(mDisconnectedState);
}
}
4.2 各类释放原因
// DataNetwork.java 中的TearDownReason
public @interface TearDownReason {}
TEAR_DOWN_REASON_NORMAL = 0
TEAR_DOWN_REASON_RADIO_SHUTDOWN = 1
TEAR_DOWN_REASON_AIRPLANE_MODE_ON = 2
TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED = 3
TEAR_DOWN_REASON_NO_LIVE_REQUEST = 4
TEAR_DOWN_REASON_VCN_REQUESTED = 5
TEAR_DOWN_REASON_SIM_REMOVED = 6
TEAR_DOWN_REASON_ROAMING_NOT_ALLOWED = 7
TEAR_DOWN_REASON_DATA_DISABLED_BY_USER = 8
TEAR_DOWN_REASON_DATA_DISABLED_BY_POLICY = 9
TEAR_DOWN_REASON_VOICE_CALL_STARTED = 10
TEAR_DOWN_REASON_SUSPEND = 11
TEAR_DOWN_REASON_HANDOVER = 12
4.3 网络资源回收
DisconnectedState {
enter() {
// 1. 释放NetworkAgent
if (mNetworkAgent != null) {
mNetworkAgent.unregister();
mNetworkAgent = null;
}
// 2. 关闭VPN策略监听
if (mVcnPolicyChangeListener != null) {
mVcnManager.removeVcnNetworkPolicyChangeListener(
mVcnPolicyChangeListener);
}
// 3. 清空Link Properties(移除路由)
mLinkProperties.clear();
// 4. 通知ConnectivityService
mDataNetworkCallback.onDisconnected(this);
// 5. 释放PDU Session ID(5G)
if (mPduSessionId > 0) {
mDataServiceManager.releasePduSessionId(mPduSessionId);
}
}
}
第五阶段:空闲检测与自动释放
空闲超时机制
// ConnectedState 中的空闲检测
private void checkIfNetworkShouldTearDown() {
if (mAttachedNetworkRequestList.isEmpty()) {
// 所有应用已释放网络请求
if (System.currentTimeMillis() - mLastActivityTime > idleTimeoutMs) {
log("Idle timeout reached, tear down network");
tearDown(TEAR_DOWN_REASON_NO_LIVE_REQUEST);
}
}
}
关键概念对标
| 概念 | 3GPP术语 | Android实现 | 作用 |
|---|---|---|---|
| Attach | EMM Attach | Modem自动 | 向核心网注册、获得临时ID |
| Default Bearer | EPS Bearer #5 | DataNetwork(Connecting) | 创建基础数据通道 |
| Dedicated Bearer | EPS Bearer #6-15 | QosSession(可选) | 低延迟/高可靠应用 |
| Handover | S1-AP/X2 HandoverRequired | HandoverState | 基站间无缝切换 |
| Release | ESM Deactivate Bearer | DisconnectingState | 回收资源 |
这就是完整的 EPS/NR承载生命周期。其中最核心的是:
- Attach→Reg = EMM层(获得GUTI)
- Default Bearer Setup = ESM层(创建#5承载)
- Handover = RAN层(基站交接)+ 路由更新
- Release = ESM层(回收资源)
希望这个深度分析能够帮助你理解Android中承载管理的全貌!