SIP [RFC3261]

SIP概括


会话初始协议(Session Initiation Protocal, SIP)。SIP是一个应用层的信令控制协议,主要目的是在 IP 网络中建立、修改和释放多媒体会话的应用层协议。其主要的应用包括但不局限于语音、消息、视频、呼叫控制等。会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信。
SIP的业务模式是一个点对点协议,其中有两个要素——SIP用户代理(User Agent, UA)和SIP网络服务器。

下图是SIP业务的网络结构和各个参与者的关系。


SIP [RFC3261]_第1张图片
网络结构和各参与者的关系图

SIP支持建立和终止多媒体通信的五个方面

  • 用户位置:确定用于通信的终端系统
  • 用户可用性:确定被叫方参与通信的意愿
  • 用户能力:确定要使用的媒体和媒体参数
  • 会话建立:“振铃”在被叫和主叫方建立会话参数
  • 会话管理:包括会话的传输和终止,修改会话参数的调用和服务。

SIP协议主要消息


SIP消息分类

SIP协议是以层协议的形式组成的,就是说它的行为是以一套相对独立的处理阶段来描述的,每个阶段之间的关系不是很密切。SIP协议将Server和User Agent之间的通讯的消息分为两类:请求消息和响应消息

请求常用方法 [请求消息]

SIP请求方法的列表

请求在两个SIP实体之间发起SIP事务,以建立,控制和终止会话。常用的SIP请求消息如下:

  • INVITE:用于与用户代理之间的媒体交换建立对话。
  • ACK:客户端向服务器端证实它已经收到了对INVITE请求的最终响应。
  • PRACK:表示对1xx响应消息的确认请求消息。
  • BYE:表示终止一个已经建立的呼叫。
  • CANCEL:表示在收到对请求的最终响应之前取消该请求,对于已完成的请求则无影响。
  • REGISTER:该方法为用户代理实施位置服务,该位置服务向服务器指示其地址信息。
  • OPTIONS:表示查询被叫的相关信息和功能。
  • NOTIFY:通知用户有关新事件的通知。

请求常用响应代码 [响应消息]

SIP响应代码列表
SIP消息类型和消息列表

  • SIP协议中的响应消息用于对请求消息进行响应,指示呼叫的成功或失败状态。
    临时应答(1XX) :对请求的临时响应表明请求有效且正在处理中。
    会话成功(2XX) :200级响应表明成功完成请求。作为对INVITE的响应,它表示呼叫已建立。
    重定向(3XX) :该组指示完成请求需要重定向。该请求必须在新的目的地完成。
    请求失败(4XX) :请求包含错误的语法或无法在服务器上完成。
    服务器失败(5XX) :服务器无法完成一个明显有效的请求。
    全局性错误(6XX) :这是全球性的故障,因为请求无法在任何服务器上完成。
  • 类型 状态码 状态说明
    100试呼叫(Trying)
    180振铃(Ringing)
    181呼叫正在前转(Call is Being Forwarded)
    200成功响应(OK)
    302临时迁移(Moved Temporarily)
    400错误请求(Bad Request)
    401未授权(Unauthorized)
    403禁止(Forbidden)
    404用户不存在(Not Found)
    408请求超时(Request Timeout)
    480暂时无人接听(Temporarily Unavailable)
    486线路忙(Busy Here)
    504服务器超时(Server Time-out)
    600全忙(Busy Everywhere)

  • 概念
    最终响应(Final response):用于结束 SIP 事务的响应,与临时响应相对。
    所有的 2XX,3XX,4XX,5XX 和 6XX 响应都是最终响应。
    临时响应(Provisional response):服务器用来表示工作进展,并不结束 SIP
    事务的一种响应。编码为 1XX 的响应是临时响应,其他响应都是最终响应。

SIP消息结构


SIP请求由三部分组成:请求行、请求头和请求体。SIP 是一个基于文本的协议,在这一点上与 HTTP 和 SMTP 相似,这里对比一个简单的SIP请求和HTTP请求:

GET /index.html HTTP/1.1    

INVITE sip:[email protected] SIP/2.0 

在 HTTP 中, GET 指明一个获取资源(文件)的动作,而 /index.html 则是资源的地址,最后是协议版本号。而在 SIP 中,INVITE 表示发起一次请求,[email protected] 为请求的地址,称为 SIP URI,最后也是版本号。其中,SIP URI很类似一个电子邮件,其格式为“协议:名称@主机”。与 HTTP 和 HTTPS 相对应,有 SIP 和 SIPS,后者是加密的;名称可以是一串数字的电话号码,也可以是字母表示的名称;而主机可以是一个域名,也可以是一个IP地址。

SIP 是一个对等的协议,类似 P2P。不像传统电话那样必须有一个中心的交换机,它可以在不需要服务器的情况下进行通信,只要通信双方都彼此知道对方地址(或者,只有一方知道另一方地 址),在不知道的情况下就需要服务器来中转。

INVITE 示例 !!!

1、Request-Line:请求行
请求行包括三个部分:方法名、请求URL、协议版本
请求的方法,定义了请求的性质(INVATE、NOTIFY、BYE等),以及一个Request-URI,指出请求应该发送的位置。典型的SIP URI的格式为sip:username @ domainnamesip:username @ hostport。如下图示例:

SIP [RFC3261]_第2张图片
SIP请求头示例

2、Message Header:请求头

  • SIP [RFC3261]_第3张图片
    Message Header.png

via:SIP版本号(2.0)、传输类型(UDP)、呼叫地址 、branch。branch为分支,是一随机码,它被看作传输标识,标志会话事务。
  <=Via字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成
  <=传输类型可以为UDP、TCP、TLS、SCTP

From:表示请求消息的发送方和目标方
  <=如果里面有用户名标签,地址要求用尖括号包起来
  <=对于INVITE消息,可以在From字段中包含tag,它也是个随机码

To:请求消息的目标方
Contact:是INVITE消息所必须的,用来告诉对方,回消息给谁。**
  <=(注意区别:在180RINGING的时候,这里是目标方地址)**
Call-ID:用于标识一个特定邀请以及与这个邀请相关的所有后续事务(即标识一个会话)
CSeq:字段是用来给同一个会话中的事务进行排序的,每发送一个新的请求,该值加1,当排序到65535(也就是216的最大数),会开始新一轮的排序。
Allow:允许的请求消息类型
Supported
Session-Expires:存活时间,用户的响应必须在这个时间范围内
Min-SE:最小长度。
X-UCM-AudioRecord:自定义字段
X-UCM-CallPark:自定义字段
Max-Forwards:最大转发数量限制了通讯中转发的数量。它是由一个整数组成,每转发一次,整数减一。如果在请求消息到达目的地之前该值变为零,那么请求将被拒绝并返回一个483(跳数过多)错误响应消息。
User-Agent:指明UA的用户类型
Content-Type:消息实体类型
Content-Length:消息实体长度,单位为字节

本地将生成From tag和Call-ID全局唯一码,被叫方代理则生成To tag全局唯一码。这三个随机码做为整个对话中对话标识(dialog indentifier)在通话双方使用。

3、Message Body:请求体
请求体主要包含的就是SDP相关的东西,详细解释可以参考这里

  • SIP [RFC3261]_第4张图片
    Message Body

SIP主要概念模型


实体模型概述

SIP 协议模型定义了 User Agent 和 Server 等两类主要实体。

SIP 协议把 User Agent(即 UA)分为两个部分:User Agent Client 和 User
Agent Server。呼叫方(称 User Agent Client)发出邀请 (或呼叫),被叫
方(称 User Agent Server)接受或拒绝邀请 (或呼叫)。

SIP Server

Proxy Server 代理服务器

Proxy Server 作为 UAC和 UAS 间的中间媒体,它转发 UAC 发来的的邀请,在转发之前,根据被叫标识请求位置服务器获得被叫的可能位置,然后分别向它们发出邀请;

SIP [RFC3261]_第5张图片
Redirect Server 重定向服务器

Redirect Server 接受UAC来的邀请,根据被叫标识请求位置服务器获得被叫的可能位置,把这些信息返回给邀请的发起者(UAC),和 Proxy Server 的不同之处就在于它不转发邀请,邀请由主叫终端自己完成。

设 想 bob 和 alice 是经人介绍认识的,而他们还不熟悉,bob 想请 alice 吃饭就需要一个中间人(M)传话,而这个中间人就叫代理服务器(Proxy Server)。还有另一种中间人叫做重定向服务器(Redirect Server),它类似于这样的方式工作──中间人 M 告诉 bob,我也不知道 alice 在哪里,但我老婆知道,要不然我告诉你我老婆的电话,你直接问她吧,我老婆叫 W。这样,M 就成了一个重定向服务器,而他老婆 W 则是真正的代理服务器。这两种服务器都是 UAS,它们主要是提供一对欲通话的 UA 之间的路由选择功能。具有这种功能的设备通常称为边界会话控制器(SBC,Service Border Controller)。

Register Server 注册服务器

主要用于登记分组终端的当前位置和位置服务的原始数据;

试想这样一种情况,alice 还是个学生,没有自己的手机,但它又希望 bob 能随时找到她,于是当她在学校时就告诉中间人 M 说她在学校,如果有事打她可以打宿舍的电话;而当她回家时也通知 M 说有事打家里电话。只要 alice 换一个新的位置,它就要向 M 重新“注册”新位置的电话,以让 M 能随时找到她,这时候 M 就是一个注册服务器。

Back to Back 背靠背用户代理

RFC 3261 并没有定义 B2BUA的功能,它只是一对 UAS 和 UAC的串联。FreeSWITCH 就是一个典型的 B2BUA。

我们来看上述故 事的另一个版本:M 和 W 是一对恩爱夫妻。M 认识 bob 而 W 认识 alice。M 和 W 有意搓合两个年轻人,但见面时由于两人太腼腆而互相没留电话号码。事后 bob 相知道 alice 对他感觉如何,于是打电话问 M,M 不认识 alice,就转身问老婆 W (注意这次 M 没有直接把 W 电话给 bob),W 接着打电话给 alice,alice 说印象还不错,W 就把这句话告诉 M, M 又转过身告诉 bob。 M 和 W 一个面向 bob,一个对着 alice,他们两个合在一起,称作 B2BUA。在这里,bob 是 UAC,因为他发起请求;M 是 UAS,因为他接受 bob 的请求并为他服务;我们把 M 和 W 看做一个整体,他们背靠着背(站着坐着躺着都行),W 是 UAC,因为她又向 alice 发起了请求,最后 alice 是 UAS。其实这里UAC 和 UAS 的概念也不是那么重要,重要的是要理解这个背靠背的用户代理。因为事情还没有完,bob 一听说 alice 对他印象还不错,心花怒放,便想请 alice 吃饭,他告诉 M, M 告诉 W, W 又告诉 alice,alice 问去哪吃,W 又只好问 M, M 再问 bob…… 在这对年轻人挂断电话这前, M 和 W 只能“背对背”的工作。

这几种代理服务器的描述文字比较多,但是说的很形象。

SIP基本网络模型,来个图感受一下!!
SIP [RFC3261]_第6张图片
SIP基本网络模型.png

参考


服务器的端口和协议要求
音频和视频会议的RTP配置文件与最小的控制
SIP常用消息实例参考
会话初始化协议(SIP)简介及应用
Session Initiation Protocol
SIP协议参数详解

你可能感兴趣的:(SIP [RFC3261])