好的,我们继续接续上一篇文章,对 3GPP TS 3.102 规范进行深度拆解。


深度解析 3GPP TS 31.102:4.2.16 EFFPLMN (禁用的PLMN列表)

本文技术原理深度参考了3GPP TS 31.102 V18.8.0 (2025-03) Release 18规范中,关于“4.2.16 EFFPLMN (Forbidden PLMNs)”的核心章节,旨在为读者深入揭示手机在漫游搜网过程中,是如何通过EFFPLMN这张“黑名单”来学习和记忆“此路不通”的网络,从而实现更智能、更高效的网络选择。

在之前的章节中,我们探讨了EFPLMNwAcT(用户偏好列表)和EFHPPLMN(高优网络搜索周期),这些文件共同构成了一套主动的、前瞻性的网络选择策略。然而,现实世界充满了不确定性。有时,即使一个网络在用户的“愿望清单”上,实际的接入尝试也可能因为各种原因而失败。

想象一下,我们的主角“李想”带着他的手机去了一个新的国家。手机根据EFPLMNwAcT的指示,兴高采烈地去尝试连接当地的A运营商网络,但网络却冷酷地拒绝了它,返回了一个“PLMN not allowed”(PLMN不允许接入)的拒绝原因码。这可能是因为李想的归属运营商与A运营商没有签订漫游协议。

如果手机“记性不好”,在下一次自动搜网时,它可能又会去徒劳地尝试连接A网络,浪费了宝贵的时间和电量。为了避免这种“好了伤疤忘了疼”的低效行为,3GPP设计了一套“失败学习”机制,其核心成果就记录在USIM卡的EFFPLMN文件中。

EFFPLMN,全称 Forbidden PLMNs,即“禁用的PLMN列表”。它就是一张由手机动态维护的网络“黑名单”。一旦某个网络被加入了这张黑名单,手机在后续的自动网络选择过程中,就会主动“绕着走”。


1. “避坑指南”:EFFPLMN的核心价值与工作机制

EFFPLMN的核心价值在于通过记忆失败的连接尝试,来优化未来的网络选择路径,提升搜网的效率和成功率。

This EF contains the coding for n Forbidden PLMNs (FPLMN). It is read by the ME as part of the USIM initialization procedure and indicates PLMNs which the UE shall not automatically attempt to access.

A PLMN is written to the EF if a network rejects a Location Update with the cause “PLMN not allowed”.

这段原文清晰地阐述了EFFPLMN的工作机制:

  1. 功能: 存储了一份手机在自动选网时应当避免 (shall not automatically attempt to access) 的网络列表。

  2. 来源: 这张列表不是运营商预置的,而是由手机动态写入的。写入的触发条件非常明确:当网络以特定的原因码(如 “PLMN not allowed”)拒绝了手机的位置更新请求时。

  3. 使用: 手机在每次开机初始化时,会读取这张“黑名单”,并在后续的自动搜网扫描中,直接忽略掉名单上的PLMN,从而避免了无效的连接尝试。

动态维护的“滚动黑名单”

EFFPLMN并非一个无限大的列表,它的存储空间有限(规范建议n≥4,即至少能存4个条目)。当黑名单满了之后,它会如何工作呢?

When n FPLMNs are held in the EF, and rejection of a further PLMN is received by the ME from the network, the ME shall modify the EF using the UPDATE command. This new PLMN shall be stored in the nth position, and the existing list “shifted” causing the previous contents of the first position to be lost.

这描述了一种“先进先出 (First-In, First-Out, FIFO)”的队列管理模式:

  • 当列表已满(已有n个条目),手机又遇到了一个新的需要被禁用的PLMN。

  • 手机会将这个新的PLMN添加到列表的末尾

  • 同时,原列表中最早加入的那个PLMN(位于列表的第一个位置)会被挤出列表并丢弃。

这种“滚动黑名单”机制,确保了列表中保存的总是最近几次连接失败的网络,具有时效性。

场景化举例:

李想的EFFPLMN文件大小为12字节,可以存储4个PLMN(每个3字节)。

  1. 初始状态,列表为空:[FFFFFFFFFFFFFFFFFFFFFFFF]

  2. 在A国,尝试连接PLMN_A失败,手机将PLMN_A写入列表:[PLMN_A, FFFFFF, FFFFFF, FFFFFF]

  3. 在B国,尝试连接PLMN_B失败,手机将PLMN_B写入列表:[PLMN_A, PLMN_B, FFFFFF, FFFFFF]

  4. 之后又相继禁用了PLMN_C和PLMN_D,列表被填满:[PLMN_A, PLMN_B, PLMN_C, PLMN_D]

  5. 现在,李想到达C国,尝试连接PLMN_E再次失败。此时列表已满。

  6. 手机执行“推陈出新”操作:

    • 最早加入的PLMN_A被丢弃。

    • PLMN_B, PLMN_C, PLMN_D在列表中向前移动一个位置。

    • 新的PLMN_E被添加到列表的末尾。

  7. 最终列表变为:[PLMN_B, PLMN_C, PLMN_D, PLMN_E]


2. 结构与编码:标准化的“黑名单”格式

EFFPLMN的结构设计非常简洁明了,专注于其核心功能。

2.1 文件结构

表 4.2.16-1: EFFPLMN 文件结构

| 属性 | 值 |

| :--- | :--- |

| Identifier | ‘6F7B’ |

| SFI | ‘0D’ |

| Structure | Transparent |

| File size | 3n bytes, (n ≥ 4) |

| Update activity | Low |

| Access Conditions | READ: PIN, UPDATE: PIN, … |

字节内容

| 字节 | 描述 | M/O | 长度 |

| :--- | :--- | :--- | :--- |

| 1 to 3 | PLMN 1 | M | 3 bytes |

| 4 to 6 | PLMN 2 | M | 3 bytes |

| … | … | … | … |

| (3n-2) to 3n | PLMN n | O | 3 bytes |

逐项解读:

  • Structure: 透明文件。所有被禁用的PLMN ID被连续地存储在一起。

  • File size: 3n字节,因为每个PLMN ID固定占用3个字节。规范建议至少支持4个条目,即文件大小至少为12字节。

  • Access Conditions: 读取和更新权限均为PIN。这意味着:

    • 手机需要解锁后才能获取这份黑名单。

    • 向黑名单中添加条目(即更新文件)也需要USIM处于解锁状态。这可以防止在手机被盗、USIM未锁定的情况下,被恶意地填满FPLMN列表,从而影响正常搜网。

2.2 编码方式

Contents: Mobile Country Code (MCC) followed by the Mobile Network Code (MNC).

Coding: according to TS 24.008.

If storage for fewer than n PLMNs is required, the unused bytes shall be set to ‘FF’.

  • 内容: 每个3字节的条目存储一个PLMN的MCC和MNC

  • 编码: 采用与EF_IMSIEFPLMNwAcT中PLMN部分完全相同的打包BCD码格式。

  • 填充: 文件中未使用的空间(空条目)用'FFFFFF'来填充。手机在解析时,遇到'FFFFFF'就知道列表的有效部分已经结束。

场景化举例(编码细节):

假设需要禁用法国(MCC=208)的Orange F(MNC=01)网络。

  • PLMN ID: 20801

  • 根据打包BCD编码规则:

    • 第1位(2)和第2位(0) 02

    • 第3位(8)和第4位(F,MNC只有两位,补F) F8

    • 第5位(0)和第6位(1) 10

  • 最终,写入EFFPLMN文件的一个3字节条目将是:02 F8 10 (十六进制)。

手机在读取到这3个字节后,会反向解码,得知20801这个PLMN在黑名单上。


3. EFFPLMN的“豁免权”与“有效期”

虽然EFFPLMN被称为“黑名单”,但它的效力并非绝对和永久的。

3.1 手动选择的“豁免权”

EFFPLMN的限制作用主要体现在自动网络选择模式下。如果李想进入手机的网络设置,手动搜索网络并明确选择了一个位于EFFPLMN列表中的网络,手机必须尝试连接它。

这种设计赋予了用户最终的决定权。也许李想知道A运营商的网络刚刚修复,或者他接到了运营商的通知让他手动重试,他应该有能力覆盖掉手机的“自动避坑”行为。

如果手动选择后连接成功,手机通常会(取决于具体实现)将该PLMN从EFFPLMN列表中移除,因为它已经被证明不再是“不可用”的。

3.2 关机即“部分失忆”

EFFPLMN列表是存储在USIM中的,因此是持久化的,关机重启后依然存在。

然而,为了应对网络状况的动态变化(今天不能用的网络,明天可能就可以了),3GPP规范(TS 23.122)对FPLMN列表的处理有更详细的规定。通常,手机重启或重新插拔SIM卡后,可能会清除掉一部分或全部FPLMN列表,以便重新进行网络探测。具体行为可能因终端实现和网络类型(3G/4G/5G)而略有不同,但核心思想是确保FPLMN列表不会因为过时的信息而永久地阻止用户连接到一个已经恢复正常的网络。

总结:“试错学习”的智能体现

EFFPLMN是USIM中一个简单而优雅的“学习”机制。它通过一个动态维护的“黑名单”,将手机从一个只会“按图索骥”(遵循预设列表)的执行者,变成了一个能够从失败中吸取教训、动态优化路径的“智能导航员”。

  • 提升搜网效率: 通过主动避开已知的无效网络,大大减少了搜网时间和信令开销,尤其是在网络环境复杂的漫游场景中,效果显著。

  • 节省终端功耗: 每次无效的搜网尝试都会消耗射频能量。EFFPLMN通过减少这些无效尝试,直接为延长手机电池续航做出了贡献。

  • 动态与时效性: FIFO的队列管理机制,确保了“黑名单”的内容能够与时俱进,反映最新的网络状况。

  • 用户控制权的保留: 允许用户通过手动选择来覆盖自动行为,在自动化与用户控制之间取得了良好的平衡。

对于李想而言,他可能完全没有意识到手机正在默默地为他维护着这样一份“避坑指南”。他所能感受到的,只是手机在不同国家和地区,总能“聪明”而迅速地找到可用的网络。这份“聪明”的背后,正是EFFPLMN这套“试错、记录、规避、更新”的智能循环在发挥着关键作用。


FAQ环节

Q1:只有“PLMN not allowed”这一个原因码会触发写入EFFPLMN吗?

A1:这是最主要和最典型的触发原因。3GPP TS 24.501(5G NAS规范)等相关规范中详细定义了多种拒绝原因码。除了“PLMN not allowed”,其他一些表示永久性或长期性不可用的原因码(如“EPS services not allowed in this PLMN”)也可能触发手机将该PLMN加入EFFPLMN。而对于一些临时性的拒绝原因(如“Congestion” - 网络拥塞),手机则不会将其加入FPLMN,而是会稍后重试。

Q2:如果我把SIM卡换到另一部手机,EFFPLMN列表会跟着过去吗?

A2:会的。因为EFFPLMN文件是存储在USIM卡内部的,而不是手机内存里。所以,这张“黑名单”是跟卡走的。当你把卡插入新手机时,新手机在初始化时会读取这张已有的黑名单,并遵循其中的规则。这保证了用户在更换设备时,之前积累的“搜网经验”得以延续。

Q3:EFFPLMN和手机飞行模式有什么关系?

A3:开启飞行模式会关闭手机的所有射频功能,手机会脱离网络。当关闭飞行模式时,手机会重新开始网络选择流程,这个流程与开机搜网类似。此时,手机会读取EFFPLMN文件,并在搜网时避开黑名单上的网络。开关飞行模式通常不会清除EFFPLMN列表。

Q4:为什么EFFPLMN的文件结构是Transparent,而不是Linear Fixed?

A4:虽然EFFPLMN的内容逻辑上是一条条3字节的记录,但设计成Transparent结构,主要是为了方便实现“先进先出”的队列移动操作。如果使用Linear Fixed结构,要删除第一条记录并将后续记录前移,需要逐一读取记录2、3、4,然后再依次写回位置1、2、3,操作非常繁琐。而对于Transparent文件,手机可以一次性读取整个文件内容(一个字节块),在内存中轻松地完成数据“左移”操作,然后一次性地将新的字节块写回USIM,效率更高。

Q5:有没有办法可以手动清空EFFPLMN列表?

A5:大多数商用手机的普通设置菜单中,通常不提供直接“清除禁用网络列表”的选项。但有些手机的“开发者模式”或“工程模式”中可能会提供此类功能。另外,恢复手机的“网络设置”或“恢复出厂设置”通常会清空手机侧缓存的各类网络信息,并可能触发对EFFPLMN的清理(但这并非标准行为)。对于普通用户,最可靠的“刷新”方式是关机重启,如前所述,这通常会触发手机根据规范重新评估或清理EFFPLMN