SIP支持多种URI/URL方案,包括sip、sips、tel、pres,还有用于SIP的im,这里想谈谈安全SIP、电话、状态呈现和即时消息相关的URI方案。之前SIP URL中给了一个列表,说明SIP头域中可以引用的URI方案。
SIP 与 SIPS URI
许多地方使用SUP URI,其中包括To、From、Contact这些头域,还有说明请求目的端的Request-URI。SIP URI和mailto URI很像,也可以在页面上显示为超链接。它们还可以是电话号码。SIP URI里的信息说明了联系SIP资源(用户)的具体方式。
SIP URI以方案名sip打头,紧接着是一个冒号“:”,然后是用户名加@,@后面是主机名或IPv4/ IPv6地址,端口是可选的,如果有端口,用冒号“:”分隔,最后是URI参数列表,参数列表中的参数以分号";"作为分割符。具体示例:
sip:joseph.fourier@transform.example.org:5060;transport=udp;user=ip;method=INVITE;ttl=1;maddr=240.101.102.103?Subject=FFT
URI中不能包含空白字符或换行符。有些SIP URI没有用户名,只有主机名或IP,比如说REGISTER请求的Request-URI。在上面实例中,端口使用的是SIP的标准端口5060。对于SIP URI来说,如果没有描述端口,那么就假定它使用的是默认端口5060;对于SIPS URI来说,则是5061。transport参数说明传输协议选用UDP,这也是SIP的缺省选择。transport参数的可选值还有TCP、TLS和SCTP。
- user参数来说明URI的用户名部分是否为电话号码。它的缺省值为ip,说明不是电话号码。如果是电话号码,那么它的值为应该设为phone。不能用这个参数猜测UA的特征或功能。比如说,user=phone表示UA就是一部SIP电话(它可能有显示及处理能力的限制)。在电话环境中,IP电话和IP/PSTN网关实际上可能使用相反的假设,把用户名中的任何数字都解释为数字,而不关心user=phone是否存在。user=dialstring说明用户部分是一个拨号串,可能包含拨号前缀。比方说,用户拨打外线号码时,SIP URI的用户部分以“9”打头,但是它并不是实际电话号码的组成部分,这时用户部分就可以解释为拨号串。
- 参数method说明所使用的方法。默认值是INVITE。这个参数对To、From头域及Request-URI来说没有意义,但对于注册的Contact头域或转移的Refer-To头域来说是有用处的。
- ttl参数是生存时间,只有当maddr参数包含多播地址,而transport参数包含udp时,才能使用该参数。默认值是1。此值作用于多播会话广播。
- maddr通常包含请求应当被定向到的多播地址,覆盖URI中主机部分的地址。它还可以携带备用服务器的单播地址。
method、maddr、ttl及header这几个参数不允许出现在To或From头域中,但可以在Contact头域或Request-URI使用。除了这些参数之外,SIP URI可以包含其它用户定义参数。
可以在问号“?”之后指定需要包含在请求中的参数名字。这一点和mailto URL的操作类似,后者允许为请求设置主题(Subject)及优先级(Priority)这些参数。可以指定其它头域并用“&”分隔。如果头域名为body,说明URI中指定了INVITE请求的消息体。
如果存在user=phone参数,那么URI中的用户名部分可以解释为电话号码。它允许在URI的用户名部分添加其它参数,从而允许SIP URI的用户部分中出现tel URL 的参数及结构。
sips URI方案的结构和sip URI相同,不同之处就是方案名字变为sips。需要注意的是sips URI并不等同于带有transport=tls的sip URI,因为sip URI不具备sips URI相同的安全需求。要求对SIP路径中端到端使用TLS传输。
示例中没有出现松散路由(loose route)参数lr,它可以在sip或sips的Record-Route及Route URI中使用,说明代理服务器所标识的URI支持松散路由。
tel URL
tel URI方案,可用于描述一个电话号码所标识的资源。电话号码通常有两种格式:本地或全球的。本地号码只在特定的地理区域内有效,并且只有本地意义。如果在区域外使用,要么失败,要么返回错误的资源。全球号码也称为E.164号码,原则上,它在任何地方都是有效的。它包含足够的国家、地区和位置信息,以便PSTN网络把呼叫路由给正确的资源。下面是本一个本地号码的具体示例:
tel:411;phone-context=+1314
它表示呼叫给电话号码时,仅在国家代码为1并且地区代码为314时有效,这些信息都通过phone-context参数标识。下面是一个全球号码示例:
tel:+13145551212
全球号码总是以加号“+”打头,随后是国家代码(本例中是1),接着是剩余的号码位。
Tel URL 还可以包含一些拨号串/模式相关的特征或信息。比如:
tel:#70555-1212;isub=1000;phone-context=+1
在本例中,由PSTN网关解释拨号串,它是DTMF串#70(取消呼叫等待),后续号码是555–1212。附加的参数包括ISDN子地址1000。这个例子中用到了可视化分隔符“-” 或 “.”,它们是可选的。
Tel URL也可以嵌入到网页中,或在HTML标记中描述,例如:
Click <A HREF=”tel:+1972.555.1212”>here</A> to get information about Dallas.
tel URL的语法及参数可用于sip URI的user部分。比如,之前的第一个示例,可用SIP URI表达如下:
sip:411;phone-context=+1314@gateway.example.com
SIP URI加上一个域名描述,它表示将要路由这条消息的域或网关。
状态呈现及即时消息URL
RFC3861中定义了pres URL方案,它表示某种“呈现实体”或状态代理PA。RFC3861还定义了im URL方案,用于描述即时消息信箱或客户端。这两种URL都不代理新的协议,但都可以使用DNS SRV查询解析,解析返回另一种指向实际资源或即时消息协议的URI。比如说,如果通过以下URL访问PA:
pres:user@example.com
假设它支持SIP状态呈现,那么DNS SRV查询将返回一个SIP URI:
sip:user@example.com
然后代理客户端可以向这个SIP URI发SUBSCRIBE请求以获取用户的状态信息。
同样的处理流程可以将im URL解析为SIP URI,然后发MESSAGE请求。