终于可以携号转网,三大运营商做了10年,技术难点到底在哪?
The following article is from 漫话编程 Author 漫话编程
规定中要求4大运营商严格遵照执行,包括:不得无正当理由拒绝、阻止、拖延向用户提供携号转网服务、不得在用户提出携号转网申请后,干扰用户自由选择等行为。
四大运营商:中国电信、中国移动、中国联通、中国广电公司。
紧接着,在11月14日,几大运营商发布了携号转网细则,并表示携号转网全面进入试运行阶段。
携号转网条件查询:
编辑短信“CXXZ#姓名#证件号码”发送至10086/10010/10001
但是,在试运行的这几天,有很多用户吐槽携号转网,困难重重。
部分运营商表示,携号转网初期与用户期望可能存在一定差距。
其实,携号转网业务在很多国家和地区很早就可以进行了,而且国内最早也在2010年就在天津、海南启动试点了,那么到底是为什么这么久才能面向全国开放呢呢?
三大运营商之前一直说是"技术"原因导致进度缓慢,那么,这个业务的技术难度到底有多大呢?
携号转网,携的是什么?携号转网,官方叫法是号码携带(NP,Number Portability),对于普通用户来说很容易理解,就是我有一个中国联通的186XXXXXXXX的手机号,通过携号转网业务,把他转成一个中国电信的186XXXXXXXX的手机好,这个过程只换了运营商,并没有换号码。
对于用户来说,我们只关心这个186的号码,这个号码在移动通信系统中叫做MDN(Mobile Directory Number,移动用户号码簿号码)或者MSISDN(Mobile Station International Subscriber Directory Number,移动台国际用户目录号)
MDN是CDMA协议中的移动用户号码,MSISDN是GSM/UMTS协议中的移动用户号码。
MDN(MSISDN)采取E.164编码方式。MDN号码的结构如下:MDN =CC + MAC + SN
其中:
CC(Country Code,国家码)
用户所属国家代号,由2位数字组成,中国为86
MAC(Mobile Access Code,移动接入码)
识别移动用户所归属的移动通信网。由3位数字组成。如186,139等。
SN(Subscriber Number,用户号码)
SN长度为8位,编码格式为H0H1H2H3ABCD。由运营商统一分配。
这就组成了一个中国的手机号:8618612345678,那么在携号转网业务中,这个号码是不发生改变的。
那么,有没有人想过,既然携号转网的时候手机号是不变,为什么还需要重新换一张新卡呢?
这就要引出第二个号码,叫做IMSI(International Mobile Subscriber Identity,国际移动用户识别码) ,这个号码可以用来唯一识别一个用户的号码。
IMSI共有15位,其结构如下:IMSI = MCC + MNC + MSIN
其中:
MCC(Mobile Country Code,移动国家码)
由国际电联统一分配和管理,唯一识别移动用户所属的国家,共3位,中国为460;
MNC(Mobile Network Code,移动网络码)
共2位,中国移动TD系统使用00,中国联通GSM系统使用01,中国移动GSM系统使用02,中国电信CDMA系统使用03
MSIN(Mobile Subscriber Identification Number ,移动客户识别号)
唯一识别码共有10位。
有了IMSI,想要区分一张卡到底是移动还是联通的,只需取得其中的MNC字段即可。00就是移动,01、02就是联通,03就是电信。
通过一个典型IMSI号码,如:460000123456789,我们可以分析得知,这是一个中国联通用户的手机卡。因为他的前五位是:46000 。
但是,IMSI这个号码普通用户是不感知的,具体有什么用,我们后面介绍移动通信的呼叫流程的时候会再次提到这个号码。
介绍完了MDN和IMSI,我们知道了,携号转网其实携带的是MDN,但是IMSI是需要改变的。
移动通信呼叫流程接下来,我们看一下,在没有携号转网业务的时候,一次普通的拨打电话会发生什么事情。
1、用户手机开机的时候,移动手机会向归属位置寄存器HLR发送"位置更新请求",并把手机卡上面的IMSI和MDN注册到HLR中,IMSI作为主键。
2、用户拨打电话,需要把手机卡的IMSI以及被叫用户的MDN上报给移动交换中心MSC,MSC会把请求发送给HLR,查询主叫用户的MDN用户签约信息,以及被叫用户的位置信息及运营商信息
3、移动交换中心MSC将呼叫路由至关口局GMSC
4、用户A所属的GMSC-1建立到用户B所属的GMSC-2的连接。
5、手机用户B所属的GMSC-2从VLR中查询用户B所在的位置区码。
6、MSC-2根据手机用户B的IMSI,从VLR中查询用户B对应的位置区码LAC和TMSI。
7、MSC-2通过TMSI号呼叫手机B
这里面比较重要的一步就是通过HLR进行号码分析。HLR之所以可以进行号码分析,是因为HLR存储了HLR存储移动电话运营商所发行的每个SIM卡的详细信息。包括我们前面提到过的两个关键号码:IMSI和MDN(MSISDN)
因为我们拨打电话的时候,传递给HLR的信息中包括:主叫用户的IMSI、主叫用户的MDN以及被叫用户的MDN。
在有携号转网业务之前,HLR想要知道被叫用户属于哪个运营商,只能通过被叫用户的MDN进行分析,比如139的用户就是移动的。
但是有了携号转网之后,这种分析方式就不可靠了。
号码携带集中数据库既然我们没办法通过被叫号码的MDN直接通过号段分析一个手机号属于哪个运营商了,就要想一个新的办法来进行判断。
这时候就有一种方案被提出来了:采用了一种集中数据库的方式。
即在号码携带业务网络中设置一个集中的数据库,也称为集中业务管理系统(CSMS:Central Service Management System),运营商的号码携带业务节点通过此集中数据库系统进行通信,实现号码携带的业务协商及携号转网(NP)数据下发。
说白了,就是把所有办理过携号转网业务的手机号信息,保存在一个单独的数据库中,这样在HLR查询被叫号码所属运营商的时候,去这个数据库中查询下就知道其当前运营商了。
本地业务管理系统(LSMS)保存本地的号码携带数据,并负责管理运营商内部的网元设备;
业务受理系统(SOA)主要负责受理和处理用户提出的号码携带申请;
集中业务管理系统(CSMS)处理所有SOA之问的交互信息,并负责向LSMS同步号码携带数据。
下图是一个中国联通186用户呼叫另外一个186(可能做过携号转网)用户的流程图:
在呼叫过程中,中国联通网络会尝试进行携号转网(NP)查询,即查询CSMS,判断被叫号码是否做过携号转网。有以下3种情况:
未携转:正常呼叫流程,由中国联通核心网将呼叫疏通至相应端局。
携转至中国电信:由中国联通核心网将呼叫疏通至中国联通关口局GMSC,关口局将相应呼叫转接至中国电信语音网络。
携转至中国移动:由中国联通核心网将呼叫疏通至中国联通关口局GMSC,关口局将相应呼叫转接至中国移动语音网络。
前面我们介绍过了携号转网的技术方案中,语音呼叫的过程及解决方案,那么短信是如何实现的呢?
用户现在手机上接收的短信主要有两种,第一种是用户之间发送的,第二种是平台给用户发送的,如验证码。
对于第一种用户之间发送的短信,也是通过发送端运营商发送给接收端运营商的,具体运营商的查找规则和电话呼叫类似,也是可以借助号码携带集中数据库的。这种比较容易理解。
但是,平台发送给用户的验证码类型的短信,就不是这样的了,这种验证码一般发送流程是:1、用户在网站上填写手机号,点击发送验证码
2、验证码平台通过一系列规则,判断号码所属运营商,生成验证码之后,将短信提交到运营商的服务器。
3、运营商接到短信后,将短信下发到用户的手机。
可以看到,这个过程是验证码平台自己判断的运营商,我们知道,有了携号转网之后,这种验证方法已经不准确了。
所以在携号转网早期试运行的时候,很多用户发现有收不到短信验证码的情况。还有一种情况就是利用第三方充值平台充值,也和这个原理类似。
那么为了解决这个问题,2014年,工信部已要求基础电信企业对验证码类的非自营非定制类短信开放网间转发,其他行业的验证码平台仍可将验证码发送给用户原来签约的基础电信企业,由其通过网间转发的方式发给用户新签约的基础电信企业,“短信验证码”问题已经基本解决。
目前,工信部已经建立“携号转网”数据库并向第三方服务提供商开放,包括充值平台在内的第三方服务提供商,可直接从数据库同步“携号转网”数据,获取用户最新签约的基础电信企业,为用户提供验证码发送和充值等相关服务。
部分用户规模较大的第三方充值平台,如微信、支付宝等均已可正常为“携号转网”用户充值。
为解决携号转网工作种的这些困扰,信通院还专门成立了产业组织“码号服务推进组”,其中的成员单位就有很多互联网公司及银行系统。
携号转网对开发者的影响在没有携号转网业务的时候,我们可以通过手机号码的号段判断一个用户属于哪个运营商,但是有了携号转网业务之后,这样做就不够准确了,这其实对于一些网站的开发者是有影响的。
比如GitHub上有3.7k Star的ChinaMobilePhoneNumberRegex组件中,就是通过号段判断号码所属运营商的:
中国移动号码判断的正则表达式:
^(?:\+?86)?1(?:3(?:4[^9\D]|[5-9]\d)|5[^3-6\D]\d|8[23478]\d|(?:78|98)\d)\d{7}$
中国联通号码判断的正则表达式:
^(?:\+?86)?1(?:3[0-2]|[578][56]|66)\d{8}$
中国电信号码判断的正则表达式:
^(?:\+?86)?1(?:3(?:3\d|49)\d|53\d{2}|8[019]\d{2}|7(?:[37]\d{2}|40[0-5])|9[19]\d{2})\d{6}$
在有了携号转网业务以后,这个正则表达式就不奏效了。或者说,以后在再也没办法通过正则表达式验证号码所属运营商了。
所以,如果代码中有任何根据号段判断运营商的逻辑,那么这段代码的有效性会越来越低。
期待有一天,号码携带集中数据库可以开放查询接口,供第三方查询号码的归属运营商。
本文简单介绍了我国携号转网业务的背后实现细节,但是由于作者并非通信专业出身,文中内容参考了很多文献资料,如有偏颇,欢迎指正。
懂了这么多知识,我还是没办法顺利的携号转网!
参考资料:
《移动网间号码携带集中数据库系统接口协议设计》 《我国号码携带业务访问数据库技术方案的研究》 《移动通信基本呼叫流程》 《中国电信CDMA基本呼叫流程》 https://zhuanlan.zhihu.com/p/22072434
https://kknews.cc/zh-sg/news/xl4xjmo.html
https://wwww.huxiu.com/article/327106.html
http://www.opene164.org.cn/Num_Sys/other/introduce/member.html
推荐阅读
“菜鸟”程序员 VS “大神”程序员,我差点吓出了翔。。。 仅需四步,整合SpringSecurity+JWT实现登录认证 ! 看完这篇还不了解Nginx,那我就哭了! Nginx的这些妙用,你肯定有不知道的! Github标星25K+Star,SpringBoot实战电商项目mall出SpringCloud版本啦! 在Docker容器中部署整套基于Spring Cloud的微服务架构,看这篇就对了! “失败”的北漂十年,我真的尽力了。。。 如何判断一家互联网公司要倒闭了? 涵盖大部分核心组件使用的 Spring Cloud 教程,一定要收藏哦! 我的Github开源项目,从0到20000 Star!