1. 小区选择与重选(Cell Selection and Reselection)
1.1 小区选择的目的
小区选择是 UE(用户设备)主动搜索并选择一个基站的过程,使其可以:
- 建立无线接入:在该基站覆盖的小区内通信
- 获取服务:访问公众陆地移动网络(PLMN)
- 完成注册:向网络注册身份
1.2 选择标准(3GPP TS 36.304)
在 Android 中,小区选择遵循以下标准:
优先级顺序:
1. 已注册过的主网络 (Home PLMN)
2. 已注册过的漫游网络 (Preferred/Acceptable PLMN)
3. 其他可用网络 (Any PLMN with Emergency Services)
选择条件:
- 信号强度:Rx 电平 > 阈值(典型为 -140 dBm)
- 信号质量:参考信号接收功率(RSRP)
- 小区可用性:Barred Cell 的检查
1.3 重选机制(Reselection)
重选触发条件:
1. 信号变弱:当前小区信号低于目标小区(相对偏置)
2. 更优网络出现:HPLMN/OPLMN 变得可用
3. 小区禁用:当前小区被禁止
4. 网络选择模式改变:手动 → 自动选择
重选流程:
UE 定期扫描邻近小区 → 计算重选优先级
→ 符合重选条件则从当前小区重选到新小区
→ 完成新小区的同步与获取 SI 信息
1.4 Android ServiceStateTracker 实现
// 在 ServiceStateTracker.java 中
public class ServiceStateTracker extends Handler {
// 服务状态轮询
public void pollState() {
mPollingContext = new int[1];
mPollingContext[0] = 0;
// 查询 CS(Circuit Switched)语音注册状态
mCi.getVoiceRegistrationState(obtainMessage(EVENT_POLL_STATE_CS_CELLULAR_REGISTRATION));
// 查询 PS(Packet Switched)数据注册状态
mCi.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_PS_CELLULAR_REGISTRATION));
}
}
关键注册点:
EVENT_POLL_STATE_CS_CELLULAR_REGISTRATION:CS 域注册状态EVENT_POLL_STATE_PS_CELLULAR_REGISTRATION:PS 域注册状态EVENT_POLL_STATE_PS_IWLAN_REGISTRATION:IWLAN PS 注册状态
1.5 网络选择模式
自动模式(Automatic Selection):
- Modem 搜索最优网络并自动选择
- 在 Android 中通过 setNetworkSelectionModeAutomatic() 调用
手动模式(Manual Selection):
- 用户手动选择网络运营商
- 通过 setNetworkSelectionModeManual(operatorNumeric, ran) 调用
- operatorNumeric: MCC+MNC,如 "310170"(Verizon USA)
2. 鉴权与加密(Authentication and Encryption)
2.1 鉴权过程概述
UE 侧流程:
UE → 基站/MME:发送 ATTACH REQUEST(包含 IMSI/GUTI)
↓
UE ← 基站/MME:收到 AUTHENTICATION REQUEST(challenge)
↓
UE 调用 USIM 卡:计算响应
- EAP-AKA(LTE)
- EAP-SIM(2G/3G)
↓
UE → 基站/MME:发送 AUTHENTICATION RESPONSE
↓
UE ← 基站/MME:验证成功 → 分配密钥
2.2 Android 中的鉴权实现
在 TelephonyManager.java 中定义了几种鉴权类型:
// 鉴权类型定义
public static final int AUTHTYPE_EAP_SIM = 0; // RFC 4186
public static final int AUTHTYPE_EAP_AKA = 1; // RFC 4187
public static final int AUTHTYPE_GBA_BOOTSTRAP = 2; // GBA BSF
public static final int AUTHTYPE_GBA_NAF_KEY_EXTERNAL = 3; // GBA NAF
// 获取 ICC 鉴权响应
public String getIccAuthentication(int subId, int appType,
@AuthType int authType, String data) {
// 调用 USIM/SIM 应用进行鉴权计算
IPhoneSubInfo info = getSubscriberInfoService();
return info.getIccSimChallengeResponse(subId, appType, authType, data,
getOpPackageName(), getAttributionTag());
}
2.3 LTE 鉴权详解(EAP-AKA)
步骤:
1. Challenge:RAND(32 bits)+ AUTN(128 bits)
2. USIM 验证:
- 计算 f1(K, RAND) → XRES(预期响应)
- 计算 f2(K, RAND) → RES(实际响应)
- 计算 f3(K, RAND) → CK(密文密钥)
- 计算 f4(K, RAND) → IK(完整性密钥)
3. Response:RES(RES || IK || CK)
4. 密钥派生:
- CK + IK → KEY(L = 32 bytes)
- KEY → Kasme(用于 LTE 安全)
- Kasme → {KNASenc, KNASint, K_enb}(NAS 加密、完整性、RRC 密钥)
2.4 加密与完整性保护
NAS 层保护(EPS/5GS):
- 加密算法:EEA0(无), EEA1(SNOW 3G), EEA2(AES), EEA3(ZUC)
- 完整性算法:EIA0(无), EIA1(SNOW 3G), EIA2(AES), EIA3(ZUC)
RRC 层保护:
- 加密:PDCP-C-Plane 加密
- 完整性:RLC-CRLC 完整性保护
数据传输层保护:
- IPsec(安全关联 SA 处理)
3. 核心网注册(Core Network Registration)
3.1 注册过程状态机
在 NetworkRegistrationInfo.java 中定义的注册状态:
public static final int REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING = 0;
public static final int REGISTRATION_STATE_HOME = 1;
public static final int REGISTRATION_STATE_NOT_REGISTERED_SEARCHING = 2;
public static final int REGISTRATION_STATE_DENIED = 3;
public static final int REGISTRATION_STATE_UNKNOWN = 4;
public static final int REGISTRATION_STATE_ROAMING = 5;
public static final int REGISTRATION_STATE_EMERGENCY = 6;
状态转换流程:
初始态:NOT_REGISTERED_OR_SEARCHING
↓ 寻找网络
搜索中:NOT_REGISTERED_SEARCHING
├→ 成功 → 注册状态
│ ├→ 家网络:HOME
│ ├→ 漫游网络:ROAMING
│ └→ 紧急模式:EMERGENCY
├→ 被拒绝 → DENIED(原因在 reasonForDenial)
└→ 超时 → UNKNOWN
3.2 EPS 附着过程(LTE)
UE MME
| |
|──── ATTACH REQUEST ──────────────────>|
| (Type: Initial/Handover/ |
| TAU Update, GUTI/IMSI) |
| |
|<──── IDENTITY REQUEST ─────────────__|
| (if needed for authentication) |
| |
|──── IDENTITY RESPONSE ───────────────>|
| |
|<──── AUTHENTICATION REQUEST ────────|
| (RAND, AUTN) |
| |
|──── AUTHENTICATION RESPONSE ────────>|
| (RES, RES*, AUTN validation) |
| |
|<──── SECURITY MODE COMMAND ────────|
| (NAS integrity/cipher config) |
| |
|──── SECURITY MODE COMPLETE ────────>|
| (Protected with new algorithms) |
| |
|<──── ATTACH ACCEPT ────────────────|
| (EPS Bearer Context, TAI List, |
| TAU Timer, Authorized PLMN) |
| |
|──── ATTACH COMPLETE ─────────────────>|
| |
3.3 Android 层处理
// 在 GsmCdmaPhone.java 中处理注册事件
public class GsmCdmaPhone extends Phone {
private void handleAttachmentChange() {
// 检查 PS 域注册状态
NetworkRegistrationInfo psRegInfo =
getServiceState().getNetworkRegistrationInfo(
NetworkRegistrationInfo.DOMAIN_PS,
AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
if (psRegInfo != null) {
int regState = psRegInfo.getNetworkRegistrationState();
if (regState == NetworkRegistrationInfo.REGISTRATION_STATE_HOME ||
regState == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING) {
// 已附着
notifyNetworkAttached();
} else {
// 未附着
notifyNetworkDetached();
}
}
}
}
3.4 注册失败处理
// 注册被拒绝原因(TS 24.008 Annex H)
public enum RegistrationFailCause {
IMSI_UNKNOWN_IN_HLR(2), // SIM 不被网络认可
ILLEGAL_MS(3), // 非法 MS
IMEI_NOT_ACCEPTED(5), // IMEI 被拒绝
ILLEGAL_ME(6), // 非法 ME
GPRS_SERVICES_NOT_ALLOWED(7), // 不允许 GPRS 服务
PLMN_NOT_ALLOWED(11), // PLMN 不允许
LA_NOT_ALLOWED(12), // 位置区不允许
NO_SUITABLE_CELLS(15), // 无合适小区
NETWORK_FAILURE(17), // 网络故障
CONGESTION(22), // 网络拥塞
SERVICE_OPTION_NOT_SUPPORTED(32), // 不支持的服务选项
SERVICE_OPTION_NOT_SUBSCRIBED(33), // 未订购的服务选项
SERVICE_OPTION_TEMPORARILY_OUT_OF_ORDER(34), // 服务选项暂时不可用
CALL_CANNOT_BE_IDENTIFIED(38), // 无法识别调用
}
处理策略:
IMSI_UNKNOWN_IN_HLR(错误 #2)
→ 向用户显示通知
→ 设置 IMSI 为无效
→ 禁用数据(如果配置)
PLMN_NOT_ALLOWED(错误 #11)
→ 将 PLMN 添加到禁止列表
→ 切换到其他可用 PLMN
NETWORK_FAILURE(错误 #17)
→ 触发指数级退避重试
→ 根据配置选择重试间隔(通常 5s, 10s, 30s 等)
3.5 Attach Type(EPS 附着类型)
在 EutranRegistrationInfo.java 中定义:
enum AttachResultType {
NONE, // 无附着
EPS_ONLY, // 仅 PS(数据)附着
COMBINED, // CS(语音)+ PS(数据)组合附着
}
影响:
EPS_ONLY:仅可使用数据业务(VoLTE/VoWiFi)COMBINED:可使用 CS 语音 + PS 数据(Fallback)
4. 完整的网络注册与附着流程图
┌─────────────────────────────────────────────────────────────────┐
│ 网络注册与附着完整流程 │
└─────────────────────────────────────────────────────────────────┘
[开机/飞行模式关闭]
↓
[Radio 打开]
↓
[Modem 搜索基站]
├→ 扫描频段
├→ 计算小区信号强度(RSSI)
└→ 读取小区信息(MCC/MNC, LAC, CI)
↓
[小区选择算法]
├→ 优先选择 Home PLMN
├→ 或 Preferred PLMN
└→ 否则选择任意可用 PLMN
↓
[建立 RRC 连接]
├→ RANDOM ACCESS(随机接入)
├→ RRC CONNECTION REQUEST
├→ RRC CONNECTION SETUP
└→ RRC CONNECTED 态
↓
[SIB 获取(系统信息块)]
├→ SIB1:PLMN ID, TAC, CSG 信息
├→ SIB2:RACH 配置, SIBx 调度
└→ SIB3-13:邻近小区, 漫游规则等
↓
[NAS 流程 - ATTACH]
├→ ATTACH REQUEST
│ (IMSI or GUTI, PDN connectivity request)
├→ 鉴权(AUTHENTICATION)
│ ├→ MME → UE: RAND, AUTN
│ ├→ UE 计算:XRES, RES, CK, IK
│ └→ 派生 NAS/RRC 密钥
├→ NAS 安全协商(SECURITY MODE)
│ ├→ 协商加密算法(EEA1/2/3)
│ ├→ 协商完整性算法(EIA1/2/3)
│ └→ 激活 NAS 加密/完整性保护
├→ ATTACH ACCEPT
│ ├→ 分配 GUTI(关键字)
│ ├→ TAI List(跟踪区)
│ ├→ PDN 连接建立
│ └→ T3412(定期附着定时器)
└→ ATTACH COMPLETE
↓
[PS 域数据连接建立]
├→ ACTIVATE DEFAULT EPS BEARER(默认承载)
├→ 分配 IP 地址(DHCPv4 或 DHCPv6)
├→ 配置 PGW/UPF 地址
└→ 承载质量(QoS)参数
↓
[状态更新 - Android 层]
├→ ServiceState: REGISTRATION_STATE_HOME/ROAMING
├→ DataRegistrationState: IN_SERVICE
├→ 广播 Intent: ACTION_SERVICE_STATE_CHANGED
├→ 通知 ConnectivityService
└→ 启用数据业务
↓
[持续监控]
├→ 信号变弱 → 小区重选
├→ 更优网络出现 → 切换
├→ 定期位置更新(TAU)
└→ 周期性附着(T3412 定时器)
5. 关键数据结构
5.1 ServiceState
public class ServiceState {
private int mVoiceRegState; // CS 语音注册状态
private int mDataRegState; // PS 数据注册状态
private int mChannelAccessType; // 接入网类型
private List<NetworkRegistrationInfo> mNetworkRegistrationInfos;
// 其他:运营商名称, LAC, CID, RoamingType 等
}
5.2 NetworkRegistrationInfo
public class NetworkRegistrationInfo {
private int mDomain; // DOMAIN_CS/PS
private int mTransportType; // WWAN/WLAN
private int mNetworkRegistrationState; // 注册状态
private int mAccessNetworkTechnology; // 网络类型(LTE/NR 等)
private int mReasonForDenial; // 被拒绝原因代码
private CellIdentity mCellIdentity; // 小区信息
private int mNrState; // NR 连接状态(EN-DC)
}
5.3 CellIdentity(小区标识)
// 不同网络类型的具体实现
public abstract class CellIdentity {
protected int mMcc, mMnc;
}
// LTE
public class CellIdentityLte extends CellIdentity {
int mCi; // E-UTRAN Cell ID (28 bits)
int mPci; // Physical Cell ID (0-503)
int mTac; // Tracking Area Code
}
// NR 5G
public class CellIdentityNr extends CellIdentity {
long mNrArfcn; // NR-ARFCN(频点号)
int mPci; // Physical Cell ID
int mTac; // Tracking Area Code (13 bits)
}
6. 常见问题与优化
6.1 注册失败处理
问题:频繁注册失败或注册很慢
原因分析:
1. 信号太弱:切换到其他小区
2. SIM/USIM 卡问题:重新插拔或更换
3. 网络运营商问题:稍后重试或切换运营商
4. 鉴权失败:USIM 安全参数错误
5. 网络拥塞:指数级退避重试
优化策略:
- 信号强度检测 + 预测性切换
- 黑名单管理(禁止 PLMN)
- 智能重试算法
- 信息缓存(TAI List, PLMN 列表)
6.2 性能优化
1. 快速附着(Fast Attach)
- 使用 GUTI 而非 IMSI
- 缓存上一次的 PLMN
- 预先加载 SIB 信息
2. 功耗优化
- 定期附着定时器调整
- 小区重选扫描周期优化
- Idle 模式信号强度报告
3. 数据连接建立
- 默认承载与专用承载区分
- VoLTE 优先级设置
7. 3GPP 标准参考
- TS 24.301:EPS NAS 规范(附着、鉴权、安全)
- TS 36.304:LTE RRC 小区选择与重选
- TS 33.401:EPS 安全体系结构
- TS 33.102:3G 安全体系结构(USIM 鉴权)
- TS 31.102:UICC 文件结构(鉴权数据存储)
这就是 Android Modem 网络注册与附着的完整机制。关键要点包括:
✅ 小区选择基于信号强度、优先级和网络可用性
✅ 鉴权过程使用 USIM 卡的密钥派生算法(EAP-AKA/EAP-SIM)
✅ 核心网注册涉及复杂的状态机和安全协商
✅ Android 框架通过 ServiceStateTracker 和 NetworkRegistrationInfo 管理所有这些状态
有任何关于具体实现细节的问题吗?