SIP协议简介

一、SIP协议简介

      通俗的说,SIP就是一个轻量级信令协议,它可以作为音频、视频、及时信息的信令。更详细的介绍请点击:SIP维基百科 或 【SIP协议】学习初学笔记。

二、SIP模型
      1、用户代理(User Agent)
      SIP用户代理是一个SIP逻辑网络端点,用于创建、发送、接收SIP消息并管理一个SIP会话。SIP用户代理又可分为用户代理客户端UAC(User Agent Client)和用户代理服务端UAS(User Agent Server)。UAC创建并发送SIP请求,UAS接收处理SIP请求,发送SIP响应。
      2、代理服务器(Proxy)
      SIP代理服务器(PROXY)在网络上位于SIP UAC和UAS之间,用于帮助UAC和UAS间的消息路由。PROXY也可以执行路由策略控制(比如,检查SIP消息的合法性,确认消息是否允许被路由)。PROXY在转发SIP消息时,可能根据需要修改SIP消息的某些部分。
      3、注册服务器(Register)
      SIP注册服务器用于接收SIP注册请求,并保存发送注册请求的UA的位置信息。

三、SIP资料
      1、服务器和客户端
      YATE:跨平台(Linux,Windows)的开源SIP服务器端和客户端。在windows下安装和使用非常简单。http://yate.null.ro/pmwiki/
      2、开源资料
      1)osip:跨平台的开源SIP协议栈。用c语言实现,体积小。http://www.gnu.org/software/osip/
      2)eXosip:对osip进行封装,使其方便SIP客户端软件开发。同样开源跨平台。http://savannah.nongnu.org/projects/exosip/

      还有其他SIP资料,可以根据需求自行查找。后面我会逐步介绍eXosip的使用。

四、SIP消息格式
      1、每条SIP消息由以下三部分组成:
      1)起始行(Start Line):每个SIP消息由起始行开始。起始行传达消息类型(在请求中是方法类型,在响应中是响应代码)与协议版本。起始行可以是一请求行(请求)或状态行(响应)。 
      2)SIP头(Message Header):用来传递消息属性和修改消息意义。它们在语法和语义上与HTTP头域相同(实际上有些头就是借自HTTP),并且总是保持格式:<名字>:<值>。 
      3)消息体(Message Body):用于描述被初始的会话(例如,在多媒体会话中包括音频和视频编码类型,采样率等)。消息体能够显示在请求与响应中。SIP清晰区别了在SIP起始行和头中传递的信令信息与在SIP范围之外的会话描述信息。可能的体类型就包括本文将要描述的SDP会话描述协议。

SIP协议简介_第1张图片
图1 SIP消息示例
     2、 格式定义:
SIP协议简介_第2张图片
图2 SIP消息格式定义
     1)请求行
SIP协议简介_第3张图片
图3 SIP消息头部关键字
     请求格式:
SIP协议简介_第4张图片
     响应格式:
SIP协议简介_第5张图片
     2)消息头

     Dailog(会话)如下三个值相同代表同一个:Call-id、Form  tag、To  tag。会话是两个UAs(user agent) 之间持续一段时间的端到端(peer-to-peer)的SIP 关系。会话由SIP消息建立,就像用2xx响应INVITE请求。我们用Call identifier,local tag(本地tag),remote tag(对方tag)来标志一个对话,一个对话在RFC 2543中被正式叫做CALL LEG。会话过去也叫做 "call leg"。
     Transaction(事务)的标识是branch参数。Transaction发生于客户端和服务器端之间,包含从客户端发出请求给服务器,到服务器响应给客户端的最终消息(non-1xx message)之间的所有消息。如果请求是一个"Invite"消息,并且最终的响应是一个non-2xx消息,那么该事务包含一个"Ack"响应消息。如果服务器的响应是一个2xx消息,那么,随后的ACK是一个单独的事务。branch参数是一个事务ID(Transaction ID),用于区分同一个Client所发起的不同Transaction。对于遵循RFC3261规范的实现,这个branch参数的值必须用magic cookie“z9hG4bK”打头。 其它部分是对“To, From, Call-ID头域和Request-URI”按一定的算法加密后得到。根据本标准产生的branch ID必须用”z9h64bK”开头。这7个字母是一个乱数cookie(定义成为7位的是为了保证旧版本的RFC2543实现不会产生这样的值),这样服务器收到请求之后,可以很方便的知道这个branch ID是否由本规范所产生的(就是说,全局唯一的)。
     Cseq其生存域是一个会话。用于将一个会话中的请求消息序列化,以便用于重复消息、“迟到”消息的检测,响应消息与相应请求消息的匹配等。包含两部分:一个32位的序列号,一个请求方法。通常在会话开始时确定一个初始值,其后再发送消息时将该值加1。主叫方与被叫叫各自维护自己的CSeq序列,互不干扰,这有点像TCP/IP中IP包的序列号。一个响应消息有与其对应的请求消息相同的CSeq值。注意,SIP中CANCEL消息与ACK消息总是比较特殊。CANCEL消息的CSeq中的序列号总是跟其要cancel的消息的相同,而对于ACK消息:如果它所要确认的是INVITE请求的non-2xx响应,则ACK消息的CSeq中的序列号与对应INVITE请求的相同;如果是2xx响应,则不同,此时ACK被当作一个新的事务。

     3、 字段详解

SIP协议简介_第6张图片

参考资料:
1、会话发起协议 
2、【SIP协议】学习初学笔记
3、一些SIP开源的资料收集
4、SIP协议格式详解
5、SIP协议入门:初学者必须明白的几个重要概念(原创)

你可能感兴趣的:(SIP协议简介)