网络注册与附着

5 阅读8分钟

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 框架通过 ServiceStateTrackerNetworkRegistrationInfo 管理所有这些状态

有任何关于具体实现细节的问题吗?