VOIP之SIP协议

前言碎碎念

最近到了新公司,开始做VOIP模块,自然少不了接触SIP协议,用这篇文章记录自己学习所得。由于学识有限,本文可能会有错误,还请各位大佬多多指正。

另,再多其他人的详解也代替不了SIP原始的协议文本,如果你对SIP协议的某些概念、定义或者功能有困惑,不妨前往» RFC Editor 下载SIP协议读一读,编号为RFC3261。

1. SIP简介

SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。它是一个应用层的信令控制协议。IETF是HTTP协议的制定者之一,SIP协议消息(Message)与HTTP消息也有相似之处。


2. SIP抽象模型


2.1 SIP模型结构


SIP由两种构件构成,一个为UA(User agent,用户代理),另一个为网络服务器(Network service)。


UA又分为UAC(User agent client,用户代理客户段)与UAS(User agent service,用户代理服务端)。值得注意的是,这里虽然称之为Client与Service,实际上两者并非传统的C/S架构关系。在VOIP中,Clinet实际是呼叫的发起者,而Service为呼叫的接听者。


网络服务器又分为重定向服务器(Redirect Server), 注册/定位服务器(Register/Location Server),代理服务器(Proxy Server)。


注册/定位服务器:为用户提供帐号注册服务并将用户的当前位置信息保存在本地供后续Proxy查询使用。
重定向服务器:用来接收SIP请求并将请求中的地址映射为零个或多个地址通过3xx响应给UAC,指示客户
端连接别的URI;它不接收或者拒绝呼叫,起到路由的功能,一般与注册配合使用具有移动性作用。
代理服务器:用于代表客户端转发请求或者响应的服务器,它本身既可以作为UAC也可作为UAS,并且还起到一个路由的功能,将请求或者响应转发到最靠近目标用户的地方。
 

2.2 SIP消息


SIP结构模型中的各个部分通过消息(Message)来完成交互,实现SIP中的各项功能。SIP消息分为请求(Request)和响应(Response),默认使用5060端口。


VOIP呼叫时,需要UA先在Server上注册,SIP通过请求和相应的响应在两个或多个参与者之间建立连接,参与者的终端设备通过它相互通信,从而发起呼叫的建立或终止。


SIP消息由三个部分组成:一个起始行(start-line)、一个或多个字段(field)组成的消息头(header)、以及作为可选项的消息体(body)组成,这部分内容将在后文详细说明。


VOIP中使用的SIP请求一共有14中方法(Method),如下文所示,其中前6个SIP协议最初定义的6种方法,也是最重要的六种方法,其余是后续补充的方法:

    1. INVITE:邀请对方加入通话(发起会话)
    2. ACK:确认INVITE请求
    3. BYE:结束会话
    4. CANCEL:取消挂起的请求
    5. REGISTER:向服务器传输参与者的位置信息(主机名、IP地址)
    6. OPTIONS:提供有关呼叫中涉及的SIP电话支持的功能的信息
    7. PRACK:作为请求的初步确认
    8. SUBSCRIBE:订阅某个事件发生时的通知
    9. NOTIFY:发生状态变化时发送通知(事件监控)
    10. PUBLISH:主动向服务器传输状态或事件信息
    11. INFO:在通话过程中传输控制和监控信息
    12. REFER:请求接收者转发现有连接
    13. MESSAGE:发送即时消息
    14. UPDATE:更改通话状态

SIP响应是对SIP请求的响应。有六大类SIP响应,每个大类中有许多响应选项,由于细分选项太多,本文只介绍大类响应:

    1XX: 表示临时响应,收到并且正在处理请求,提供消息性信息给请求发起者。

    2XX: 表示成功处理,收到请求并且成功处理。

    3XX: 表示需要重定向,该请求需要转到其他服务器上处理。

    4XX: 表示请求失败,请求中包含错误信息或者不能在服务器上处理。

    5XX: 表示服务器故障,服务器不能正常处理合法的请求。

    6XX: 表示全局错误,请求不能被任何服务器处理。

2.3 SIP中的事务、对话与会话

事务,Transaction,事务发生在客户端和服务器之间,是一组请求及其响应消息的集合。事务由消息头中Via字段的branchID标识,不同的事务branchID不同。
按照事务的方法分为Invite事务和非Invite事务。这么分是因为Invite请求比较特殊,它不仅会收到响应回复,还会发送ACK包,而ACK是请求的一种方法。在不同情况下,Invite的ACK可能算它的事务的一部分,也可能为一个单独的事务。

对话,Dialog,描述的是一段时间内两个UA之间的点对点SIP关系,这么说可能不太方便理解,记住对话由消息头中Call-ID标识的就行,一次呼叫过程中,两个UA之间只会产生一个Call-ID。

会话,Session,根据SIP/SDP协议中最原始的定义,会话是一组发送方与接收方及发送方到接收发的数据流,会话是由SDP里的user name, session id, network type, address type, 和源处地址元素来确定的。
而根据抓包显示,VOIP呼叫流程中,每个请求包中的session id一直在该改变。所以我个人理解一组带有发送方/接收方信息的信息流就是一次会话。但是,实际应用中,通常把会把一个完整的呼叫称之为会话,及从Invite事件开始到BYE事件结束中间的全部过程称之为会话。
又因为在一个完整的呼叫过程中,标记两个UA关系的对话的Call-ID一直保持不变,所以部分资料中认为会话由Call-ID标记,我认为这是错误的表述,比如在一个三方通话中,就会由多个Call-ID产生,因为各个UA之间互相链接就会产生多个点对点关系,需要用多个Call-ID标记。

注:有关会话的部分是我的个人理解,如果你有不同的理解,欢迎讨论。

2.4 VOIP呼叫流程图

此图展示一次正常呼叫-被叫先挂断的呼叫中,SIP注册、呼叫、挂断的全部流程;软交换(Soft swich)可以简单的理解为SIP Server,它利用IP网络与软件实现了类似于交换机的功能。

3. SIP消息模型

SIP消息包括三个部分:SIP消息由一个起始行(start-line)、一个或多个字段(field)组成的消息头(header)、以及作为可选项的消息体(body)组成。这里利用wireshark抓Invite包及其响应包为例,从中可以清晰的看出SIP消息结构。

 

3.1 消息起始行

起始行分请求行(Request-Line)和状态行(status-line)两种,其中请求行是请求消息的起始行,状态行是响应消息的起始行,起始行位于消息的最开始。

Request-Line一般由Method,Request-URI和SIP Version等组成,具体格式如下:
Request-Line = \<Method\>\<Request-URI\>\<SIP Version\>
Method:前文介绍的请求方法。
Request-URI:标识了请求的目的地,请求呼叫的用户或者服务的地址或者域名,在注册请求中只有注册服务器的地址。
SIP Version::当前使用的SIP版本。

Status-Line一般由SIP Version,Status-Code等组成,格式如下:
status-line = \<SIP-VERSION\>\<STATUS-CODE\>
SIP Version::当前使用的SIP版本。
Status-Code:第一个数字表达了响应的类型

3.2 消息头(Message Header)

SIP消息头域,每个头域有许多的参数组成,这里对于几个比较重要的字段做出解释。

    CallID: 对话的唯一标识,UA之间点到点之间会话的唯一标识,一个用户多次邀请单个个体多次加入同一个会议时CallID保持不变。

    CSeq: 命令序列号,在会话中为事务进行排序,且可以区分请求和请求的重发,且可用来标识请求对应的响应。序号初值可为任意值,其后具有相同Call-ID值,但不同命令名称、消息体的请求,其Cseq序号应加1。

    Contact: 真实的物理地址,给响应作路由用。

    From: 逻辑的主叫实体,注意,其用于表示这个请求的发起者,而非这个包的Source。

    To: 被叫得逻辑实体,用于表示这个请求的接收者, 注意,其用于表示这个请求的响应者,而非这个包的Destination。

    Via:表示请求经过的路径,可用作路由用,branchID表示事务的标志。

    Session-Expires: 会话刷新的时间

3.3 消息体(Message body)

SIP的消息体可以携带多种不同类型的信息。比如说SDP、QOS,甚至是安全信息。我抓的包中这部分只有SDP(Session descriptoion protocol,会话描述协议)的信息,SDP是完成呼叫必不可少的部分,主要是用来描述会话的一些参数,通话双方来对这些参数进行协商并达成共识。

会话级描述:主要包括V,O,S,I,U等等,但V,O,S是必须,(V)表示SDP协议版本,(O)包括会话发起者信息,Session ID和会话版本;(S)表示Session Name

时间级描述: 主要定义了会话的开始时间和结束时间,当Time的起始时间和结束时间为0时表示永久会话

媒体级描述:媒体级描述包括了媒体的Type、Port、Protocol、Format、Attribute等信息。

SDP中的参数也比较多,这里对一些比较重要的字段做出解释:

    Session Description Protocol Version: SDP版本号,一般都为0。

    Owner/Creator,Session ID(0): 会话发起者及SessionID的信息:  

    Owner/Creater: 会话发起者信息

    Session ID: 唯一的标识了此次会话,一般以网络时间戳的时间开始确保唯一性。

    Session Version: 会话版本,Proxy根据此参数判断最新的会话,只要参数有了修改则会增加1。

    Media Type: 指明了媒体类型,可以为Audio. Vedio等

    Media Protocol: RTP/AVP,媒体流使用的协议

    Media Format: 编解码格式

    Media Attribute: 媒体流传输属性,一般可以为:SendRecv,SendOnly,Inactive,RecvOnly

 4. 其它知识点

        这里占个位,以后随着对SIP协议理解的深入,可能会想补充些东西。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值