RFC3581-关于rport字段 的阅读笔记

来源:互联网 发布:南昌金域名都房价 编辑:程序博客网 时间:2024/05/18 00:39

1. 背景

         SIP提供给客户端服务器收到来自客户端请求的IP地址,这个源IP地址被放在”received”参数中传送,它 放

于响应的顶端头字段中。对NAT穿越有很大作用。

    但有很多情况下,仅一个ip地址信息还不够,还有需要端口信息。于是有了第二步扩展,也可以称作平完善。

2.      引出讨论主题:在via头字段中增加了一个新的参数”rport”,它允许服务器回应客户端到源ip和端口,类

    似 于”received”,只是它包括的是端口,而received包括的是ip地址。

3.       客户端行为

1)   客户端可以包含”rport”参数,但它一定没有值 ,作为一个标志,来向服务器表明这种扩展在传送数据

    的过程中是被支持的。

2)   Keep binding fresh

     UDP NAT绑定的超时时间是一分钟,然而,INVITE传送可能会花费大量的时间去完成,结果可能会导致

回应被收到前绑定过期,为了保证绑定新鲜,客户端每20S左右重传一次INVITE消息。

3)    重传周期问题

如果NAT绑定周期大于1分钟,则客户端的请求重传间隔应增大至其一半;

如果NAT绑定周期小于1分钟,则客户端的请求重传间隔应减小至其一半。

   

4.     服务器端行为:

   端口号赋值给”rport”,这类似于”received”参数赋值,即使”sent-by”中包括ip。注意这一处理完全独立于

传输协议。

     服务器端的回应必须从收到请求的ipport发送以穿越对称的NATS,当一个服务器正在多个端口或者接口

上监听请求时,它需要记住某个请求是从哪个端口收到的。这对于有状态的代理来说,事务期间存储此信

息不成问题。然而,一个无状态代理并不能存储请求和响应之间的状态信息,因此不能记住所收到请求的ip

port,但为了实现此功能,无状态代理可以封装一个请求的目的地址和port到它所插入的via头字段中。当

一个响应到达时,它可以提取此信息并用它来发送回应。

5.      举例

    一个客户端要发送一个INVITE消息到一个代理服务器,部分消息如下:

      INVITE sip:user@example.com SIP/2.0

Via: SIP/2.0/UDP 10.1.1.1:4540;rport;branch=z9hG4bKkjshdyff

这个INVITE消息发送的源端口号是4050,IP是10.1.1.1。这个代理服务器正在IP为192.0.2.2端口为5060和5070的

 

地址上监听请求。由于此请求穿过NAT到代理服务器,因此源IP显示的是192.0.2.1,端口号是9988。此代理

 

服务器转发此请求,但必须先追加给”rport”参数一个值,代理要转发的请求如下:

 

INVITE sip:user@example.com SIP/2.0

Via: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77

Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff

 

     上面请求产生的到达代理的响应如下:

    SIP/2.0 200 OK

    Via: SIP/2.0/UDP proxy.example.com;branch=z9hG4bKkjsh77

    Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988;branch=z9hG4bKkjshdyff

     此代理提取它的via头字段的值,一个一个地检查。它包括了”reveived”参数和”rport”参数。这个服务器按照规

 

     则发送响应到ip为192.0.2.1,port为9988的地址上,并且是必须是从proxy上的192.0.2.2:5060发送的。

 

Via: SIP/2.0/UDP 10.1.1.1:4540;received=192.0.2.1;rport=9988可看作是NAT两侧的ip和port的一个绑定,即

 

10.1.1.1:4540(内网地址)与192.0.2.1:9988(外网地址)的一个绑定。这样当响应到达NAT的外网地址

 

192.0.2.1:9988时,NAT可以改写目的地址为与之对应的内网地址10.1.1.1:4540,客户端正在用此地址监听响

 

应信息,从而客户端最终可收到此响应。

 

6. 抓包实例:

[15:21:41] ===SIPTransaction Received SIP message (428 bytes) from 222.210.226.30:1068

REGISTER sip:sip1.tv.qualvideo.net SIP/2.0

Via: SIP/2.0/UDP 192.168.1.102:15060;rport;branch=z9hG4bK1041051991

注:客户端发送请求时,rport的值必为空。

   [15:21:41] ===SIPTransaction Send SIP message (610 bytes) to 222.210.226.30:1068

   SIP/2.0 401 Unauthorized

   Via:SIP/2.0/UDP 192.168.1.102:15060;rport=1068;branch=z9hG4bK1041051991;received=222.210.226.30

注:服务器回应时给”rport”,” received”赋值。


From : http://hi.baidu.com/caoyaping/blog/item/aa25bd08998f23980a7b82d8.html

            http://hi.baidu.com/caoyaping/blog/item/18f15c6e724e6fd781cb4ad8.html