SIP学习(实例详解)
本文摘自: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 地址即可。现实生活中这种呼叫形式是很少见的。
SIP学习(实例详解)的更多相关文章
- 这个贴子的内容值得好好学习--实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化
感觉要DJANGO用得好,ORM必须要学好,不管理是内置的,还是第三方的ORM. 最最后还是要到SQL.....:( 这一关,慢慢练啦.. 实例详解Django的 select_related 和 p ...
- expect学习笔记及实例详解【转】
1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...
- 官网实例详解-目录和实例简介-keras学习笔记四
官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras 版权声明: ...
- JavaScript学习笔记-实例详解-类(二)
实例详解-类(二) //===给Object.prototype添加只读\不可枚举\不可配置的属性objectId(function(){ Object.defineProperty(Object ...
- JavaScript学习笔记-实例详解-类(一)
实例详解-类(一): //每个javascript函数(除了bind())都自动拥有一个prototype对象// 在未添加属性或重写prototype对象之前,它只包含唯一一个不可枚举属性const ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)
最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...
- Linux下rz命令使用的实例详解
Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,下面将通过几个实例来给大家详细介绍下Linux下rz命令的用法,一起来学习下吧. rz命令可以批量上传文件,当然也可上传单 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(六)媒体查询
响应式设计的另一个重要技术手段是媒体查询.如果只是简单的设计一个流式布局系统,那么可以保证每个网格按比例的放大和缩小,但有可能会使得在小屏幕下(如手机设备)网格太小而严重影响阅读,这样的设计称不上响应 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(五)图解通过Fiddler加速开发
Fiddler是Windows底下最强大的请求代理调试工具,监控任何浏览器的HTTP/HTTPS流量,窜改客户端请求和服务器响应,解密HTTPS Web会话,图4.44为Fiddler原理示意图. 图 ...
随机推荐
- WCF 采用net.tcp协议实践
概述 与Socket相比,WCF真是爽得不得了,其基本指导思想为SOA——面向服务. 其基本配置在于ABC(Address,Binding,Contract),通常,只要这三个因素配置对了,那么,基本 ...
- bzoj1028 [JSOI2007]麻将
1028: [JSOI2007]麻将 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1337 Solved: 601[Submit][Status][ ...
- BZOJ3463 : [COCI2012] Inspector
考虑将序列分成$\sqrt{n\log n}$块,每块维护下凸壳,修改时在相应块打上需要修改的标记. 查询时,对于两端零散部分暴力查询. 对于中间的块,如果有修改标记,则暴力重构. 然后在凸壳上查询时 ...
- BZOJ3830 : [Poi2014]Freight
首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1) 然后设f[i]表示前i列车回来的最早时刻 f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1) ...
- windows phone7 豆瓣FM
HubTile参考了下,就做了一个豆瓣的FM应用 豆瓣的API在百度里查一下. 整个应用很简单,无非是解析豆瓣的JSON数据,然后读取,下载图片和歌单
- 转:jQuery Ajax 实例 全解析
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...
- 关于Ruby的一些知识
1 -9/2 = -5 当进行一个除法运算的结果是一个负数的时候,由于Ruby采取向负无穷大圆整,所以结果是-5.而由于除数是个整数,所以结果也是一个整数.而其他语言多数是向0取整. 2 连接字符串建 ...
- JS中检测数据类型的四种方式及每个方式的优缺点
//1.typeof 用来检测数据类型的运算符 //->typeof value //->返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number". ...
- iOS移动开发周报-第21期
iOS移动开发周报-第21期 [摘要]:本期iOS移动开发周报带来如下内容:苹果iCloud中国数据转存中国电信,Swift Operators,100 个 Swift 必备 tips,FLEXLoa ...
- 紧挨导航栏下的链接a标签失效
在我编完网页测试的的时候,发现导航下的链接不能用,不出现小手的图表,而下面的相同的链接都能用.如下图所示 遇到的相同问题的另一个未完成的页面如图 先不谈论其原因,说一下我对第一个页面的解决办法,我在导 ...