SIP协议的消息由三部分构成,分别是起始行(请求行+状态行)、消息头和消息体(正文)
一.起始行
1. 请求消息起始行
起始行:由方法名、请求URI和协议版本组成,自身内部用逗号分割,三者之间用空格分隔。
例如:INVITE sip:5005@192.33.7.98;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响应消息,它们提供了关于响应状态、接收者信息等关键信息。常见的响应头包括:
- To、From、Call-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消息的接收方可能需要解析消息体以获取必要的会话信息。