1.SIP中的DNS过程
1.1.SIP消息涉及的DNS过程
SIP消息涉及到的DNS过程主要包括两个方面:一方面是如何发送请求消息,发送方需要通过DNS过程得到传输层协议类型,下一跳的IP地址和端口等信息;另一方面是如何返回响应消息,需要决定上一跳的地址和端口,尤其是上一跳网元发生故障时,如何返回响应消息。
1.2.如何发送SIP请求消息
定义一个名为TARGET的变量,如果URI定义了maddr参数,TARGET取值于该参数,否则取值于URI的hostport部分。
第一步是决定使用哪种传输层协议发送请求消息,包括下列步骤 :
1、 如果URI定义了传输层协议,则使用该传输层协议,否则转步骤2;
2、 如果TARGET包含IP地址,那么对于SIP URI使用UDP协议,SIPS URI使用TCP协议,否则转步骤3;
3、 如果TARGET包含了端口,那么对于SIP URI使用UDP协议,SIPS URI使用TCP协议,否则转步骤4;
4、 使用TARGET中的域名进行NAPTR查询,如果NAPTR返回的记录为空转步骤5,否则查看返回的记录,记录中的service域一般取值为”XXX+D2U”, X+D2T”, XX+D2S”, 其中XXX表示服务名称,可以是”SIP”或”SIPS”,D2U表示使用UDP协议,D2T表示使用TCP协议,D2S表示使用SCTP协议;
5、 根据RFC3261的传输准则判断是否需要使用某种强制协议,如果需要使用强制协议,则使用该强制协议,否则对于SIP URI使用UDP协议,SIPS URI使用TCP协议;
第二步是决定目标的IP 地址和端口,包括下列步骤 :
1、 如果TARGET包含了IP地址和端口,则使用该地址和端口,否则转步骤2;
2、 如果TARGET包含了IP地址,则使用对应传输协议的默认端口,否则转步骤3;
3、 如果TARGET不包含IP地址,但包含了端口,则使用A或AAAA查询,获得域名对应的IP地址,否则转步骤4;
4、 如果在第一大步的第四小步没有进行NAPTR查询,转步骤5,则使用该查询返回的记录中的replacement域中域名进行SRV查询,然后转步骤6;
5、 在TARGET包含的域名加上_XXX._YYY.前缀(其中XXX表示服务类型,可以取值sip或sips,YYY表示传输类型,可以取值udp, tcp或sctp等),然后使用加了前缀的域名进行SRV查询,并转步骤6;
6、 如果SRV返回了记录,记录会包含端口和最新域名,然后对最新域名进行A或AAAA查询得到IP地址,如果SRV没有返回记录转步骤7;
7、 直接对TARGET中的域名使用A或AAAA查询得到IP地址,端口则根据传输协议使用默认端口;
一个发送请求消息例子 ,下一跳消息的SIP URI为:sip:example.com,如下是向该网元发送SIP请求消息的过程:
首先 对域名example.com进行NAPTR查询,查询的结果为:
order pref flags service regexp replacement
IN NAPTR 50 50 "s" "SIPS+D2T" "" _sips._tcp.example.com.
IN NAPTR 90 50 "s" "SIP+D2T" "" _sip._tcp.example.com
IN NAPTR 100 50 "s" "SIP+D2U" "" _sip._udp.example.com.
NAPTR返回了多条记录,根据order和pref的取值选择了第一条记录,flag为s表示下一步进行SRV查询,service为SIPS+D2T表示使用TCP作为传输层协议,同时使用sips方式传输消息,replacement表示使用_sips._tcp.example.com进行获取目标网元的地址信息。
然后 对域名_sips._tcp.example.com进行SRV查询,查询的结果为:
Priority Weight Port Target
IN SRV 0 1 5060 server1.example.com
IN SRV 0 2 5060 server2.example.com
SRV返回了两条记录,根据priority和weight选择其中一条,假设选择的是第一条,那么意味这目标端口为5060,Target包含了目标网元的域名server1.example.com。
最后 对域名server1.example.com进行A或AAAA查询,得到目标网元的IP地址:
IN AAAA 5F05:2000:80AD:5800:0058:0800:2023:1D71