SIP协议开发-01 SIP协议

发布时间 2023-05-05 10:11:28作者: 阿风小子

SIP(Session Initiation Protocol)是一个轻量级信令协议,也是在VoIP技术中使用的最常见的协议之一,它可以作为音频、视频、及时信息的信令。它与其他协议一起配合,完成诸如多媒体会议,语音会议等Internet上的多媒体通信会话。

1 介绍

SIP(会话初始协议)的开发目的是用来帮助提供跨越因特网的高级电话业务。因特网电话(IP电话)正在向一种正式的商业电话模式演进,SIP就是用来确保这种演进实现而需要的NGN(下一代网络)系列协议中重要的一员。

它是一种应用层协议,与其他应用层协议协同工作,通过Internet控制多媒体通信会话。它在在RFC 3261中定义。

1.1 VoIP技术

首先了解有关VoIP的概念。VOIP是一种允许您通过互联网提供语音和多媒体(视频,图片)内容的技术。 它是任何时间,任何地方与互联网的可用性最便宜的沟通方式之一。

VOIP的一些优势包括 :

  • 低成本
  • 可移植性
  • 无额外电缆
  • 灵活性
  • 视频会议

下图就是一个简单的VoIP呼叫示意图:

 

SIP协议开发-01 SIP协议
VoIP呼叫

1.2 SIP承载

http使用tcp承载的,而sip则支持tcpudp承载。我们常见的sip都是用udp承载的,由于udp是面向无连接的,在大并发量的情况下与tcp相比较可也减少开销。但超出了ip层窗口的大小,在经过路由器的时候可能会被拆包,造成消息可能丢失,乱序,这时候就是用tcp.

1.3 SIP的几个主要标准协议

SIP协议被设计为非常简单,具有有限的命令集。它也是基于文本的,因此任何人都可以读取在SIP会话中的端点之间传递的SIP消息。

SIP的标准协议都是IETF制定的,所以SIP的标准协议都是通过RFCXXXX的方式来公布的,每个协议均制定了一些SIP的特性:

  • RFC3261:SIP的基本协议,定义了SIP的基本功能,特性等。要搞SIP的话,这个协议是不能不看的。网上有人已经将它翻译成中文,再结合英文原版协议看,应该比较好理解。
  • RFC3262:SIP中,如何定位服务器。这个没过多研究,一般的SIP协议栈都可以很好的支持,让它们去做就可以了。
  • RFC3265:事件通知机制,可通过此协议进行一些事件监控。
  • RFC3515:呼叫的转接。
  • RFC3666:与PSTN连接时的一些特性的说明。
  • RFC3911:通过Join的方式进行会议。

1.4 SIP的相关协议栈

1.4.1 PJSIP协议栈

PJSIP是一个开源的SIP协议栈,PJSIP协议栈同时支持音频、视频并支持即时通讯。PJSIP协议栈具有非常完善的文档,对开发者非常友好,是开发即时通讯系统的首选。同时PJSIP协议栈具有非常好的移植性,几乎支持现今所有的操作系统系统:从桌面系统、嵌入式系统到智能手机。

(后续章节详细介绍)

1.4.2 ReSIProcate协议栈

ReSIProcate是SIPFoundry的开源项目,ReSIProcate协议栈是在VOCAL的基础上建立的,由于VOCAL开始只支持rfc3254,为了支持最新的rfc3261,ReSIProcate协议栈就这样诞生了。但现在,ReSIProcate已经成为一个独立SIP协议栈了,它性能较为稳定,并且很多商业的应用都使用它。
ReSIProcate官网

1.4.3 OPAL协议栈

OPAL(Open Phone Abstraction Library)的前身是Openh323开源项目,它包括几乎全部的Openh323全部代码,并加入了SIP协议栈,使到H.323和SIP协议能并存,开发者既可以使用功能全面的H.323协议,可以使用简单易用的SIP协议。Openh323是视频会议厂商最青睐的开源的H.323的开源项目,很多免费视频会议系统的H.323协议栈都是采用Openh323,OPAL的出现使系统能支持SIP协议,因此强烈推荐OPAL作为SIP协议栈的首选。

1.4.4 VOCAL协议栈

VOCAL项目vovida.org开发的开源SIP系统,VOCAL的SIP协议栈应该是目前功能最完善的SIP协议栈之一,其具有众多的使用者,但由于不支持window平台,所以限制了它的普及和推广。但在其他的linux操作系统上是最具有影响力的SIP协议栈。

1.4.5 sipX协议栈

sipX是一个开源的SIP协议栈,它和ReSIProcate都是由SIPFoundry开发。sipX是从reSIProcate分离出来的,sipX除了包括SIP 协议外,还包括了sipXphone,sipXproxy,sipXregistry等.,由它们构成了完整的SIP系统,而且sipx还支持嵌入式系统,各个模块可以按需取舍。

1.4.6 oSIP协议栈

oSIP协议栈是使用ANSI C编写的开源SIP协议栈,是体积最小的SIP协议栈,由于oSIP体积较小,很容易在小的操作系统上运行,因此在实时操作系统 VxWorks当中,oSIP是使用最多的SIP协议栈。

2 SIP(Session Initiation Protocol)

首先,要理解SIP协议,要先知道SIP协议的用途,以下 源引百度百科:

SIP(Session Initiation Protocol)是一个应用层的信令控制协议。用于创建、修改和释放一个或多个参与者的会话。这些会话可以是Internet多媒体会议、IP电话或多媒体分发。会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信。
SIP与负责语音质量的资源预留协议(RSVP)互操作。它还与若干个其他协议进行协作,包括负责定位的轻型目录访问协议(LDAP)、负责身份验证的远程身份验证拨入用户服务 (RADIUS) 以及负责实时传输的 RTP 等多个协议。 [2]
随着计算机科学技术的进步,基于分组交换技术的IP数据网络以其便捷性和廉价性,取代了基于电路交换的传统电话网在通信领域的核心地位。SIP协议作为应用层信令控制协议,为多种即时通信业务提供完整的会话创建和会话更改服务,由此,SIP协议的安全性对于即时通信的安全起着至关重要的作用。

简单理解来:
如果要完成一个视频通话或视频会议,首先SIP用于初始化一个Session,并负责传输SDP包;而SDP包中描述了一个Session中包含哪些媒体数据,邀请的人等等;当需要被邀请的人都通过各自的终端设备被通知到后,就可以使用RTSP来控制特定Media的通信,比如RTSP控制信息要求开始Video的播放,那么就开始使用RTP(或者TCP)实时传输数据,在传输过程中,RTCP要负责QoS等。

总的来说,SIP能够支持下列五种多媒体通信的信令功能:

  • User location(用户定位):确定参加通信的终端用户的位置
  • User capabilities(用户能力):确定通信的媒体类型和参数
  • User availability(用户的可用性):决定被叫方是否愿意参加通信
  • Call setup(呼叫建立):振铃,在主叫和被叫直接建立呼叫的参数
  • Call handling(呼叫处理):包括呼叫转移和终止

2.1 SIP实现机制

SIP是一个分层结构的协议,它的行为根据一组平等独立的处理阶段来描述,每个阶段之间是松耦合的关系。

 

SIP协议开发-01 SIP协议
image.png
  • SIP的最低层是其语法和编码。其编码使用扩充的背景 – 诺尔表单语法(BNF)指定。
  • 第二层是传输层。它定义了客户端如何发送请求和接收响应,以及服务器如何通过网络接收请求和发送响应。所有SIP元素都包含传输层。
  • 接下来是交易层。事务是由客户机事务(使用传输层)发送到服务器事务的请求,以及从服务器事务发送回客户机的对该请求的所有响应。用户代理客户端(UAC)完成的任何任务都使用一系列事务进行。无状态代理不包含事务层。
  • 交易层上方的图层称为交易使用者。除了无状态代理,每个SIP实体都是事务用户。

2.2 SIP网络元素

使用SIP建立通信网络,需要有一些实体的支持,本节主要介绍下这些实体都有哪些。在SIP中,每个网络元件由类似地址的 SIP URI (统一资源标识符)标识。

2.2.1 用户代理

用户代理(UA,User Agent)也称SIP终端,是指支持SIP协议的多媒体会话终端。一般使用支持SIP协议的路由器作为SIP UA。UA 包括用户代理客户端(UAC,User Agent Client)和用户代理服务器(UAS,User Agent Server)。一般说的 UA 均是指二者的总称,因为在一次呼叫中,一个 SIP 终端既要处理 SIP 请求,又要发起SIP请求。

  • 用户代理客户端(UAC)是指在 SIP 会话建立过程中主动发送会话请求的设备。例如,主叫SIP终端。当代理服务器向被叫终端发送会话请求时,它就成为用户代理客户端。

  • 用户代理服务器(UAS)是指在 SIP 会话建立过程中接收会话请求的设备。例如,被叫 SIP 终端。当代理服务器接收主叫终端发送会话请求时,也作为用户代理服务器。

例如:SIP基于客户端 – 服务器架构,其中呼叫者的电话充当发起呼叫的客户端,并且被叫者的电话充当响应呼叫的服务器。

2.2.2 代理服务器

代理服务器(Proxy Server)的作用就是传递主叫 UA 发送的会话请求到被叫 UA,然后将被叫 UA的响应传递回主叫 UA,它相当于主叫 UA 和被叫 UA 之间传递会话消息的路由。

  • 基本上代理服务器的作用就像一个路由器。
  • 它具有一些智能来理解SIP请求并且在URI的帮助下向前发送它。
  • 代理服务器位于两个用户代理之间。
  • 源和目标之间最多可以有70个代理服务器。
  • 代理服务器接收到主叫UA的会话请求后,先在位置服务器查找UA的位置及主叫和被叫UA之间的呼叫策略信息,找到相应的UA并允许呼叫的UA,代理服务器才会向被叫UA发送会话请求。

有两种类型的代理服务器:

  • 无状态代理服务器(stateless) – 它仅转发接收的消息。这种类型的服务器不存储呼叫或事务的任何信息。
  • 状态代理服务器(stateful) – 此类型的代理服务器会跟踪收到的每个请求和响应,如果需要,将来可以使用它。如果没有来自另一方的响应,它可以重传请求。

2.2.3 重定向服务器

重定向服务器(Redirect Server)用来指示客户端连接的新地址,客户端直接再次向这些新的地方发起请求。不接收或者拒绝呼叫,主要完成路由功能。

比如,主叫UA呼叫被叫UA,当重定向服务器收到主叫UA发送的会话请求消息后,查找被叫UA的位置信息,然后将其返回给主叫UA,使主叫UA重新向该位置发起会话请求。此位置可以是被叫UA的位置,也可以是一个代理服务器的位置。接下来主叫UA如同直接呼叫被叫UA或者向代理服务器呼叫的流程一样。

2.2.4 位置服务器

位置服务器(Location Server)是为代理服务器和重定向服务器等提供UA信息的设备,只有代理服务器或重定向服务器可以联系位置服务器。

位置服务器记录了注册服务器接收到的UA的信息。二者可以独立存在,也可以作为逻辑组件存在于同一台服务器上。

2.2.5 注册服务器

注册服务器(Registrar Server)接受来自用户代理的注册请求。它帮助用户在网络中验证自己。它将URI和用户的位置存储在数据库中,以帮助同一域中的其他SIP服务器。

注册的内容(如本地号码等信息)一般是存储在位置服务器上,供后续查询使用,二者都是逻辑组件,一般存在于同一台服务器上,或者同域的一个数据库内。

2.3 工作原理

2.3.1 登记注册

在完整的SIP系统中,所有的SIP终端作为User Agent都应该向注册服务器登记注册,以告知其位置、会话能力、呼叫策略等信息。

通常,SIP终端开机启动或者配置管理员执行注册操作时,就向注册服务器发送注册请求消息(REGISTER),该消息中携带了所有需要登记的信息。注册服务器收到注册请求消息后向终端发送回应消息,以告知其请求消息已收到。如果注册成功,就再向终端发送“200 OK”消息。如图 1所示。

SIP协议开发-01 SIP协议
图1

2.3.2 建立呼叫

SIP协议采用Client/Server模型,主要通过UA与代理服务器之间的通信来完成用户呼叫的建立过程。

 

SIP协议开发-01 SIP协议
图2

如图 2所示,Telephone A需要呼叫电话Telephone B,两台路由器作为SIP终端(UA)。当Telephone A拨完电话Telephone B的号码后,Router A向Proxy Server发送会话请求消息。Proxy Server通过查找Telephone B的号码所对应的信息,向Router B发送会话请求消息。Router B收到请求后,如果Telephone B可用,就向Proxy Server发送应答,并使Telephone B振铃。Proxy Server收到应答后,向Router A发送应答消息。这里所说的应答包括:两个临时应答(100 Trying 和180 Ringing)和一个成功应答(200 OK)。

这个例子是一种简单的应用,只使用了一个代理服务器。在复杂的应用中,可以有多个代理服务器,以及注册服务器。

2.3.3 重定向呼叫

SIP重定向服务器收到会话请求消息后,不是转发会话请求消息,而是在回应消息中告知被叫SIP终端的地址。主叫终端从而重新直接向被叫终端发送会话请求消息。被叫终端也将直接向主叫终端发送应答消息。呼叫过程的消息交互如图 4所示。

 

SIP协议开发-01 SIP协议
图4

 

这是比较常见的一种应用。从原理上来说,重定向服务器也可以向主叫终端回复一个代理服务器的地址,接下来的呼叫过程就和使用代理服务器的呼叫过程一样。

3 SIP协议格式

SIP消息采用[ISO 10646]文本方式编码,分为两类:请求消息和响应消息。
(1)请求消息:客户端为了激活按特定操作而发给服务器的SIP消息。
(2)响应消息:用于对请求消息进行响应,指示呼叫的成功或失败状态。

每条SIP消息由以下三部分组成:起始行( Start Line),SIP头,消息体;请求消息和响应消息都包括SIP头字段和SIP消息字段。

3.1 起始行( Start Line)

每个SIP消息由起始行开始。起始行传达消息类型(在请求中是方法类型,在响应中是响应代码)与协议版本。起始行可以是一请求行(请求)或状态行(响应) 。

3.1.1 请求消息

请求消息整体格式如图:

 

SIP协议开发-01 SIP协议
请求消息整体格式

其中:起始行格式:命令名称+目标URI+sip协议版本

请求消息包括以下几种请求命令:

请求消息消息含义
INVITE 发起会话请求,邀请用户加入一个会话,会话描述含于消息体中。对于两方呼叫来说,主叫方在会话描述中指示其能够接受的媒体类型及其参数。被叫方必需在成功响应消息的消息体中指明其希望接受哪些媒体,还可以指示其行将发送的媒体。如果收到的是关于参加会议的邀请,被叫方可以根据Call-ID或者会话描述中的标识确定用户已经加入该会议,并返回成功响应消息。
ACK 证实已收到对于INVITE请求的最终响应。该消息仅和INVITE消息配套使用。
BYE 会话终止请求,可以是主叫方发出,也可以是被叫方发出
CANCEL 取消尚未完成的请求,对于已完成的请求(即已收到最终响应的请求)则没有影响
REGISTER 在服务器端注册客户端的sip通信地址
OPTIONS 查询服务器的能力
PRACK 类似ACK,但只是一个临时的确认
SUBSCRIBE 新客户端加入事件通知
NOTIFY 通知所有用户事件
PUBLISH 发送事件到服务器
INFO 在一个会话中发送消息,不会修改会话状态
REFER 要求客户端发出一请求,通常应用于一个呼叫转移
MESSAGE 发送即时消息的方法
UPDATE 修改session的状态不改变dialog的状态

3.1.2 响应消息

响应消息整体格式如图

 

SIP协议开发-01 SIP协议
image.png

其中:起始行格式:sip协议版本+响应返回码+描述性短句

响应消息是从100 – 699的返回码,分别表示不同的意义。

序号状态码消息功能
1xx 临时响应 表示已经接收到请求消息,正在对其进行处理
  100 试呼叫
  180 振铃
  181 呼叫正在前转
  182 排队
2xx 成功响应 表示请求已经被成功接受、处理
  200 OK
3xx 重定向响应 表示需要采取进一步动作,以完成该请求
  300 多重选择
  301 永久迁移
  302 临时迁移
  303 见其它
  305 使用代理
  380 代换服务
4xx 客户端出错 表示请求消息中包含语法错误或者SIP服务器不能完成对该请求消息的处理
  400 错误请求
  401 无权
  402 要求付款
  403 禁止
  404 没有发现
  405 不允许的方法
  406 不接受
  407 要求代理权
  408 请求超时
  410 消失
  413 请求实体太大
  414 请求URI太大
  415 不支持的媒体类型
  416 不支持的URI方案
  420 分机无人接听
  421 要求转机
  423 间隔太短
  480 暂时无人接听
  481 呼叫腿/事务不存在
  482 相环探测
  483 跳频太高
  484 地址不完整
  485 不清楚
  486 线路忙
  487 终止请求
  488 此处不接受
  491 代处理请求
  493 难以辨认
5xx 服务器端出错 表示SIP服务器故障不能完成对正确消息的处理
  500 内部服务器错误
  501 没实现的
  502 无效网关
  503 不提供此服务
  504 服务器超时
  505 SIP版本不支持
  513 消息太长
6xx 全局错误 表示请求不能在任何SIP服务器上实现
  600 全忙
  603 拒绝
  604 都不存在
  606 不接受

3.2 SIP 头

用来传递消息属性和修改消息意义。它们在语法和语义上与 HTTP 头域相同(实际上有些头就是借自 HTTP ),并且总是保持格式: :。

样例:

 

SIP协议开发-01 SIP协议
SIP头

具体信息在后续章节介绍

2.3 消息体

用于描述被初始的会话(例如,在多媒体会话中包括音频和视频编码类型,采样率
等)。消息体能够显示在请求与响应中。 SIP 清晰区别了在 SIP 起始行和头中传递的信令信息与在 SIP
范围之外的会话描述信息。可能的体类型就包括本文将要描述的 SDP 会话描述协议

3 SDP协议

SDP全称是Session Description Protocol,翻译过来就是描述会话的协议。主要用于两个会话实体之间的媒体协商。

Sip负责建立和释放会话,一般来说,会话会包含相关的媒体,如视频和音频。媒体数据是有sdp描述的。Sdp一般不单独使用,他与sip配合使用时会放到sip协议的正文(boby)中。会话建立时,需要媒体协商,双方才能确定对方的媒体能力以及交换媒体数据。(这就是sdp的工作)

那为什么要去发这个描述文本呢,主要是为了解决参与会话的各成员之间能力不对等的问题,如果参加本次通话的成员都支持高质量的通话,但是我们没有去进行协议,为了兼容性,使用的都是普通质量的通话格式,这样就很浪费资源了。所以SDP的作用还是很有必要的。

样例:

 

SIP协议开发-01 SIP协议
SIP消息体

具体信息在后续章节介绍

参考资料

  • IETF的官方网站 不用说了,这个IETF的官方网站,所有的协议在此网站上均可找的。
  • Tech-invite 这个网站上,将所有SIP协议和SIP周边的协议的一些场景以图形加文字的方式描述了出来。
  • SIP论坛
  • SIP英文教程
  • 几个重要的开源视频会议SIP协议栈