SIP协议分析
—
SIP流程
一个标准的SIP通话流程如下:
1、 A向B发送一个INVITE消息,邀请B通话。
2、B振铃,向A回复一个RING消息,通知A振铃中,A等待。
3、B提机,向A发一个OK消息, 通知A可以通话,并进行双方协商,协商信息常用SDP协议承载,SDP信息作为SIP报文的一部分。
4、A向B回复一个回应ACK消息,根据协商的结果正式启动通话。
5、双方通话,通话过程通常在另一条会话中进行,常见的是RTP承载。
6、B挂机,向A发一个BYE消息,通知A通话结束。
7、A向B回复一个OK消息,通话结束。
SIP的整个协议里,除上图中的消息外,还有REGISTER等消息。
但是,在音视频IM软件中,SIP作为控制协议并不完全遵循于这个流程,需要具体情况具体分析,一般处理关键的SIP消息报文即可。
进行通话协商一般是使用SDP承载,但并不局限于SDP,通话过程则很多情况下是使用RTP、RTCP等,也有可能使用私有协议或者RTP的修改版本。
—
SIP格式
SIP消息分为Request和Response两种,通常Request消息有六种方法:
REGISTER,INVITE,ACK,CANCEL,BYE,OPTIONS。
而Response则为状态码和状态内容,如100 Trying,180 Ringing, 200 OK,401 Unauthorized等。
一个完整的SIP消息由一系列行组成,每行以\r\n结束,这些行分成4个部分:
1、起始行(start line)。2、消息头部(message header),内含多个头部字段(head field),每个头部字段为一行。3、空行(empty line),仅包含一个\r\n,表示头部的结束。4、消息体(message body),可有可无。
可以看出,SIP的消息和HTTP类似,因为它们是同一个组织IETF制定的。
下面将以几个实例来体会消息的格式。
REGISTER消息:
REGISTER sip:sip.cybercity.dk SIP/2.0
Via: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp151248737-46ea715e192.168.1.2;rport
From: <sip:voi18063@sip.cybercity.dk>;tag=903df0a
To: <sip:voi18063@sip.cybercity.dk>
Call-ID: 578222729-4665d775@578222732-4665d772
Contact: <sip:voi18063@192.168.1.2:5060;line=9c7d2dbd8822013c>;expires=1200;q=0.500
Expires: 1200
CSeq: 68 REGISTER
Content-Length: 0
Max-Forwards: 70
User-Agent: Nero SIPPS IP Phone Version 2.0.51.16
终端向代理服务器sip.cybercity.dk发起注册消息。第一行即为起始行,它的格式为:method request-uri sip-version\r\n其中method为请求的方法,即前文中的六种方法,request-uri为请求的用户或服务器,sip-version为SIP版本号,三者间为空格,结束为\r\n。
之后为消息头部,消息头部一般要包括Via, From, To, CSeq, Caller-ID, Max-Forwards等字段,每个字段的格式为:name: value;value;value\r\n。name即字段名,value为一个或多个,每个之间为“;”,结束为\r\n。每个value内部可包含多段,消息头的最后一行为空行,仅含\r\n。
对协议还原,在消息头部需要关注的是提取 From, To字段内的发送者接收者等标识用户的信息,当然,对REGISTER方法,目的地址为服务器,则From、To字段内的用户信息是相同的,Via字段内的IP、端口信息,如果有其它字段,如User-Agent,可提取终端信息,Contact则是绑定的联系地址。另外,如果存在Content-Length字段,值非0,则表示带有消息体,需要对消息体进行解析。
Response 100 Trying消息:
SIP/2.0 100 Trying
Call-ID: 578222729-4665d775@578222732-4665d772
CSeq: 69 REGISTER
From: <sip:voi18063@sip.cybercity.dk>;tag=8e948b0
To: <sip:voi18063@sip.cybercity.dk>
Via: SIP/2.0/UDP 192.168.1.2;received=80.230.219.70;rport=5060;branch=z9hG4bKnp149505178-438c528b192.168.1.2
Content-Length: 0
Response消息是对请求的六个消息的响应,第一行同样为起始行,它的格式为:sip-version status-code reason-phrase\r\n其中sip-version为SIP版本号;status-code为三位数字组成的返回状态码,其中第一个数字表示状态的类型,如1xx表示中间状态,收到的消息正在处理,2xx表示某个阶段的成功,另外还有3xx,4xx,5xx,6xx等,分别表示不同含义,如跳转,失败,错误等;reason-phrase为对状态码的描述;三者间为空格,结束为\r\n。
之后的消息头部与请求一致。同样,响应消息也可以带有消息体,由消息头部的相关字段确定。
INVITE消息:
INVITE sip:0097239287044@sip.cybercity.dk SIP/2.0
Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bKnp85213694-430aa1de192.168.1.2;rport
From: "arik" <sip:voi18062@sip.cybercity.dk>;tag=51449dc
To: <sip:0097239287044@sip.cybercity.dk>
Call-ID: 85216695-42dcdb1d@192.168.1.2
CSeq: 1 INVITE
User-Agent: Nero SIPPS IP Phone Version 2.0.51.16
Expires: 120
Accept: application/sdp
Content-Type: application/sdp
Content-Length: 270
Contact: <sip:voi18062@192.168.1.2>
Max-Forwards: 70
Allow: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, INFO
v=0
o=SIPPS 85214742 85214739 IN IP4 192.168.1.2
s=SIP call
c=IN IP4 192.168.1.2
t=0 0
m=audio 30000 RTP/AVP 0 8 97 2 3
a=rtpmap:0 pcmu/8000
a=rtpmap:8 pcma/8000
a=rtpmap:97 iLBC/8000
a=rtpmap:2 G726-32/8000
a=rtpmap:3 GSM/8000
a=fmtp:97 mode=20
a=sendrecv
终端向代理服务器sip.cybercity.dk发起请求通话的消息,服务器收到消息后会向目的终端发起通话消息。
在INVITE消息的消息头部,从From、To字段内就能够提取到通话双方的账号信息,以及昵称。在这个消息中,Content-Length非0,说明带有消息体,长度为270,Content-Type字段,描述了消息体的类型,消息体可以有很多中类型,此处为SDP。
根据SDP协议的格式,可以提取到通话内容使用的IP、端口、承载协议、可使用的语音编码相关信息。如上述消息中,提取的本端可连IP为192.168.1.2,端口为30000,内容承载协议为RTP/AVP,可选语音编码分别为pcmu、pcma、iLBC、G726-32、GSM等,采样频率均为8000,传输中对应的编号为0,8,97,2,3。
ACK消息:
ACK sip:0097239287044@sip.cybercity.dk SIP/2.0
From: "arik" <sip:voi18062@sip.cybercity.dk>;tag=51449dc
Call-ID: 85216695-42dcdb1d@192.168.1.2
Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bKnp85213694-430aa1de192.168.1.2;rport
To: <sip:0097239287044@sip.cybercity.dk>;tag=00-04073-1701b482-069239f90
CSeq: 1 ACK
Content-Length: 0
ACK消息表示在对端返回Response消息之后对对端的回应,格式内容与其它消息类似。
CANCEL消息和BYE消息:
CANCEL sip:97239287044@voip.brujula.net SIP/2.0
Via: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp104984053-44ce4a41192.168.1.2;rport
From: "arik" <sip:816666@voip.brurjula.net>;tag=6433ef9
To: <sip:97239287044@voip.brujula.net>
Call-ID: 105090259-446faf7a@192.168.1.2
CSeq: 1 CANCEL
Content-Length: 0
Max-Forwards: 70
User-Agent: Nero SIPPS IP Phone Version 2.0.51.16
CANCEL消息和BYE消息使用在不同的场景,按理解,CANCEL消息为取消的意思,而BYE消息则为结束的意思。在一次通话请求的过程中,CANCEL一般为拒绝通话,使通话结束,而BYE则是通话正常结束,对语音的控制消息的处理,二者稍有差异,但本质上是相同的。
另外,在使用SIP协议的APP中,常常会使用SIP协议进行文本聊天,文件传输等功能的实现,这样,一般是承载在消息体内的,根据具体消息格式进行解析即可。
如果觉得本文有价值,请关注我,come on~
长按进行关注。
SIP协议分析的更多相关文章
- 流媒体学习二-------SIP协议学习(基本场景分析 )
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.SIP业务基本知识 1.1 业务介绍 会话初始协议(Session Initiation Protocol) ...
- 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...
- SIP协议搭建电信级VOIP/IM运营平台--架构篇(sip集群)
移动互联网的发展为整个VOIP通信行业开拓了新的战场,一时间各类即时通信软件如雨后春筝般冒了出来,再一次创造了移动互联网的发展神话.SIP协议做为音视频通信的首选标准,应用也越来越广泛. ------ ...
- 深入浅出SIP协议
传统电话是电磁波的通信,当电话技术发展到IP技术时代,SIP协议成为了电话通信标准协议,不仅可以通电话.还可以收发信息.视频.开会.放PPT.事实上,今天的通信业已全面采用SIP协议作为通信标准,无论 ...
- sipp模拟电信运营商VoIP终端测试(SIP协议调试)
三大运营商都有SIP服务器,用来支持语音对讲,多媒体调度等功能,他们的平台可能不是标准的SIP协议会话. 为了应对没完没了的对接各个厂商的平台,这里再整理了一套协议脚本,毕竟全都是没有意义的无用功,标 ...
- SIP协议整理
本文记录开发.实现IMS项目时,整理的SIP协议基础知识:若有侵权,请告之. SIP协议 1. SIP协议简介 SIP是一个应用层的控制协议,可以用来建立.修改.和终止多媒体会话(或者会议) ...
- sip协议呼叫流程详解
1.SIP业务基本知识 1.1 业务介绍会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和终 ...
- Google的Protobuf协议分析
protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文出现的PB代表protobuf). Github:https://github.com/google/protobuf 上图 ...
- 蓝牙协议分析(7)_BLE连接有关的技术分析
转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connec ...
随机推荐
- 数据显示按规格向datatable中增加空白记录
/// <summary> /// 按前台分页样式为datatable增加空行 /// </summary> /// <param name="gridPage ...
- MySQL学习——管理事务
MySQL学习——管理事务 摘要:本文主要学习了使用DCL语句管理事务的操作. 了解事务 什么是事务 事务是一组逻辑处理单位,可以是执行一条SQL语句,也可以是执行几个SQL语句. 事务用来保证数据由 ...
- Mac版Sourcetree的安装使用
本人也在亲测,感觉很有效,和大家分享,参考链接: https://www.jianshu.com/p/b8d0547a8449
- Jupyter Notebooks 配置
重装了三遍(破音) 一.首先进行Anaconda的下载 然后安装,将环境配置到系统变量上,如下 然后,打开 windows 的终端,检查是否配置成功 conda -V 然后就可以开始 Jupyter ...
- Zookeeper学习(一)
shell角度 API角度 Zookeeper可单节点,可分布式 作用: distributed coordination(分布式协调) 同一时间只有一个对外提供服务,另外的就是standy. 当ac ...
- 网络编程~~~osi五层协议
物理层 / 数据链路层 / 网络层 / 传输层 / 应用层(表示层/会话层) 一 物理层 物理层指的就是网线,光纤, 双绞线等物理传输介质 物理层发送的是数据(比特流) 二 数据链路层 数据链路层对数 ...
- How To Determine The Cause Of Lots Of Redo Generation Using LogMiner (Doc ID 300395.1)
How To Determine The Cause Of Lots Of Redo Generation Using LogMiner (Doc ID 300395.1) APPLIES TO: O ...
- Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器
本节内容: 1.深浅拷贝 2.三目运算 3.迭代器和生成器 4.装饰器 1.深浅拷贝 拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需 ...
- 201871010102-常龙龙《面向对象程序设计(java)》第十三周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- Java Web 学习(9) —— EL 与 JSTL
EL 与 JSTL EL与JSTL的作用是为了减少JSP页面中的代码. EL EL(Expression Language):表达式语言 常用于取值 语法 EL 表达式以${开头,以}结束. 多个表达 ...