首页 > 其他分享 >sip.Via头域深度解析

sip.Via头域深度解析

时间:2024-07-17 16:28:04浏览次数:19  
标签:头域 SIP 请求 IP地址 sip NAT Via 端口号

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. (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消息在传输过程中,经过的最后一个设备(如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

相关文章

  • SIP消息结构详解
    SIP协议的消息由三部分构成,分别是起始行(请求行+状态行)、消息头和消息体(正文)一.起始行1.请求消息起始行 起始行:由方法名、请求URI和协议版本组成,自身内部用逗号分割,三者之间用空格分隔。例如:INVITE sip:[email protected];user=phone SIP/2.0方法名:SIP协议定义了一系列......
  • WPF read data from mysql and display via ADO.NET
    //xaml<Windowx:Class="WpfApp216.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • C++11平凡可复制类型检测is_trivially_copyable
    1.C++基础回顾     在C++11中,平凡类型(TrivialType)、平凡可复制类型(TrivialCopyable)、标准布局类型(Standard-layoutType)是描述类在内存中布局特性的术语,它们与类的构造、拷贝、赋值和销毁行为有关,也影响着类的内存布局和对齐方式。下面用通俗的语言解释这些概念:1.1.平......
  • Why can‘t I access GPT-4 models via API, although GPT-3.5 models work?
    题意:为什么我无法通过API访问GPT-4模型,尽管GPT-3.5模型可以工作?问题背景:I'mabletousethegpt-3.5-turbo-0301modeltoaccesstheChatGPTAPI,butnotanyofthegpt-4models.HereisthecodeIamusingtotestthis(itexcludesmyopenaiAPIkey).Theco......
  • Improving News Recommendation via Bottlenecked Multi-task Pre-training论文阅读笔
    ImprovingNewsRecommendationviaBottleneckedMulti-taskPre-training论文阅读笔记Abstract现存的问题:​ 现有的PLM大多是在大规模通用语料库上预先训练的,并没有专门用于捕捉新闻文章中的丰富信息。因此,它们生成的新闻嵌入信息可能不足以表示新闻内容或描述新闻之间的关......
  • WPF generate rows and columns via C# dynamically
    //xaml<Windowx:Class="WpfApp214.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • WPF Canvas ZoomIn ZoomOut via set Background="Transparent"
    <CanvasGrid.Column="1"Background="Transparent"x:Name="cvs"ClipToBounds="True"MouseWheel="cvs_MouseWheel"MouseDown="cvs_MouseDown"MouseUp="cvs_MouseUp"MouseMove="cvs_......
  • How to link multiple docker-compose services via network
    Howtolinkmultipledocker-composeservicesvianetworkNewscenario:SharinganetworkbetweenservicesIfyouwantdefineservicesinmultipledocker-compose.ymlfiles,andalsohavenetworkconnectivitybetweentheservices,youneedtoconfigureyou......
  • WPF WebBrowser navigate to website via url and escape script error warning
    Copyfrom https://www.iditect.com/faq/csharp/wpf-webbrowser-control--how-to-suppress-script-errors.html#:~:text=To%20suppress%20these%20script%20errors%2C%20you%20can%20handle,using%20the%20Cancel%20property%20of%20the%20WebBrowserNavigatingEventArgs%20pa......
  • WPF display and host pdf via WebBrowser
    //xaml<Windowx:Class="WpfApp206.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......