Via头域
Via:【1】定义SIP事务的下层(传输层)传输协议,【2】并标识响应消息将要被发送的位置。【3】它记录了请求消息经过的路径,帮助实现消息的路由和追踪。
【3】详解:假设有两个用户代理客户端(User Agent Client,简称UAC)UAC1和UAC2,以及两个代理服务器(sip proxy server)P1和P2。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)发起方添加:当UAC(User Agent Client,用户代理客户端)发起一个SIP请求时,它会在请求消息中添加一个Via头字段,该字段包含了UAC自身的信息(如IP地址、端口号、协议版本等)。
- (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消息在传输过程中,经过的最后一个设备(如SIP服务器或NAT设备)的IP地址。这个IP是从IP包中获取。
举例:rport和received参数获取
若UAS在NAT后,当sip消息经过NAT后,src ip和src port变成了公网的ip和端口,上图中的RPort和Received值即为公网的ip和端口。
标签:头域,SIP,请求,IP地址,sip,NAT,Via,端口号 From: https://blog.csdn.net/hao745580264_dawei/article/details/140497834