SIP [RFC3261]

SIP概括


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

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


网络结构和各参与者的关系图

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:seven@freeswitch.org.cn SIP/2.0 

在 HTTP 中, GET 指明一个获取资源(文件)的动作,而 /index.html 则是资源的地址,最后是协议版本号。而在 SIP 中,INVITE 表示发起一次请求,seven@freeswitch.org.cn 为请求的地址,称为 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请求头示例

2、Message Header:请求头

  • 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相关的东西,详细解释可以参考这里

  • 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 发来的的邀请,在转发之前,根据被叫标识请求位置服务器获得被叫的可能位置,然后分别向它们发出邀请;

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基本网络模型.png

参考


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容