作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

1、SIP业务基本知识

1.1 业务介绍

会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始、管理和终止网络中的语音和视频会话,具体地说就是用来生成、修改和终结一个或多个参与者之间的会话。SIP的业务模式是一个点对点协议,其中有两个要素——SIP用户代理和SIP网络服务器。用户代理是呼叫的终端系统元素,而SIP服务器是处理与多个呼叫相关联信令的网络设备。用户代理本身具有一客户机元素(用户代理客户机UAC)和一服务器元素(用户代理服务器UAS)。客户机元素初始呼叫而服务器元素应答呼叫。这允许点到点的呼叫通过客户机-服务器协议来完成。下图是SIP业务的网络结构和各个参与者的关系。

SIP业务的核心特点集中在SIP的设计目标之一是提供类似公用交换电话网(PSTN)中呼叫处理功能的扩展集。在这个扩展集中,实现类似日常电话的操作:拨号,振铃,回铃音或者忙音,只是实现方式和术语有所不同。SIP也实现了许多信令系统7(SS7)中更高级的呼叫处理功能,尽管这两个协议相差很远。SS7是一个高度集中处理的协议,其特点表现为高复杂度的中心网络结构和无智能的哑终端(传统的电话机)。SIP则是一个点对点协议,所以它只需要一个相对简单的(因此也高度可扩展的)核心网络,而将处理工作下放给连接在网络边缘的智能端点(装有硬件或软件的终端设备)。SIP的许多功能在端点中实现,这与传统的SS7将其在网络核心设备实现的作法大异其趣。而协议的其他特点还有它是一个文本协议,所以易于调测,结构灵活;而且它是一个中性的底层传输协议,可用TCP或UDP(推荐UDP);同时呼叫和媒体信息同时传送:媒体信息的传送由SDP传送

SIP是互联网工程任务组(IETF)多媒体数据和控制体系结构的一个组成部分,因此它与IETF的许多其他协议都有联系,例如RTP(实时传输协议)和SDP协议。SIP与许多其它的协议协同工作,仅仅涉及通信会话的信令部分(control message)。SIP报文内容传送会话描述协议(SDP),SDP协议描述了会话所使用流媒体细节,如:使用哪个IP端口,采用哪种编解码器等等。SIP的一个典型用途是:SIP“会话”传输一些简单的经过封包的实时传输协议流。RTP本身才是语音或视频的载体。

1.2 业务过程和协议流程

Ø 注册流程:

(1)用户首次试呼时,终端代理A 向代理服务器发送REGISTER 注册请求;

(2)代理服务器通过后端认证/计费中心获知用户信息不在数据库中,便向终端代理回送401Unauthorized 质询信息,其中包含安全认证所需的令牌;

(3)终端代理提示用户输入其标识和密码后,根据安全认证令牌将其加密后,再次用REGISTER 消息报告给代理服务器;

(4)代理服务器将REGISTER 消息中的用户信息解密,通过认证/计费中心验证其合法后,将该用户信息登记到数据库中,并向终端代理A 返回成功响应消息200 OK。

Ø 注销流程:

(1)终端向代理服务器发送register消息注销,其头中expire字段设置为0。

(2)代理服务器在收到后送回200OK响应,并将数据库中的用户有关消息注销。

Ø 基本呼叫建立过程:

(1)用户摘机发起一路呼叫,终端代理A向该区域的代理服务器发起Invite请求;

(2)代理服务器通过认证/计费中心确认用户认证已通过后,检查请求消息中的Via头域中是否已包含其地址。若已包含,说明发生环回,返回指示错误的应答;若没有问题,代理服务器在请求消息的Via头域插入自身地址,并向Invite消息的To域所指示的被叫终端代理B传送Invite请求。

(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。

(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。

(5)终端代理B指示被叫用户振铃,用户振铃后向代理服务器发送180Ringing振铃信息。

(6)代理服务器向终端代理A转发被叫用户振铃信息。

(7)被叫用户摘机,终端代理B向代理服务器返回表示连接成功的应答(200OK)

(8)代理服务器向终端代理A转发该成功指示(200OK)

(9)终端代理A收到信息后,向代理服务器发ACK信息进行确认

(10)代理服务器将ACK确认消息转发给终端代理B。

(11)主被叫用户之间建立通信连接,开始通话。

Ø 正常呼叫释放过程:

(1) 正常呼叫

(2) 用户通话结束后,被叫用户挂机,终端代理B向代理服务器发送Bye消息。

(3) 代理服务器转发Bye消息至终端代理A,同时向认证、计费中心发送用户通话的详细信息,请求计费。

(4) 主叫用户挂机后,终端代理A向代理服务器发送确认挂断响应信息200OK。

(5) 代理服务器转发响应信息200OK。

Ø 会话更改流程:

(1)用户代理服务端和代理客户端正常通话。

(2)用户代理服务端向用户代理客户端发送Invite信息,带有新的SDP协商信息。

(3)用户处理客户端回复200OK,并将协商后的SDP信息带回。

(4)用户代理服务端发送ACK给用户代理客户端进行确认。

Ø 被叫忙呼叫释放:

(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;

(2)代理服务器向被叫终端代理B传送Invite请求。

(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。

(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。

(5)呼叫请求送到被叫终端代理B后,被叫忙,终端代理B向代理服务器送486被叫忙响应。

(6)代理服务器向终端代理A转发该响应消息。

(7)终端代理A向代理服务器回送ACK确认消息。

(8)代理服务器向终端代理B送ACK确认信息。

Ø 被叫无应答流程一:

(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;

(2)代理服务器向被叫终端代理B传送Invite请求。

(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。

(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。

(5)被叫用户振铃,终端代理B向代理服务器送180Ring响应。

(6)代理服务器向终端代理A转发该响应信息。

(7)被叫久振铃无应答,终端代理A判断超时后向代理服务器送Cancel消息放弃该呼叫。

(8)代理服务器收到Cancel消息后,向终端代理A回送200OK响应。

(9)代理服务器将Cancel消息转发给终端代理B。

(10)终端代理B向代理服务器回送200OK响应。

(11)终端代理B向代理服务器送487请求已撤销的响应信息。

(12)代理服务器收到后回送ACK确认。

(13)代理服务器向终端代理A送487请求已撤销消息。

(14)终端代理A向代理服务器回送ACK确认。

注:以上步骤中的(10)到(12)无严格顺序关系。

Ø 被叫无应答流程二:

(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;

(2)代理服务器向被叫终端代理B传送Invite请求。

(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。

(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。

(5)被叫用户振铃,终端代理B向代理服务器送180Ring响应。

(6)代理服务器向终端代理A转发该响应信息。

(7)被叫久振铃无应答,终端代理B判断超时后向代理服务器送408Requesttimeout消息放弃该呼叫。

(8)代理服务器收到408Requesttimeout消息后,转发该消息给终端代理A。

(9)代理服务器回送ACK确认给终端代理B。

(10)终端代理A向代理服务器回送ACK确认。

注:以上步骤中的(9)到(10)无严格顺序关系。

Ø 遇忙呼叫前转:

(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;

(2)代理服务器向被叫终端代理B传送Invite请求。

(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。

(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。

(5)终端代理B忙线中,B向代理服务器发送486Busy Here响应。

(6)代理服务器向终端代理B发送ACK确认消息。

(7)代理服务器对此呼叫进行前转,向代理服务器C发送Invite请求消息。

(8)代理终端C收到后指示用户振铃,同时向代理服务器发送180Ringing响应。

(9)代理服务器向A转发收到的180Ringing响应。

(10)被叫用户C摘机接听电话,终端代理C向代理服务器返回表示连接成功的应答(200OK)

(11)代理服务器向终端代理A转发该成功指示(200OK)

(12)终端代理A收到信息后,向代理服务器发ACK信息进行确认

(13)代理服务器将ACK确认消息转发给终端代理B。

建立通信连接,开始通话。

(14)主叫用户挂机,终端代理A向代理服务器发送Bye消息,请求挂机。

(15)代理服务器转发Bye消息至终端代理C,指示C挂机。

(16)终端代理C向代理服务器发送确认挂断响应信息200OK。

(17)代理服务器转发响应信息200OK至A。

Ø 无应答呼叫前转流程:

(1)用户A摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;

(2)代理服务器向被叫终端代理B传送Invite请求。

(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。

(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。

(5)被叫用户振铃,终端代理B向代理服务器送180Ring响应。

(6)代理服务器向终端代理A转发该响应信息。

(7)被叫久振铃无应答,代理服务器判断超时后向代理终端B送Cancel消息放弃该呼叫。

(8)代理终端B收到Cancel消息后,向代理服务器回送200OK响应。

(9)终端代理B向代理服务器送487请求已撤销的响应信息。

(10)代理服务器向终端代理B回送200OK响应。

(11)代理服务器对此呼叫进行前转,向代理服务器C发送Invite请求消息。

(12)代理终端C收到后指示用户振铃,同时向代理服务器发送180Ringing响应。

(13)代理服务器向A转发收到的180Ringing响应。

(14)被叫用户C摘机接听电话,终端代理C向代理服务器返回表示连接成功的应答(200OK)

(15)代理服务器向终端代理A转发该成功指示(200OK)

(16)终端代理A收到信息后,向代理服务器发ACK信息进行确认

(17)代理服务器将ACK确认消息转发给终端代理C。

建立通信连接,开始通话。

(18)主叫用户挂机,终端代理A向代理服务器发送Bye消息,请求挂机。

(19)代理服务器转发Bye消息至终端代理C,指示C挂机。

(20)终端代理C向代理服务器发送确认挂断响应信息200OK。

(21)代理服务器转发响应信息200OK至A。

Ø 呼叫保持:

(1)用户摘机发起一路呼叫,终端代理A向该区域的代理服务器发起Invite请求;

(2)代理服务器通过认证/计费中心确认用户认证已通过后,检查请求消息中的Via头域中是否已包含其地址。若已包含,说明发生环回,返回指示错误的应答;若没有问题,代理服务器在请求消息的Via头域插入自身地址,并向Invite消息的To域所指示的被叫终端代理B传送Invite请求。

(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。

(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。

(5)终端代理B指示被叫用户振铃,用户振铃后向代理服务器发送180Ringing振铃信息。

(6)代理服务器向终端代理A转发被叫用户振铃信息。

(7)被叫用户摘机,终端代理B向代理服务器返回表示连接成功的应答(200OK)

(8)代理服务器向终端代理A转发该成功指示(200OK)

(9)终端代理A收到信息后,向代理服务器发ACK信息进行确认

(10)代理服务器将ACK确认消息转发给终端代理B。

(11)主被叫用户之间建立通信连接,开始通话。

(12)代理终端B向代理服务器发送Reinvite消息,SDP的c域等于0,0,0,0。

(13)代理服务器转发此信息给代理终端A。

(14)代理终端A收到Reinvite后回应200OK响应。表示接受会话更改,同事根据协商结果修改会话方式。

(15)代理服务器转发200OK给代理终端B。

(16)代理终端B收到消息后向代理服务器发送ACK消息进行确认。

(17)代理服务器将ACK确认消息转发到代理终端A。

Ø 呼叫等待:

(1)AB正常通话。

(2)在AB通话的阶段,用户C向A发起呼叫,终端代理C发送Invite消息给代理服务器。

(3)代理服务器向终端C回送100Trying响应,表示呼叫已在处理中。

(4)代理服务器把Invite消息转发给A。

(5)用户A振铃,并且终端A向代理服务器发送180Ring响应。

(6)代理服务器向终端C转发该响应信息。

(7)用户A按下呼叫保持键,代理终端A向代理服务器发送Invite消息,请求与代理终端C呼叫保持。

(8)代理服务器转发此消息给终端代理B。

(9)代理服务器向终端A回送100Trying响应,表示呼叫已在处理中。

(10)终端B收到呼叫保持请求后,发送200OK给代理服务器,表示接受呼叫保持。

(11)代理服务器转发200OK响应给终端代理A。

(12)代理终端A收到消息后向代理服务器发送ACK消息进行确认。

(13)代理服务器将ACK确认消息转发到代理终端B。

(14)终端代理A发送200OK给代理服务器,表示接受C的呼叫。

(15)代理服务器转发200OK给终端代理C。

(16)终端代理C向代理服务器回送ACK确认。

(17)代理服务器向代理终端A转发收到的ACK确认。

A、C之间开始通话。

(18)用户A挂机,终端代理A向代理服务器发送Bye请求消息。

(19)代理服务器转发Bye消息给终端代理B。

(20)终端代理C发送200OK给代理服务器,表示接受请求。

(21)代理服务器转发200OK响应给终端代理A。

(22)终端代理C重新发送Invite请求给代理服务器,请求和终端代理B恢复通话。

(23)代理服务器向代理终端B转发收到的Invite请求。

2、SIP通信过程报文抓取实例分析

l 实验环境:Linux2.6+Asterisk1.4(开源IPPBX)

l 实验地点:北京邮电大学信息与通信工程学院创新实验室

l SIP代理服务器IP:59.64.135.22  SIP电话号码:825002(59.64.135.22)

l SIP代理终端IP:59.64.135.67

l 软终端:X-lite

l 抓包分析工具:WireShark

注:由于过程太多,以下仅仅抓取“成功注册”,“呼叫--通话” ,“挂断”“注销”四种情况做典型包的分析。

Ø 注册流程:

以上是REGISTER包。

我们可以看到在注册的时候,终端会向代理服务器59.64.135.22发送REGISTER请求注册。

以上是REGISTEROK包。服务器返回200 OK,表示注册成功。

Ø 基本呼叫建立过程:

以上是INVITE包。我们可以看到在发起呼叫初期,终端向825002发出Invite的呼叫请求。

以上是Trying包,说明终端825003正在试着连通服务器,进一步转接到825002.

由于设置了自动接听,所以此次通话没有振铃的包。

这是ACK包,代表确认信号。

Ø 正常呼叫释放过程:

以上是BYE包。这是825002挂断后服务器向825003发送的释放呼叫信号。

Ø 注销流程:

以上是825003注销的包,我们注意到expires=0这说明是注销。

3.总结

SIP协议凭借其简单、易于扩展、便于实现等诸多优点越来越得到业界的青睐,它正逐步成为NGN(下一代网络)和3G多媒体子系统域中的重要协议,并且市场上出现越来越多的支持SIP的客户端软件和智能多媒体终端,以及用SIP协议实现的服务器和软交换设备。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

流媒体学习二-------SIP协议学习(基本场景分析 )的更多相关文章

  1. 【Ruby on Rails学习二】在线学习资料的整理

    由于工作任务重,时间紧,没有太多学习的时间,大致找了些在线学习资料,这里做个整理,希望对同样准备学习的朋友有帮助 在线文档类: Ruby on Rails 实战圣经  使用 Rails 4.2 及 R ...

  2. 【协议学习】SIP基本场景分析

    1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和 ...

  3. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  4. HTTP协议学习笔记(二)

    HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...

  5. 网络协议学习笔记(七)流媒体协议和P2P协议

    概述 上一篇讲解了http和https的协议的相关的知识,现在我们谈一下流媒体协议和P2P协议. 流媒体协议:如何在直播里看到美女帅哥 最近直播比较火,很多人都喜欢看直播,那一个直播系统里面都有哪些组 ...

  6. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  7. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  8. Http协议学习总结(转)

    因为项目中很多地方都与Http协议有关,零散的了解了一下Http协议,但是没有系统的学习过. 今天根据网上其他同学的整理,加上我的一些经验,我也整理了一份.当做学习记录吧. 一.什么是HTTP协议 H ...

  9. BGP协议学习总结

    BGP学习总结 BGP是目前使用的唯一的自治系统间的路由协议,它是一种矢量路由协议,基于TCP的179号端口,它采用单播增量更新的方式更新路由,与其他的路由协议不同的是,BGP只要TCP可达,就可以建 ...

随机推荐

  1. hihoCoder 1160 攻城略地

    原图可能有多个连通分量,先DFS找出每个连通分量中最小节点,这些必然是要攻占的城市. 设 n 为节点数, m 为边数, cnt 为初始连通分量数,在剩下的边数不小于 m - (n - cnt) 的时候 ...

  2. AppCache 离线存储 应用程序缓存 API 及注意事项

    使用ApplicationCache接口实现离线缓存 原文:http://www.mb5u.com/HTML5/html5_96464.html 推荐:html5 application cache遇 ...

  3. cSS3 伪类:nth-child 的使用方法

    :nth-child是一个非常牛逼的伪类,如果你能很好的理解它就可以用CSS 做出很多非常实用的效果.当我很年轻的时候还使用PHP的i++来实现一些东西,其实CSS 完全可以实现.下面是我总结的一些用 ...

  4. 20145325张梓靖 实验五 "JAVA的网络编程"

    20145325张梓靖 实验五 "JAVA的网络编程" 实验内容 使用 JVAV语言 进行网络编程 对明文进行加密 设计过程 我完成的是客户端,服务端同伴 20145308刘昊阳 ...

  5. SQLyog 配置SQL Assitant

    在上一篇博文“MySQL配置SQL Assistant提示”中,我介绍了配置SQL Assitant自带的SQL Editor连接MySQL数据库的配置,但是试用两天后发现,SQL Editor不支持 ...

  6. OFFICE 修改记录保存在单元格批注中vba

    Dim ydtext As String '原单元格值 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Coun ...

  7. 针对特定浏览器起作用的CSS: IE Chrome Firefox CSS Hack

    Firefox的CSSHack 只在Firefox上应用的CSS Hack,虽然这种情况非常少,但有时也会碰到: @-moz-document url-prefix() { .cssSelector ...

  8. MatLab GUI Load .mat File 导入mat文件

    在MatLab中,我们用GUI时,有时候需要导入mat格式的图片,但是在GUI中调用load和在命令行里调用load不一样,在命令行里调用load('im.mat'),加载进去是uint8的矩阵,但是 ...

  9. Brief introduction to Scala and Breeze for statistical computing

    Brief introduction to Scala and Breeze for statistical computing 时间 2013-12-31 03:17:19  Darren Wilk ...

  10. php任何优化的方式下这样第个列表都是再次查询

    我们的代码经理是这样的:计算总行数:select count(*) from tablename where -..查询列表select * from tablename where - limit- ...