原文地址:http://blog.chinaunix.net/uid-20655530-id-1589483.html
学习 SIP 协议最快捷的方法是通过范例来学习,
找到了一个完整的呼叫流程,let's go!
INVITE
主叫方Tesla首先发起 INVITE 消息到被叫方Marconi。INVITE 消息包含会话类型和一些呼叫所必须的参数。会话类型可能是单纯的语音,也可能是网络会议所用的多媒体视频,还可能是游戏会话。下面是消息体范例,我们来详细分析各个字段的意义。
INVITE sip:marconi@radio.org SIP/2.0
<= 请求方法、请求地址(Request-URI)、SIP 版本号(目前都是 SIP/2.0)
<= 请求地址一般就是被叫方地址,跟 MSN 中好友 eMail 地址类似
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
<=SIP 版本号(2.0)、传输类型(UDP)、呼叫地址、
<=branch是一随机码,它被看作传输标识
<=Via 字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成
<=传输类型可以为 UDP、TCP、TLS、SCTP
Max-Forwards: 70
<=最大跳跃数,就是经过 SIP 服务器的跳跃次数,主要是防止循环跳跃
<=每尽管一台代理服务器,该整数减一
To: G. Marconi <sip:Marconi@radio.org>
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
<=表示请求消息的发送方和目标方
<=如果里面有用户名标签,地址要求用尖括号包起来
<=对于 INVITE 消息,可以在 From 字段中包含 tag,它也是个随机码
Call-ID: 123456789@lab.high-voltage.org
<=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变
<=对于用户代理发送 INVITE 消息,本地将生成 From tag 和 Call-ID 全局唯一码,被叫方代理则生成 To tag 全局唯一码。这三个随机码做为整个对话中对话标识(dialog indentifier)在通话双方使用。
CSeq: 1 INVITE
<=CSeq,又叫命令队列(Command Seqence),每发送一个新的请求,该数自动加1
* 以上几个字段是所有 SIP 消息体所必须的,其它头字段有些是可选的,有些在特定请求也是必须
Subject: About That Power Outage...
Contact: <sip:n.tesla@lab.high-voltage.org>
<=Contact 是 INVITE 消息所必须的,它用来路由到被叫设备地址,也称为用户代理(UA)
Content-Type: application/sdp
Content-Length: 158
<=最后两位附属字段说明消息体类型以及字段长度
v=0 <=SDP版本号,目前都是 0
o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org <=主叫源地址,类型等
s=Phone Call <=主题
c=IN IP4 100.101.102.103 <=连接
t=0 0 <= 时间戳
m=audio 49170 RTP/AVP 0 <=媒体
a=rtpmap:0 PCMU/8000 <=媒体属性
<=从上面 SDP 消息体我们可以得出下面信息
<=连接 IP 地址:100.101.102.103
<=媒体格式:audio
<=端口号:49170
<=媒体传输类型:RTP
<=媒体编码:PCM u Law
<=采样率:8000 Hz
180 Ringing
当被叫方接收到 INVITE 请求消息后,将回复 180 Ringing。顾名思义,就是发回铃音,提示主叫方电话已连接上了,正等待被叫应答。被叫方接收到 INVITE 消息后也会发生响铃或者其它有呼入提示,这由被叫方设定(我们可以把它想象成我们自己设定手机铃声)。对于 180 响应又被称为“消息及时响应”,它是一种用来测试被叫状态的一种响应。因此它所包含的信息不多,具体 180 响应消息如下:
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103 <=这里增加一个 received 参数,标识接收方 IP 地址
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42 <=上已提到,To tag 做为被叫方标识
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341 <=要求很发送方 From tag 一致
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
Content-Length: 0
<=对于 180 Ringing 响应,基本上就是将 INVITE 的 Via、To、From、Call-ID 和 CSeq 内容复制过来,对于首行标出 SIP 版本号,响应代码(180)和动作原因(reason phrase)
<=注意这里 From 和 To 地址,因为它们用来指定呼叫方向,因此这里的 200 OK 响应并没有将地址对调,仍然保持原样。一点不同的是 To 头字段添加了由被叫方 Marconi 生成的tag 标识
200 Ok
被叫响铃后,如果被叫用户 Marconi 接起电话,则发出 200 OK 响应。这个响应除了做为接通指示之外,还有一个功能是用来指定被叫允许的连接媒体格式,让主叫方确认是否可以接收该媒体。
消息体如下
SIP/2.0 200 OK
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
Content-Type: application/sdp
Content-Length: 155
<=头字段部分基本同上
v=0
o=Marconi 2890844528 2890844528 IN IP4 tower.radio.org
s=Phone Call
c=IN IP4 200.201.202.203
t=0 0
m=audio 60000 RTP/AVP 0
a=rtpmap:0 PCMU/8000
<=从上面 SDP 消息体我们可以得出下面信息
<=终端 IP 地址:200.201.202.203
<=媒体格式:audio
<=端口号:60000
<=媒体传输类型:RTP
<=媒体编码:PCM u Law
<=采样率:8000 Hz
ACK
通话前最后一步是主叫方确认 200 OK响应。该项确认证明连接被允许,即将使用另一种协议开始媒体连接。这另一种协议是上面在 SDP 消息段中所协商好的 RTP 格式。该 ACK 响应内容如下:
ACK sip:marconi@tower.radio.org SIP/2.0
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g
Max-Forwards: 70
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 ACK
Content-Length: 0
BYE
通话完毕后,由被叫方 Marconi 首先挂机,发送 BYE 请求命令。注意这回由 Marconi 做为主叫方了,因此 Via 字段和 From、To 与 INVITE 字段有所不同。其实也就是倒置。
BYE sip:n.tesla@lab.high-voltage.org SIP/2.0
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
Max-Forwards: 70
To: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;tag=a53e42
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0
200 OK
BYE 之后,要求被叫方发 200 Ok 确认,也就是让主叫知道被叫已经知道你挂断了。(注意这里所说的主被叫角色已经倒过来了)打个比方,通话之后,有一方要求挂机,另一方需要知道它已经挂机了。
SIP/2.0 200 OK
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
;received=200.201.202.203
To: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;tag=a53e42
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0
到此,就是最简单的呼叫过程。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方 IP 地址即可。现实生活中这种呼叫形式是很少见的。
相关推荐
### CISCO语音学习笔记知识点梳理 #### 章节一:语音基础 ##### 导入 - **语音的分类**: - 传统语音:基于电路交换技术,通话前需占用一条物理线路。 - 按接口划分: - 类比语音:FXS(Foreign Exchange ...
"IMS学习笔记" IMS(IP Multimedia Subsystem)是下一代网络核心网的解决方案,旨在解决当前电信网络核心网建设中面临的挑战。 IMS 的出现标志着电信网络的发展趋势从传统的 TDM 网络向 IP 网络的转变。 IMS 基础...
【Yate学习笔记】 Yate,全称Yet Another Telephony Engine,是一款先进的网络电话引擎,致力于提供一个可扩展且高效的电话服务解决方案。本篇笔记主要涵盖Yate的基础知识和开发要点。 ### 安装与运行 在Ubuntu...
这份压缩包包含了一份详尽的Java学习笔记,旨在帮助初学者快速掌握Java编程基础,并深入理解SIP在通信系统中的应用。 Java作为一门广泛使用的面向对象的编程语言,它的强大之处在于其跨平台性、丰富的类库和强大的...
- 学习笔记通常包含对编程概念的解释,如变量、数据类型、控制流语句、类和对象等基础概念。 - 可能涵盖了异常处理、集合框架、多线程、I/O流、反射、注解等高级主题。 - 特别强调了JDK 5.0的新特性,这包括自动...
### ASN.1中文学习笔记详解 #### 一、概述 **ASN.1**(Abstract Syntax Notation One)是一种由国际电信联盟(ITU-T)制定的标准,主要用于定义数据类型的抽象语法,并规定了如何对这些数据类型进行编码,使得这些数据...
从给定的“Voice学习笔记”中,我们可以提炼出一系列重要的IT知识点,主要围绕语音通信技术,特别是IP语音(VoIP)以及相关的硬件和网络配置。以下是对这些知识点的详细阐述: ### 语音基础 #### 导入 - **语音...
【AVR单片机详解与汇编语言编程】 AVR单片机是由ATMEL公司于1997年推出的基于精简指令集...通过学习AVR单片机的结构、特点和编程,开发者可以掌握基础的微控制器设计和应用,为更深入的嵌入式系统开发打下坚实的基础。
【标题】:“MyNote:日常学习笔记” 这个标题暗示了一个个人知识管理的项目,其中包含了作者在日常学习过程中的各种笔记。"MyNote"可能是作者自己创建的一个笔记系统或者存储笔记的文件夹,用于整理和归类他在不同...
本压缩包文件提供了全面的Allegro入门中文学习资源,包括学习笔记、速成教材和中文教程,旨在帮助初学者快速掌握这一专业软件。 一、Allegro基础知识 Allegro的核心功能是电路板设计(PCB Design),它集成了原理图...
学习FreeSWITCH,需要理解基本的VoIP概念,了解TCP/IP网络,以及一定的编程基础。同时,熟悉XML语法也有助于更好地管理和定制FreeSWITCH的配置。实际操作中,可以先搭建一个本地环境,通过CLI尝试发送命令,观察系统...
Resiprocate提供了完整的SIP服务器、客户端和代理功能,为开发者提供了构建实时通信系统的基础。 在对Resiprocate源码进行分析时,我们需要理解其核心架构和设计模式。源码分析通常包括以下几个方面: 1. **模块...
其中的文档“RTSP协议学习笔记.doc”可能详细介绍了RTSP的基础概念、工作原理以及相关的实现技术。 RTSP协议主要用于在客户端和服务器之间建立和控制媒体流的传输,其核心目标是提供一个可扩展的框架,以便于服务器...
在【JAVA基础培训】部分,课程包括了尚学堂的最新JAVA系列培训,共计18辑300小讲,内容涵盖源代码和PPT笔记。此外,还有IBM Software Institute的Java认证实录,以及张孝祥的JAVA就业培训,这些课程不仅讲解基础概念...
通过这个中文教程,开发者不仅可以了解PyQt5的基础知识,还能深入学习其高级特性和实际应用,为开发高质量的Python GUI程序打下坚实的基础。在学习过程中,建议结合实际编程实践,将理论知识转化为动手能力,以达到...
**网络电话**是一种使笔记本电脑、台式机以及其他计算机设备(如PDA)能够在互联网协议基础上发起语音会话(VoIP)的程序。随着互联网电话提供商如Vonage和Skype等的出现,它们不仅提供了网络电话服务,还提供了网络...
CM7动手实验指南是一份旨在帮助读者通过实验方式熟悉Cisco CM的指南文档。该指南详细介绍了如何通过实验...通过这份指南,用户可以在纯虚拟机环境中学习和掌握Cisco CM的各项操作,为实际工作中的应用打下坚实的基础。
3. **TCP/IP**:传输控制协议/因特网协议(Transmission Control Protocol/Internet Protocol)是互联网的基础,负责数据包在网络中的传输。TCP保证了数据的可靠传输,而IP负责寻址和路由。通过阅读TCP/IP的中文文档...
总的来说,这份资料涵盖了充电电池与集成电路芯片封装的基础知识,对于电子工程师和相关从业者来说,是深入理解产品设计和优化的重要参考资料。通过对这些内容的深入学习,我们可以更好地理解和评估电子产品的性能...