首页 > 其他分享 >SIP消息结构详解

SIP消息结构详解

时间:2024-07-17 16:27:27浏览次数:9  
标签:SIP 请求 Header URI 响应 详解 消息

SIP协议的消息由三部分构成,分别是起始行(请求行+状态行)、消息头和消息体(正文)

一.起始行

1. 请求消息起始行

 起始行:由方法名、请求URI和协议版本组成,自身内部用逗号分割,三者之间用空格分隔。

例如:INVITE sip:[email protected];user=phone SIP/2.0

  • 方法名:SIP协议定义了一系列方法,如INVITE、ACK、CANCEL、BYE、OPTIONS、REGISTER等,每种方法对应不同的会话操作。
  • 请求URI:标识请求的目标地址,可以是SIP URI或tel URI。
  • 协议版本:指示使用的SIP协议版本,如SIP/2.0。

注意:在SIP消息中,使用的是URI (Uniform Resource Identifier:统一资源标识符),而不是URL (Uniform Resource Locator:统一资源定位符)。虽然URL是一种具体的URI类型,但URI的范围更广,它包括URL以及URN (Uniform Resource Name:统一资源名称)。 

2. 响应消息起始行

起始行:由协议版本、状态码和原因码(描述状态码,增强可读性)组成,三者之间用空格分隔。

例如:SIP/2.0 401 Unauthorized.

  • 协议版本:与请求消息中的协议版本相同,指示响应遵循的SIP协议版本。
  • 状态码:一个三位整数,用于表示请求的处理结果。状态码的第一位数字定义了响应的类别(如1xx表示临时响应,2xx表示成功响应等)。
  • 原因码:对状态码的简短文本描述,用于提供关于响应的额外信息。

 

二. 消息头

消息头紧随起始行之后,由多个SIP头域组成,每个头域由头域名、冒号和头域值组成。

SIP消息头主要可以分为通用头(General-Header)、请求头(Request-Header)、响应头(Response-Header)和实体头(Entity-Header)四种。消息头提供了关于请求/响应的额外信息,常见的SIP头域包括:

1. 通用头(General-Header)

        通用头用于提供与消息本身相关的全局信息,这些信息对请求和响应都适用。常见的通用头包括:

  • Via:定义SIP事务的下层(传输层)传输协议,并标识响应消息将要被发送的位置。它记录了请求消息经过的路径,帮助实现消息的路由和追踪。
  • Max-Forwards:指定请求消息在到达最终目的地之前可以经过的最大代理或服务器数量。这有助于防止消息在网络中无限循环。

2. 请求头(Request-Header)

        请求头用于标识和描述SIP请求消息,它们提供了关于请求发起者、接收者以及请求类型等关键信息。常见的请求头包括:

  • From:标识请求消息的发送方。它通常包含发起者的SIP URI和可选的标签(tag),用于在对话中唯一标识发送方。
  • To:标识请求消息的接收方。它同样包含接收者的SIP URI和可选的标签(tag),用于在对话中唯一标识接收方。
  • Call-ID:为整个对话过程提供一个全局唯一的标识符。它用于将相关的请求和响应消息分组到同一个对话中。
  • CSeq:表示请求消息在对话中的序列号。它由一个整数和一个请求方法名组成,用于区分对话中的不同请求。
  • Contact:在INVITE请求中,它指定了被叫方应该使用的联系地址来接收后续的SIP消息。

3. 响应头(Response-Header)

        响应头用于描述SIP响应消息,它们提供了关于响应状态、接收者信息等关键信息。常见的响应头包括:

  • ToFromCall-ID:这些头在响应消息中与请求消息中的相应头具有相同的含义,用于标识对话的双方和会话。
  • CSeq:与请求消息中的CSeq头相对应,表示响应是针对哪个请求消息的。

4. 实体头(Entity-Header)        

        实体头用于描述SIP消息体(如果存在)的属性和内容类型。当SIP消息包含消息体时,实体头就显得尤为重要。常见的实体头包括:

  • Content-Type:指定消息体的媒体类型,如“application/sdp”表示会话描述协议(SDP)的内容。
  • Content-Length:指定消息体的长度(以字节为单位)。

三. 消息体(可选)

主要用于描述会话的具体实现方式或携带额外的信息。

1. 基本概念

定义:SIP消息体是SIP消息中可选的一部分,紧随消息头之后,并通过一个空行与消息头分隔开。它可以是描述符,也可以是任何不透明物体,如XML、SDP(会话描述协议)等。

作用:SIP消息体通常用于描述会话的具体细节,如媒体类型、编解码方式、会话参数等。对于SIP代理而言,消息体的内容是完全透明的,代理不需要理解消息体的具体内容,只需将其转发给下一个节点。

2. SIP消息体的组成

SIP消息体通常包含以下几个部分:

  • Content-Type:指示消息体的类型,如text/plain、application/sdp等。这有助于接收方了解如何解析消息体。
  • Content-Length:表示消息体的长度(以字节为单位)。这有助于接收方正确地读取整个消息体。
  • 实际内容:根据Content-Type指定的类型,消息体可能包含文本、二进制数据或其他格式的数据。

例如: 当Content-Type为application/sdp时,消息体将包含SDP(会话描述协议)格式的会话描述信息。 

3. 注意事项

  • 当SIP消息不包含消息体时,空行也是必须的,以区分消息头和消息体(尽管此时消息体为空)。
  • SIP消息体的内容和格式取决于Content-Type字段的值。因此,在解析SIP消息时,需要先读取Content-Type字段以确定如何解析消息体。
  • SIP代理不需要理解消息体的具体内容,只需将其完整地转发给下一个节点即可。然而,在某些情况下(如进行媒体协商时),SIP消息的接收方可能需要解析消息体以获取必要的会话信息。

标签:SIP,请求,Header,URI,响应,详解,消息
From: https://blog.csdn.net/hao745580264_dawei/article/details/140464697

相关文章

  • linux下使用fdisk进行磁盘分区详解
     转载:https://www.cnblogs.com/renshengdezheli/p/13941563.html目录一.前言二.关于磁盘分区的结构三.fdisk命令详解四.使用fdisk进行磁盘分区4.1磁盘分区规划4.2fdisk进行磁盘分区4.3格式化分区4.4创建挂载点/挂载目录4.5挂载分区4.6设置开机自动挂载分区......
  • 【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】
     欢迎来到CILMY23的博客......
  • icacls 命令使用详解
    icacls(InteractiveCommand-LineAccessControlLists)是Windows系统中用于查看和修改文件、目录权限的命令行工具。它允许管理员或具有适当权限的用户对文件和目录的访问控制列表(ACL)进行细粒度控制。以下是icacls命令的详细使用说明及操作实例。一、icacls命令的基本语法icacls......
  • Java中的响应式编程与Reactor框架使用详解
    Java中的响应式编程与Reactor框架使用详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言响应式编程是一种面向数据流和变化传播的编程范式,它适用于处理异步数据流和事件驱动的场景。Reactor框架是在Java中实现响应式编程的强大工具,本文将深入......
  • 从基础到高级应用,详解用Python实现容器化和微服务架构
    本文分享自华为云社区《Python微服务与容器化实践详解【从基础到高级应用】》,作者:柠檬味拥抱。Python中的容器化和微服务架构实践在现代软件开发中,容器化和微服务架构已经成为主流。容器化技术使得应用程序可以在任何环境中一致运行,而微服务架构通过将应用拆分成多个独立的服务......
  • 利用Redis Stream实现一个可靠的消息队列
    RedisStreams简介RedisStreams是Redis5.0引入的一种新数据结构,专门用于处理日志和消息流数据。它结合了多种数据结构的优点,提供了高效的消息存储和消费机制。RedisStreams可以用于实时数据处理、事件驱动的系统、日志聚合和消息队列等场景。主要特点持久化:redis的p......
  • 71、Flink 的 Hybrid Source 详解
    HybridSource1.概述HybridSource解决了从异构数据源顺序读取输入以生成单个输入流的问题。示例:从S3读取前几天的有界输入,然后使用Kafka的最新无界输入,当有界文件输入完成而不中断应用程序时HybridSource会从FileSource切换到KafkaSource。在HybridSource......
  • 69、Flink 的 DataStream Connector 之 Kafka 连接器详解
    1.概述Flink提供了Kafka连接器使用精确一次(Exactly-once)的语义在Kafkatopic中读取和写入数据。目前还没有Flink1.19可用的连接器。2.KafkaSourcea)使用方法KafkaSource提供了构建类来创建KafkaSource的实例。以下代码片段展示了如何构建KafkaSource来消......
  • NetCore消息管道 Middleware
    中间件定义///<summary>///自定义中间件1///</summary>publicclassMyMiddleware:IMiddleware{publicasyncTaskInvokeAsync(HttpContextcontext,RequestDelegatenext){Console.WriteLine("MyMiddleware_1,开始处理");aw......
  • 学懂C#编程:常用框架学习(三)——.NET Framework框架下的Entity Framework (EF)开发应用详
            目录一、EntityFramework概述二、EntityFramework的核心组成部分EntityDataModel(EDM):EntityClient:ObjectServices:ADO.NETProvider:三、分层结构应用程序层:EntityFramework层:数据库层:四、EF主要的功能包括五、三种开发模式详解1.代码......