请求URL
《中国电信IMS网络SIP协议总体技术要求》里要求,如果主叫用户拨叫的被叫号码仅为E.164编码,则UA设备发往网络的被叫号码形式可以为SIP URL或TEL URL,同时也需要支持转义符处理。
SIPURL
格式:(URL包含user=phone属性)
sip:被叫号码@归属域;user=phone
如:
sip: 50440045@sh.ctcims.cn; user=phone
sip: 755004@open.ims.test; user=phone
注意:
归属域是不含有端口号的,这个不同于SIP软交换的URL
TELURL
格式:
tel: 被叫号码;phone-context=归属域
如:
tel:50440045;phone-context= sh.ctcims.cn
tel: 755004; phone-context= open.ims.test
小提示:
-
在《RFC2806》里讲述,tel url一般有两种格式,全局格式和本域格式,其中全局格式为我们通常见到的+8675512345678这种行式,全局格式有个明显的加号,同时要求设备在用户没有完全按所有号码时,需要自动补全国家码、区域码等。
-
一些电信规范里仅要求采用的是本域格式的tel url,当前我们就采用这种。
-
另外针对tel url的解析是在IMS核心的S-CSCF网元进行解析处理。
URL转义
在《RFC2396》中针以URL转义讲的比较让人头晕,《RFC3261》也针对SIP描述了一些,总结一下主要有这几点:
-
Reserved组内的字符如果出现在URL部件中一定要转义处理
-
Unreserved组内的字符出现在URL部件中可以转义处理,但不建议转义处理
-
除了1、2两种情况之外的字符必须转义处理。
URL转义处理流程为:
将要转义的一个字符变为三个字符,格式为“%XX”,其中XX是这个字符对应ASCII码的十六进制数值。
举个例子描述一下,如下部分是从《RFC3261》的BNF范式中截取,当前仅分析sip url中的用户名部件。
SIP-URI ="sip:" [ userinfo ] hostport uri-parameters [ headers]
userinfo = ( user / telephone-subscriber ) [ ":" password ]"@"
user = 1*( unreserved / escaped /user-unreserved )
user-unreserved = "&"/ "=" / "+" / "$" / "," / ";"/ "?" / "/"
reserved =";" / "/" / "?" / ":" / "@" /"&" / "=" / "+" / "$" /","
unreserved =alphanum / mark
mark ="-" / "_" / "." / "!" / "?" /"*" / "’" / "(" / ")"
alphanum = ALPHA/DIGIT
-
Reserved组包含的字符是URL顶层划分部件的关键字符,比如@出现在字符串中用于将user和hostport两个部件分离出来。
-
Unreserved组包含的字符为大小写字母、数字、以及mark里面包含的,这些字符虽然不能做为分隔符使用,但确是在部件中最可能出现的字符集,该字符集是全局性的,针对整个SIP BNF范式有效,如果各别部件含有其它常用字符则单独扩冲,比如这里user-unreserved是针对user部分可能出现的常用字符进行扩冲。
在这个例子中user合法的字符集包含Unreserved或user-unreserved或转义字符,其它字符全部为非法,必须进行转义。
比如:
sip:755001@123@1.1.1.1,其中user部件包含了@,导致这个URL无法识别出user和hostport的界线到底在哪里。这里将user部件进行转义为755001%40123@1.1.1.1就比较清晰了。
参考资料
《RFC2396》
《RFC2806》
《RFC3261》
《IMS试点阶段号码传送与显示暂行规定V1.0》
《中国电信IMS网络SIP协议总体技术要求》