不少年前,咱們剛剛接觸互聯網。一天,老師上完課以後就在黑板上寫了一個以下的東西讓你們去下載資料。
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,經過上面的分析,你們也應該知道是什麼意思了吧。