SIP呼叫流程全解析:掌握PJSIP信号生命周期
发布时间: 2024-12-15 11:45:55 阅读量: 11 订阅数: 15
PJSIP_Developer_Guide.zip
![PJSIP 开发文档中文版本](https://img-blog.csdnimg.cn/20210427113602313.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI4MjU4ODg1,size_16,color_FFFFFF,t_70#pic_center)
参考资源链接:[PJSIP开发完全指南:从入门到精通](https://wenku.csdn.net/doc/757rb2g03y?spm=1055.2635.3001.10343)
# 1. SIP协议基础与呼叫流程概览
## 1.1 SIP协议简介
会话初始协议(SIP,Session Initiation Protocol)是一个基于文本的应用层控制协议,用于创建、修改和终止跨越IP网络的会话,比如互联网电话、多媒体会议等。SIP主要用来邀请参与者加入已有的会话,比如多方电话会议。
## 1.2 SIP呼叫流程概述
SIP呼叫流程可以分为几个主要阶段:初始化、会话建立、会话维持、会话修改以及会话终止。每一个阶段都涉及特定的SIP消息和相应的处理规则。理解这些流程对于设计和优化SIP相关的系统至关重要。
## 1.3 SIP协议的特点
SIP的设计理念是简洁、灵活和可扩展。它支持独立于媒体类型的会话,可以很容易地进行扩展以包含新的呼叫和通信功能。此外,SIP是可重定位的,这意味着终端可以移动而不会影响正在进行的通信。
在本章中,我们将对SIP协议进行基础性的介绍,并概述其呼叫流程,为深入理解后续章节内容打下坚实基础。
# 2. SIP消息结构详解
## 2.1 SIP消息的类型和格式
### 2.1.1 请求消息的构造和功能
SIP请求消息是用来初始化一个新的会话或是修改一个正在进行的会话。基本的SIP请求消息包括INVITE, ACK, CANCEL, BYE, OPTIONS和REGISTER六种类型。
构造SIP请求消息主要需要设置请求行(Request-Line)、消息头(Header)和消息体(Body)。请求行包括方法名(如INVITE或ACK)、请求的SIP URI以及SIP协议版本。
以INVITE消息为例,其功能是邀请一个用户加入一个会话。当用户A希望通过SIP网络和用户B进行通话时,用户A的设备会发送一个INVITE请求消息给用户B。INVITE请求必须包括一个SDP(Session Description Protocol)会话描述,以提供有关即将进行的媒体交换的详细信息。
代码示例:
```sip
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 151
v=0
o=alice 2890844526 2890842807 IN IP4 pc33.atlanta.com
s=-
c=IN IP4 192.0.2.1
t=0 0
m=audio 49172 RTP/AVP 0 18
a=rtpmap:0 PCMU/8000
a=rtpmap:18 G729/8000
```
逻辑分析:
- 这是一个典型的INVITE请求消息。
- 第1-8行是请求头,其中包含消息的总体信息。
- "Content-Type"字段表明了消息体是SDP数据。
- SDP部分详细描述了会话的参数,如使用的编解码器("a=rtpmap")和传输地址("c=")。
### 2.1.2 响应消息的构造和功能
SIP响应消息是对请求消息的应答,用于通知请求方请求是否被成功处理,或者请求失败的原因。
响应消息的结构和请求消息类似,但以状态行(Status Line)替代请求行,表示SIP协议版本、响应状态码和文本状态码。
以"200 OK"响应消息为例,当用户B接收到INVITE请求后,他的设备会向用户A发送一个"200 OK"响应,表明他接受会话邀请。
代码示例:
```sip
SIP/2.0 200 OK
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
To: Alice <sip:alice@atlanta.com>;tag=1928301774
From: Bob <sip:bob@biloxi.com>;tag=3421
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@biloxi.com>
Content-Type: application/sdp
Content-Length: 153
v=0
o=bob 2890844564 2890842807 IN IP4 pc33.biloxi.com
s=-
c=IN IP4 192.0.2.4
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
```
逻辑分析:
- 第一行是响应行,表示SIP/2.0 200 OK响应状态。
- 第2-11行是响应头,包含请求响应的详细信息。
- SDP消息体包含了用户B的媒体信息。
## 2.2 SIP消息头字段分析
### 2.2.1 核心头字段的作用和实例
SIP消息头字段是消息的关键组成部分,它们包含了SIP通信过程中处理消息所需要的各种信息。核心头字段包括To, From, Call-ID, CSeq, Via和Contact。
- To头字段标识了消息的目标用户。
- From头字段标识了消息的源用户。
- Call-ID头字段在SIP会话中唯一标识一个呼叫。
- CSeq头字段是一个递增的序列号,用于匹配请求和响应。
- Via头字段记录了消息的路径信息,用于防止请求重复和环路检测。
- Contact头字段提供了响应消息中发送者的联系方式。
实例:
```sip
To: <sip:bob@biloxi.com>
From: <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Contact: <sip:alice@pc33.atlanta.com>
```
逻辑分析:
- To和From头字段通常包含一个显示名称和SIP地址。
- Call-ID字段包含的是一个全局唯一的标识符。
- CSeq字段组合了请求方法和序列号。
- Via字段提供了该消息的传输路径。
- Contact字段提供了Alice的联系方式,即她的SIP URI和地址信息。
### 2.2.2 自定义头字段的使用和限制
在SIP协议中,除了核心头字段之外,还允许使用自定义头字段来扩展功能和提供额外的信息。
自定义头字段在SIP消息头中是可选的,它们通常以"H-"开头进行命名,如"H-Example: Some Value"。它们可以用于多种用途,比如携带额外的认证信息、传输应用层信息,或是进行特定业务逻辑的控制。
使用自定义头字段时,需要遵循以下限制:
- 应当避免使用自定义头字段与现有标准字段发生冲突。
- 自定义头字段必须遵循SIP消息头字段的格式规范,例如字段名不能有空格,字段值应当是可打印的ASCII码等。
- 发送方添加自定义头字段时应考虑到接收方对这些字段的理解和处理能力。
实例:
```sip
H-Sec-Flag: Encrypt
```
逻辑分析:
- 这里"H-Sec-Flag"是一个示例自定义头字段,它表示了某种特定的加密标志。
- 这样的自定义字段允许开发者添加特定的业务逻辑需求,在保证SIP消息能够被正确路由和处理的同时,还可以嵌入特定的控制信息。
## 2.3 SIP消息体的处理
### 2.3.1 内容类型与媒体格式
SIP消息体是用来承载会话描述信息的主要部分。它的"Content-Type"头字段表示了消息体的格式。
SIP最常用的媒体格式是SDP(Session Description Protocol),它用于描述会话的属性,如使用的传输协议、IP地址、端口号、编解码器类型、带宽限制等。SDP不携带媒体数据本身,而是提供了一种机制来协调两个或多个参与者之间交换媒体数据。
SDP消息体由以下部分组成:
- v=0 表示SDP协议的版本。
- o= 唯一标识符和会话ID。
- s= 会话名。
- c= 媒体信息,包括网络类型、地址类型、地址和端口。
- m= 媒体名称和传输地址。
- a= 属性字段,用于传输会话级别的属性。
代码示例:
```sdp
v=0
o=alice 2890844564 2890842807 IN IP4 pc33.atlanta.com
s=-
c=IN IP4 192.0.2.1
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
```
逻辑分析:
- SDP以"v="开始,表示SDP的版本号。
- "o="后面跟随创建者标识和会话ID。
- "s="是会话名,本例中为空。
- "c="提供关于媒体连接的信息,包含IP地址和端口号。
- "m="指出媒体类型和传输地址。
- "a="字段提供关于媒体会话的额外信息,如编解码器类型。
### 2.3.2 消息体的安全性处理
在SIP通信中,安全性是至关重要的,尤其是在VoIP应用中。消息体的安全性处理通常涉及加密、签名、摘要校验等技术,以确保消息的机密性、完整性和认证性。
消息体可以通过传输层安全(TLS)进行加密保护,它为两个通信实体之间提供安全通信。TLS通常在SIP传输层上使用,即TLS over TCP或TLS over UDP(称为TLS-TCP或TLS-UDP)。使用TLS时,需要在SIP消息头中通过"Transport"字段指定安全协议。
代码示例:
```sip
Transport: TLS/TCP
```
逻辑分析:
- "Transport"字段指示了后续的SIP消息将通过TLS加密传输。
- 这
0
0