深入浅出SIP协议详解(以呼叫中心呼入呼出为例)

一、背景

传统拨打电话流程:

  1. A呼叫B,邀请B建立通话(Invite)
  2. 电话B振铃(Ring),同时电话A也可以听见振铃
  3. 电话B提起表示应答,因此通话建立
  4. 通话中。。。
  5. 任意方挂断电话,通话结束

传统电话使用电磁波传输通信信号,而现阶段网络几乎拥有完整的覆盖率,因此SIP协议的意义是在IP网络中实现网络电话功能

二、协议内容

sip协议是应用层协议,与其他应用层协议协同工作,通过网络控制多媒体通信会话

通话双方需在IP网络中拥有一个SIP账号,区别于传统数字号码,SIP采用URL表示方法

  sip:jack@google.com:5060

解析:

​ sip:表示采用sip协议

​ jack:发起请求的用户名,字母数字均可

​ google.com:账号所属服务器域名,亦可以使用ip表示

​ 5060:连接的端口号

SIP通信流程:

1、软电话 A 向 B 发送一个 SIP消息 INVITE, 邀请B通话

2、软电话 B 振铃,向A 回复一个SIP消息 RING, 通知 A 正在振铃中,请A等待

3、软电话 B 提机,向A发一个SIP消息 OK, 通知 A 可以通话了

4、软电话 A 向 B 回复一个回应消息 ACK,正式启动通话

5、接下来,双方通话

6、软电话 B 挂机,向 A 发一个SIP消息 BYE, 通知 A 通话结束

7、软电话 A 向 B 回复一个消息 OK, 通话结束

总结:不难发现,SIP协议完整地实现了传统电话通信流程,且以ip形式运行在网络环境中

三、深入协议主体

几个概念
SIP协议的设计非常简单,配置有限的命令。它也是基于文本的,所以任何人都可以读取SIP会话中的端点之间传递的SIP消息。

有一些实体帮助SIP创建其网络。在SIP中,每个网元由SIP URI(统一资源标识符)来标识,它像一个地址。以下是网络元素

  • 用户代理
  • 代理服务器
  • 注册服务器
  • 重定向服务器
  • 位置服务器

SIP基于客户机 - 服务器架构,其中呼叫者的电话充当发起呼叫的客户端,被叫方的电话充当响应呼叫的服务器

用户代理

  • 用户代理客户端(UAC) - 发送请求并接收响应的实体
  • 用户代理服务器(UAS) - 接收请求并发送响应的实体

代理服务器

网络元素接收来自用户代理的请求并将其转发给另一个用户,基本上代理服务器的作用就像一个路由器,它有一些智慧来了解SIP请求,并在URI的帮助下发送它,代理服务器位于两个用户代理之间,源和目的地之间最多可以有70个代理服务器

有两种类型的代理服务器

  • 无状态代理服务器 - 它只是转发收到的消息。这种类型的服务器不存储任何呼叫或交易的信息
  • 有状态代理服务器 - 这种类型的代理服务器可以跟踪收到的每个请求和响应,并且如果需要,可以将来使用它。如果对方没有响应,它可以重新发送请求
INVITE消息实例:
INVITE sip:some@192.168.31.131:50027 SIP/2.0
Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX
Max-Forwards: 70
To: <sip:some@192.168.31.131:50027>
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 1 INVITE
Content-Length: 215
Content-Type: application/sdp
Contact: <sip:null@192.168.31.131:51971;transport=UDP>

v=0
o=user1 685988692 621323255 IN IP4 192.168.31.131
s=-
c=IN IP4 192.168.31.131
t=0 0
m=audio 49432 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv

请求消息分为以下几部分,起始行、消息头部、空行(表示消息结束)、消息体,下面将逐一解释协议的具体内容

  1. 起始行 (start-line)
# ①     ②   ③            ④              ⑤          
INVITE sip:some@192.168.31.131:50027 SIP/2.0

① 请求方法,本例是INVITE, SIP协议规定的Method有六种: INVITE, ACK, CANCEL用于创建对话,BYE用于结束对话, REGISTER用于登记,OPTIONS用于查询服务器能力

② 协议头,表示使用sip协议

③ 连接用户名

④ 连接URL+port

⑤ sip版本号,本例中使用sip 2.0协议版本

  1. 消息头部 (header)

    Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX
    Max-Forwards: 70
    To: <sip:some@192.168.31.131:50027>
    From: <sip:null@null>;tag=Prf3c3Xc
    Call-ID: cenXTa4i-1423587756904@appletekiAir
    CSeq: 1 INVITE
    Content-Length: 215
    Content-Type: application/sdp
    Contact: <sip:null@192.168.31.131:51971;transport=UDP>
    

    via字段

    Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX Max-Forwards: 70

    via头字段:表示经过的sip网元的主机名和网络地址

    branch参数:用于标识此请求创建的事务,且该字段必须存在

    参数必须被分成两部分:第一部分符合一般的原则(对于RFC3261,z9hG4bK),第二部分(此例为iYblddPPX)被用来实现loop detection以用来区分loop和spiral。loop和spiral均指Proxy收到一个请求后转发,然后此转发的请求又重新到达该Proxy,区别是loop中请求的Request-URI以及其他影响Proxy处理的头字段均不变,而Spiral请求中这些部分必需有某个发生改变,spiral发生的典型情况是Request-URI发生改变

    Proxy在插入Via字段前,其branch参数的loop. detection部分依据以下元素编码:To Tag,From Tag,Call-ID字段,Request-URI,Topmost Via字段,Cseq的序号部分(即与request method无关),以及proxy-require字段,proxy authorization字段。注意:request method不能用于计算branch参数,比如CANCEL以及非2XX response的ACK与其所cancel的request或对应的INVITE属于同一个事务,即其branch参数相同。见RFC3261 P22 P25 P39 P95 P105

    Max-Forwards: 表示request到达UAS的跳数的限制

    To字段

    To: <sip:some@192.168.31.131:50027>

    UAC发起一个Dialog请求,即out-of-dialog,由于dialog尚未建立,不含to tag参数,当UAS

    收到INVITE请求时,在其发出的2XX或101-199响应中设置to tag参数,与UAC设置的From Tag参数以及Call-ID(呼叫唯一标识)一起作为一个Dialog ID(对话唯一标识,包含To tag,From Tag,Call-ID)的一部分。 RFC3261规定只有INVITE请求与2xx或101-199响应可以建立Dialog

    From字段

    From: <sip:null@null>;tag=Prf3c3Xc

    From字段表示消息的发送者,字段必须包含tag参数作为ID的一部分

    CALL-ID字段

    Call-ID: cenXTa4i-1423587756904@appletekiAir

    call-id表示同一个UAC用户的所有请求后产生的一组响应的唯一标识,CALL-ID在UAC发出请求中设置的From Tag字段以及To Tag字段组成一个Dialog-ID

    CSeq字段

    CSeq: 1 INVITE

    CSeq用于在同一个Dialog中标识及排序事务和区分新的请求以及请求的重发,内容包括顺序号和方法,方法必须和对应的requests匹配。针对dialog里的每一个新的request(例如BYE,re-INVITE,OPTION),CSeq序号加1,但是CANCEL、ACK除外,它们的CSeq序号必须与所对应的requests相同

    Content-Length字段

    Content-Length: 215

    Content-Length字段表示消息体的长度,用十进制数表示

    Content-Type字段

    Content-Type: application/sdp

    Content-Type表示发给接收器的消息体的媒体类型。如果消息体不是空的,则Content-type header field一定要存在。如果Content-type header field存在,而消息体是空的,表明该

    类型的媒体流长度是0

    Contact字段

    Contact: <sip:null@192.168.31.131:51971;transport=UDP>

    该字段提供了UAC或UAS直接联系的SIP的URL,UAC在会话建立时在Contact字段提供自己的SIP的URL,UAC收到请求会绕过PROXY把响应发送给直接联系的SIP的URL。针对REGISTER事务,字段表示的是地址绑定的contact address

  2. 消息体

消息的编码协议由头部规定,一般使用SDP协议

#版本号为0
v=0
#建立者用户名+会话ID+版本+网络类型+地址类型+地址 
o=user1 685988692 621323255 IN IP4 192.168.31.131
#会话名                
s=-
#连接信息:网络类型+地址类型+地址
c=IN IP4 192.168.31.131
#会话活动时间 起始时间+终止时间
t=0 0
#媒体描述:媒体+端口+传送+格式列表
#音频+端口49432+传输协议RTP+格式AVP,有效负荷0(u率PCM编码)
m=audio 49432 RTP/AVP 0 8 101
#0或多个会话属性: 属性 + 有效负荷+ 编码名称 + 抽样频率。         
a=rtpmap:0 PCMU/8000
#rtpmap+0型+PCMU+8KHz 
a=rtpmap:8 PCMA/8000
#a可以有多个,见SDP协议
a=rtpmap:101 telephone-event/8000
a=sendrecv
Ring消息
SIP/2.0 180 Ringing
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 1 INVITE
Via: SIP/2.0/UDP 192.168.31.131:51971;rport=51971;branch=z9hG4bKiYblddPPX
To: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
Contact: <sip:192.168.31.131:50027;transport=UDP>
OK消息
SIP/2.0 200 OK
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 1 INVITE
Via: SIP/2.0/UDP 192.168.31.131:51971;rport=51971;branch=z9hG4bKiYblddPPX
To: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
Content-Length: 214
Content-Type: application/sdp
Contact: <sip:192.168.31.131:50027;transport=UDP>

v=0
o=user1 77115499 915054303 IN IP4 192.168.31.131
s=-
c=IN IP4 192.168.31.131
t=0 0
m=audio 49434 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
ACK消息
ACK sip:192.168.31.131:50027;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKEfwYu4LbB
To: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
From: <sip:null@null>;tag=Prf3c3Xc
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 3 ACK
Max-Forwards: 70
BYE消息
BYE sip:null@192.168.31.131:51971;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.31.131:50027;rport;branch=z9hG4bKvtPAT0lfO
To: <sip:null@null>;tag=Prf3c3Xc
From: <sip:some@192.168.31.131:50027>;tag=AM1g60xRvq
Call-ID: cenXTa4i-1423587756904@appletekiAir
CSeq: 711793880 BYE
Max-Forwards: 70
  • 15
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SIP(Session Initiation Protocol) 是一种用于建立、修改、终止多媒体会话的应用层协议。它是一个开放的协议,被广泛应用在互联网电话(VoIP)和实时通信服务中。 SIP采用客户端-服务器体系结构,其中客户端可以是用户使用的终端设备,服务器则提供管理和路由服务。SIP协议基于TCP和UDP协议,使用文本格式的消息进行通信。消息包括请求和响应,用于发起和管理会话。 SIP协议详细定义了会话的建立、修改和终止所需的过程。当发起一个新会话时,客户端发送一个呼叫请求到服务器,该请求包括会话参数、参与方信息和客户端能力。服务器对请求进行处理,根据路由策略找到目标用户,并向其发送呼叫请求。一旦目标用户接受会话,服务器将介绍双方,并为他们建立一个会话。 SIP协议还支持会话的修改和终止。在会话过程中,用户可以发送修改请求来改变会话参数、增加或删除参与方。终止会话时,用户发送一个终止请求到服务器服务器则通知所有参与方会话的结束。 SIP协议还提供了一些其他的功能,如呼叫转移、振铃、消息传递等。它可以与其他相关协议(如SDP、RTP)结合使用,以实现音频、视频和即时消息等多媒体通信。 总结来说,SIP协议是一个用于建立、修改、终止多媒体会话的开放协议。它的设计简单灵活,并且被广泛应用于互联网电话和实时通信服务中。通过SIP,用户可以方便地建立和控制多媒体会话,实现音频、视频和即时消息等实时通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴走的Mine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值