因为SIP支持多种传输协议,所以必须有一种管理它们的办法。DNS的完整用法在RFC 3263中定义,这里描述客户端的基本步骤。
实现这一目标有两种方法。第一种是通过SIP URI显式说明。URI 描述中,transport=tcp或transport=sctp ( RFC 4168)的存在说明这个URI所选定的传输协议。注意:对于TLS传输来说,应当使用SIPS URI方案,虽然有些非标准的实现中会用transport=tls参数描述。如果有transport=udp就使用UDP。
第二种,URI中没有transport参数,那么采用以下规则决定传输协议:
- 如果URI中有数字IP地址,那么SIP URI应当使用UDP协议,SIPS URI使用TCP协议。
- 如果URI中没有数字地址,但有端口号,那么SIP URI应当使用UDP协议,SIPS URI使用TCP协议。
- 如果URI中没有地址和端口描述,而且支持NAPTR DNS查询,那么应当对URI的主机部分执行DNS NAPTR查询。NAPTR服务字段中:“SIP+D2U”用UDP;“SIP+D2T”用TCP;“SIP+D2S”用SCTP。NAPTR regex替换的结果将是一个URI,用它执行下一步描述的SRV查询。如果支持多种传输协议,那么preference字段说明其中的首选项。如果没有NAPTR记录返回,那么应当执行SRV查询。
- DNS SRV记录的SIP用法中,使用“_sip”或“_sips”描述协议方案,而用“_udp”、 “_tcp”和“_sctp”描述UDP、TCP和SCTP传输。SRV查询的结果将是一个目标主机名和端口号。请求应当发送到这个地址和端口。关于SRV记录使用的详细信息在RFC2782中定义。
- 如果没有找到SRV记录,那么应当执行A类或AAAA类DNS查询。并用SIP URI应当使用UDP,而SIPS URI使用TCP。
代理服务器执行一套稍微不同的规则,如RFC3263所述。
举个例子:假设上图中Schrodinger执行DNS查询的场景。URI是sip:[email protected],没有数字IP或端口,因此跳过步骤1和步骤2。Schrodinger遵循步骤3定义,对主机部分munich.example.com执行NAPTR查询,返回这样的记录:
munich.example.com. 360 IN NAPTR 100 50 “s” “SIPS+DTU” “” _sip._udp.munich.example.com
因为只支持UDP传输,所以第4步对_sip._udp.munich.example.de执行SRV查询,结果返回:
_sip._udp.munich.example.com. 300 IN SRV 0 100 5060 proxy.munich.example.com
最后对proxy.munich.example.com执行A类查询,返回:
proxy.munich.example.com.3600 IN A 100.101.102.105
最终,Schrodinger向100.101.102.105:5060发送INVITE 消息。