让咱们来谈谈SIP内的电话号码

不少年前,咱们刚刚接触互联网。一天,老师上完课以后就在黑板上写了一个以下的东西让你们去下载资料。
 
URL Http://www.abc.edu.cn/abc
 
咱们以为很可笑,为何老师要加个URL呢,咱们已经都知道这不就是一个互联网地址了罢了,那个URL是什么意思,后来虽然知道了URL 的全称是Uniform Resource Locator,翻译为统一资源定位器,可是更深层次的东西就一直不得其解了。
后来随着知识慢慢地增长,我开始理解这个URL的意义:准确的定位资源。比如在茫茫资源中,我能够按照一个标记来找到我要的资源。那么为了标记一个资源,咱们就要用Uniform Resource Identifier (URI)来进行标识。
 
咱们今天的话题就从这个惟一资源标示符-URI开始,配置过的OCS的可能都知道,咱们在为用户启用了企业语音以后,都要为用户填入一个Line URI,并且格式必须是tel:开头的。你们或许也就填了一个,可是没有去想过为何要这么填。
正如电视剧《LOST》里面说的Everything happen for a reason。每件事都是有缘由的。微软为何要这么让你们填入也是有缘由的。根本缘由是要在茫茫的诸多电话号码中定位咱们的这个用户,咱们必须参照IETF规范的RFC 2806(须要注意RFC 2806如今已经被RFC 3966所代替)。而RFC 2806里面则定义了资源的URI格式要使用“tel:”这样的格式。“tel:”仅仅表明了telephone-uri,除此以外还有 extension,context等咱们常见的几种语法。
好比说extension的格式为:“;ext=”,而context的格式为:“;phone-context=”。知道了这这两点以后那么咱们若是看到这样的Line URI也就不会以为奇怪了:
tel:+12345
tel:+12345;ext=123
tel:+12345;phone-context=dialstring@lyncpbx.net
他们都是资源的定位符。其中phone-context 定义了这个tel url在什么范围内是有效的。
 
若是你们有配置过Exchange和OCS的集成的话,在你为用户启用了UM以后,用户的地址那里会多出一个EUM,而后格式为123;phone-context=umdialplan这样的字符串,我想如今你也应该明白了它的来历了吧,至于这些字符的意思,咱们接着来分析。
 
若是仅仅给你几个单独的数字,你绝对不会知道他的意思。好比说咱们+861012345678,假设我要说这个是咱们电话世界里面的某一个电话机的号码,那么你就可能会猜到,这是北京的号码。由于你们知道,中国的代码是+86,而北京的区号是010。那么定义这些代码的规矩就成为Number Plan,翻译为号码规范。全球最著名的号码规范就是E.164了。E.164 的全称是international public telecommunications numbering plan。它是由国际电信联盟在1997年发布的。这个规范创建了全球号码的框架,而且了每个国家分配了国际代码,中国的就是+86。固然为了方便和一些特殊的缘由,国内在地区码被认为的在前面加了一个0,这个0在咱们号码的标准格式下是不存在的。
 
E.164有一些特色:
  • 一个号码最大只能有15位;
  • 号码的第一部分为国际代码country code(CC);
  • 号码的第二部分为区域代码national destination code (NDC);
  • 第三部分为接入代码subscriber number (SN);
  • NDC和SC合起来称为能够成为标识码
当一个北京的用户向电信申请了一个座机号码01012345678,当用户把这个电话接入电话网的时候,号码就有了E.164这个号码规范,他的号码前会加一个86,这样国外的用户就能够定位到这个用户。由于它的号码变成了+861012345678。须要注意的是这串号码中,只有+86来自于E.164,,其它部分都不是。那么为何国内的用户不加+86能够拨通这个号码呢,由于这个号码和一个叫作Dial Plan(拨号计划)的概念联系在了一块儿。每个号码都要和一个拨号计划关联起来,由于拨号计划制定了一个用户在话机上怎么拨号码以便接通号码。好比说同在北京的用户不要加010就能够接通这个号码,而外地的用户就须要加010才能够接通到这个号码。这些就是拨号计划所制定的了。
 
不要搞混淆了,号码规范是定义了号码怎么分配,拨号计划制定了一个用户在话机上怎么拨号码以便接通号码。
 
若是你们对SIP熟悉的话,那么咱们知道通常的sip设备都和一个拨号计划联系在了一块儿,由于一是能够实现用户拨打完号码就能够拨出去,而不须要在去按一下dial键,二是用户输入的能够按照给定的拨号规则来进行转换。
若是咱们在一个隶属于lyncpbx.net域的SIP设备上拨打了12345678,那么sip设备在通过拨号计划就会把号码转变为+86102345678 ,因此设备所发出了请求就会为:
INVITE tel:+86102345678 SIP/2.0
可是为了让SIP URI成为一个规范的SIP URI,user=phone字段会被插入到语句中。因此最终发出的请求就为:
INVITE sip:+861012345678@lyncpbx.net;user=phone SIP/2.0
 
若是用户发出的是INVITE sip:12345678;phone-context=dialstring@lyncpbx.net;user=phone SIP/2.0,经过上面的分析,你们也应该知道是什么意思了吧。