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 ...
随机推荐
- (四十六)c#Winform自定义控件-水波进度条-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- (五十六)c#Winform自定义控件-瓶子(工业)-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- Python实现变声器功能,萝莉音御姐音都有的哦
登录百度AL开发平台 在控制台选择语音合成 创建应用 填写应用信息 在应用列表获取(Appid.API Key.Secret Key) 6. 安装pythonsdk 安装使用Python SDK有如下 ...
- Place an Action in a Different Location 设置按钮的显示位置
In this lesson, you will learn how to place an Action in the required place. For this purpose, the C ...
- JavaWeb开发——软件国际化(动态元素国际化)
软件国际化的第二个部分,就是动态元素国际化. 数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理.Java 中提供了解决这些 ...
- 成功安装SQL Server实例后 无法找到SQL Server Configuration Manager工具的解决方案
有一次成功安装SQL Server实例后 ,但是在所有程序中无法找到SQL Server Configuration Manager工具,以下步骤是我们当时的解决方案.最后成功将这个工具的转移到了桌面 ...
- docker in docker 的启动方式
--privileged -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/bin/docker 启动容器时添加上面 ...
- 并发编程~~~多线程~~~计算密集型 / IO密集型的效率, 多线程实现socket通信
一 验证计算密集型 / IO密集型的效率 IO密集型: IO密集型: 单个进程的多线程的并发效率高. 计算密集型: 计算密集型: 多进程的并发并行效率高. 二 多线程实现socket通信 服务器端: ...
- leetcode回溯算法--基础难度
都是直接dfs,算是巩固一下 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 思路 一直 ...
- OpenDaylight开发hello-world项目之代码框架搭建
OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...