sip.Via头域深度解析

Via头域

Via:【1】定义SIP事务的下层(传输层)传输协议,【2】并标识响应消息将要被发送的位置。【3】它记录了请求消息经过的路径,帮助实现消息的路由和追踪。

【3】详解:假设有两个用户代理客户端(User Agent Client,简称UAC)UAC1和UAC2,以及两个代理服务器sip proxy serverP1P2。UAC1希望与UAC2建立SIP会话,并发送了一个INVITE请求。这个请求将依次通过P1和P2,最后到达UAC2。以“新增Via”为例:

 总结: 

  • Via头部字段记录了SIP消息所经过的完整路径。
  • 每个代理服务器在转发请求/响应时,都会在Via头部字段列表的顶部添加(或更新)/移除自己的信息。
  • 响应消息会沿着请求消息中的Via发送到发起请求的UAC

补充:

1. 更新Via

//UAC1
Via: SIP/2.0/UDP A.example.net branch=z9hG4bK123

//UAC1发送INVITE请求到P1
Via: SIP/2.0/UDP B.example.org branch=z9hG4bK456, SIP/2.0/UDP A.example.net branch=z9hG4bK123

//P1转发INVITE请求到P2
Via: SIP/2.0/UDP C.example.com:8080 branch=z9hG4bK789, SIP/2.0/UDP B.example.org branch=z9hG4bK456, SIP/2.0/UDP A.example.net branch=z9hG4bK123

2. Via 头字段的添加/更新顺序

        在SIP(Session Initiation Protocol)协议中,多个Via头字段的添加顺序是严格按照请求消息经过的代理服务器(Proxy)和用户代理(UA)的顺序来添加的。这个顺序对于SIP消息的路由和响应的返回至关重要。 Via头字段的添加顺序:

  1. (1)发起方添加:当UAC(User Agent Client,用户代理客户端)发起一个SIP请求时,它会在请求消息中添加一个Via头字段,该字段包含了UAC自身的信息(如IP地址、端口号、协议版本等)。
  2. (2)代理转发:当请求消息经过代理服务器时,每个代理服务器都会在Via头字段列表的顶部添加一个新的Via头字段部分,该部分包含了代理服务器的信息。这样,随着请求消息在网络中的传输,Via头字段列表会不断增长,每个部分都代表了一个经过的代理服务器。

响应返回时移除:

        当响应消息返回时,它会沿着与请求消息相同的路径反向传输。在传输过程中,每个代理服务器都会将其添加的Via头字段从列表中删除,以确保响应消息能够正确地返回到发起方。

注意事项

  • Via头字段中的每个部分都包含了协议名称、版本号和传输协议(如SIP/2.0/UDP),以及可能的端口号和参数(如received、rport、branch等)。
  • 分支参数(branch)是通过UA和代理被添加到Via头字段的,它用于区分请求和响应的分支,以及检测循环路由。
  • 在SIP消息的处理过程中,Via头字段的添加和删除操作是由SIP协议栈自动完成的,用户通常不需要手动干预。

Via.branch参数

        branch参数是一个随机生成的字符串,用于唯一标识一个特定的请求消息及其对应的响应消息集合,即一个事务。在SIP网络中,即使两个请求消息的其他部分完全相同,只要它们的branch参数不同,它们就会被视为两个不同的事务。即:唯一标识一个sip事务。

Via.RPort参数

        RPort代表的是“Received Port”,即sip响应消息的接收端口。这个参数在SIP通信中,特别是在存在NAT(网络地址转换)等地址转换设备时,起着至关重要的作用。RPORT机制是为了解决SIP客户端位于NAT后面时,如何确保SIP消息能够正确传输和接收的问题。

1. 背景与问题

        当SIP客户端位于NAT后面时,它发出的SIP消息中的源IP地址和端口号会被NAT设备替换为NAT的公网IP地址和一个随机的端口号。然而,SIP服务器在收到这些消息时,需要知道如何回复这些消息到原始的SIP客户端。由于SIP消息中的VIA和Contact头字段可能包含的是内网IP地址和端口号,这会导致SIP服务器无法直接将响应发送回客户端。

2. RPORT机制的工作原理

1)客户端发送请求

  • SIP客户端在发送请求时,会在VIA头字段中包含一个RPORT参数(通常不带具体值,仅作为支持该扩展的标记可选为空值)。
  • 请求经过NAT设备时,源IP地址和端口号会被NAT替换为公网IP地址和随机端口号。

2)服务器接收请求

  • SIP服务器在收到请求后,会检查VIA头字段中的RPORT参数。
  • 如果RPORT参数存在且为空值,服务器会根据接收到的UDP数据包中的源IP地址UDP数据包本身并不直接包含IP地址而是存在于UDP数据包所在的IP数据报(或称为IP包)中和端口号(即NAT的公网IP地址和随机端口号),自动填充RPORT参数的值,并在VIA头字段中添加或更新RECEIVED参数以记录这个公网IP地址。

3)服务器发送响应

  • 当SIP服务器需要发送响应给客户端时,它会根据VIA头字段中的RPORT参数和RECEIVED参数来确定目标地址和端口号。
  • 服务器将响应发送到RECEIVED参数指定的公网IP地址和RPORT参数指定的端口号上,以确保响应能够穿越NAT设备到达原始的SIP客户端。

3. RPort的作用

  •         1)确保响应正确返回:当SIP消息经过NAT等设备时,原始的IP地址和端口可能会被修改。RPort参数允许接收方(通常是SIP服务器或代理)知道消息的实际来源端口(NAT后的端口,从而确保SIP响应能够按照正确的端口发送回原始发送者(客户端)。
    •         2)支持NAT穿透:在NAT环境下,SIP通信可能会遇到难以直接穿透NAT的问题。RPort机制是解决这一问题的重要手段之一,它允许SIP服务器或代理通过记录并使用正确的源端口号(NAT后的端口来发送响应,从而实现NAT穿透。

Via.received字段

        received字段是Via头域中一个重要的组成部分,它记录了SIP消息在传输过程中,【1】经过的最后一个设备(如SIP服务器或NAT设备)的IP地址。这个IP是从IP包中获取

举例:rport和received参数获取

         

        若UAS在NAT后,当sip消息经过NAT后,src ip和src port变成了公网的ip和端口,上图中的RPort和Received值即为公网的ip和端口。 

【1】sip消息经过多个代理服务器

  • 23
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值