SIP穿越NAT的rport
扫描二维码
随时随地手机看文章
SIP和NAT的基本概念
- SIP是会话初始协议,用于建立、修改和终止多媒体会话,比如VoIP通话。
- NAT是网络地址转换,主要解决IPv4地址不足的问题,把私有地址转换为公有地址。
- NAT会给SIP带来问题,因为SIP消息中的IP地址和端口可能被NAT改变,导致后续通信失败。
rport机制具体是如何工作的
SIP消息中有Via头域,用来记录请求经过的路径,以便响应能够正确返回。当客户端在私有网络内,通过NAT发送请求到公网服务器时,Via头中的端口可能是内网端口,而经过NAT后端口会被转换。服务器如果直接按Via头里的端口回复,可能无法到达客户端,因为NAT外的端口是转换后的。
rport的作用
可能是在Via头中添加rport参数,让服务器知道应该使用哪个端口来回复。比如客户端发送请求时,在Via头里加上rport参数,但不指定值,服务器收到后,会把响应发送到请求的源地址和端口,并在Via头里填上rport的值,这样客户端就能知道正确的端口了。
具体实现流程
客户端发送INVITE请求,Via头可能是Via: SIP/2.0/UDP 192.168.1.100:5060;rport。经过NAT后,源地址变成公网IP,比如203.0.113.1:5060,此时服务器收到请求,处理后会发送响应到203.0.113.1:5060,并在Via头里填上rport=5060
- 客户端发送INVITE(内网地址):
Via: SIP/2.0/UDP 192.168.1.100:5060;rport
NAT转换:源地址变为公网IP(如203.0.113.1:1234)。
- 服务器处理:
检测到rport参数,记录源地址203.0.113.1和端口1234。
修改Via头为:Via: SIP/2.0/UDP 192.168.1.100:5060;rport=1234;received=203.0.113.1
服务器发送响应:目标地址为203.0.113.1:1234,确保穿越NAT返回客户端。
- RFC 3581标准
RFC 3581定义了rport和received参数,用于支持对称响应(Symmetric Response)。
received:记录请求的源IP(NAT公网IP)。
rport:记录请求的源端口(NAT映射后的端口)。
通过rport参数让服务器使用请求的源端口来发送响应,而不是Via头中指定的端口。这样即使经过NAT转换,响应也能正确到达客户端。
rport通常和received参数一起使用,received参数记录请求的源IP地址,而rport记录源端口。这样服务器在响应时,使用received中的IP和rport中的端口,确保NAT外的地址正确。客户端发送请求,Via头是Via: SIP/2.0/UDP 192.168.1.100:5060;rport。经过NAT后,源地址变为203.0.113.1:1234,服务器收到后,会在Via头中添加received=203.0.113.1和rport=1234,然后响应发送到203.0.113.1:1234。客户端收到响应后,后续的消息就可以使用这个地址和端口,从而穿透NAT。
此外,rport机制主要处理的是NAT导致的端口改变问题,特别是对于SIP响应消息的路径问题。但SIP消息体中可能包含SDP信息,里面也有IP和端口,这需要另外的NAT处理机制,比如STUN、TURN或ICE,或者使用SIP中的对称编码(如更新SDP中的地址),或者ALG(应用层网关)来修改SDP内容。所以rport只是解决Via头中的响应路径问题,而SDP中的地址则需要其他方法解决。