SIP(Session Initiation Protocol,会话初始协议)
SIP(Session Initiation Protocol,会话初始协议)的开发目的是用来帮助提供跨越因特网的高级电话业务。因特网电话(IP电话)正在向一种正式的商业电话模式演进,SIP就是用来确保这种演进实现而需要的NGN(下一代网络)系列协议中重要的一员。支持H.264协议
SIP学习笔记 2007-12-28 21:39:23
学习 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
From: Nikola Tesla ;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:
<=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 ;tag=a53e42 <=上已提到,To tag 做为被叫方标识
From: Nikola Tesla ;tag=76341 <=要求很发送方 From tag 一致
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact:
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 ;tag=a53e42
From: Nikola Tesla ;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact:
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 ;tag=a53e42
From: Nikola Tesla ;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 ;tag=76341
From: G. Marconi ;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 ;tag=76341
From: G. Marconi ;tag=a53e42
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0
到此,就是最简单的呼叫过程。该过程简单在于两个终端之间没有其它设备,完全的点对点连接,它们之间只需要知道对方 IP 地址即可。现实生活中这种呼叫形式是很少见的。
SIP(Session Initiation Protocol,会话初始协议)的更多相关文章
- SIP (Session Initiation Protocol) 协议
Session Initiation Protocol 介绍 SIP是VoIP技术最常使用的协议,它是一种应用程序层协议,可与其他应用程序层协议配合使用,以控制Internet上的多媒体通信会话. V ...
- [百科] - SIP(会话发起协议)
SIP(会话发起协议)SIP是类似于HTTP的基于文本的协议.SIP可以减少应用特别是高级应用的开发时间.由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的深远意义 ...
- SIP协议 会话发起协议(一)
会话发起协议(SIP)是VoIP技术中最常用的协议之一.它是一种应用层协议,与其他应用层协议协同工作,通过Internet控制多媒体通信会话. SIP - 概述 以下是有关SIP的几点注意事项 - S ...
- 【转】SIP协议 会话发起协议
转自:https://www.cnblogs.com/gardenofhu/p/7299963.html 会话发起协议(SIP)是VoIP技术中最常用的协议之一.它是一种应用层协议,与其他应用层协议协 ...
- SIP会话发起协议 - 先知道是什么(一)
少年,思无邪,最最动人. 协议概述 SIP会话发起协议是VoIP技术中最常用的协议之一.它是一种应用层协议,与其它应用层协议协同工作,通过Internet控制多媒体通信会话. SIP采用SDP(会话描 ...
- Android呼叫管理服务之会话发起协议(SIP)API
原文:http://android.eoe.cn/topic/android_sdk Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话功能到你的应用程序. ...
- Android网络功能之会话发起协议SIP
原文:http://android.eoe.cn/topic/android_sdk * 会话发起协议* Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话 ...
- Session攻击(会话劫持+固定)与防御
1.简介 Session对于Web应用无疑是最重要的,也是最复杂的.对于web应用程序来说,加强安全性的第一条原则就是 – 不要信任来自客户端的数据,一定要进行数据验证以及过滤,才能在程序中使用,进而 ...
- 会话描述协议(SDP)介绍
1.SDP的引入 SDP最初用于Mbone(组播骨干网)上的多媒体会议.Mbone 是Internet 的一部分,它的主要特征是对IP组播技术的使用.IP组播技术比较适合实现多方会话. 基于组播的会议 ...
随机推荐
- bzoj 2434 ac自动机
ac自动机中,如果以trie中的节点为节点,(fail[i],i)为边,可以建立一颗树,该树有如下特点:“节点u是节点v的祖先 当且仅当 u代表的字符串是v代表的字符串的一个后缀”.(u代表的字符串是 ...
- 国内OCR供应商及其演示链接
最近因为需要收集了一些OCR的供应商,可以做身份证识别,银行卡识别,名片识别等特定场景下的文字识别.在通用场景下的文字识别效果还不是很理想.现在OCR在特定的场景下做得已经很不错了.下面列出下这些厂商 ...
- Linux下同一网段内的IP中两台主机通信不经过路由器(ARP)(转)
答案一:同一网段A与B通信,不需要路由器介入. A直接广播ARP request 到广播域,B处于同一广播域,可以接收到ARP request,B用单播方式直接告诉A自己的MAC B 地址.A收到B的 ...
- 升压转换器 (Boost)
升压转换器 (Boost) 需要将输入电压转换为较高的输出电压时,升压转换器 (Boost)是唯一的选择. 升压转换器透过内部 MOSFET 对电压充电来达成升压输出的目的,而当 MOSFET 关闭时 ...
- 源码分析:动态分析 Linux 内核函数调用关系
源码分析:动态分析 Linux 内核函数调用关系 时间 2015-04-22 23:56:07 泰晓科技 原文 http://www.tinylab.org/source-code-analysi ...
- zookeeper集群,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。
zookeeper集群,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的.
- 【docker】【redis】1.docker安装redis【单点redis服务】
1.首先确定 需要在docker上拉取redis的哪个版本的镜像 [由于使用了aliyun的源,并且加速器也是用的阿里云的加速器,所以直接在阿里云开发者平台上找redis的镜像有哪些版本是再好不过了, ...
- android基础知识普及
1.密度问题及相互转换 测试机 philips w732 480X800 density 1.5 scaledDensity 1.6500001 通过 context.getResources().g ...
- koa2搭建服务器+使用mongoose链接mangodb
使用node搭建服务器,用到了现在比较流行的框架koa. 1.初始化package.json npm init -y 2.安装koa2 npm i koa --save 3.搭建服务器 const K ...
- go语言基础之defer和匿名函数结合使用
1.匿名函数结合使用 示例1: package main //必须 import "fmt" func main() { a := 10 b := 20 defer func() ...