SIP协议

  1.定义SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议,它是一个应用层的信令控制协议。用于创建、修改和释放一个或多个参与者的会话。这些会话可以是Internet多媒体会议  、IP电话多媒体分发。会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信。

  以下转自http://www.cnblogs.com/wangxuchu/archive/2012/10/04/2693372.htmlhttp://www.cnblogs.com/wangxuchu/archive/2012/10/04/2693372.html

1.简介

SIP(Session Initiation Protocol)是一种类似于http协议的纯文本应用层协议。SIP可以用来控制会话的建立、取消、关闭等操作。主要可以实现以下功能:

  • 用户定位:检查终端用户的位置,用于通信;
  • 用户有效性:检查用户参与会话的意愿程度;
  • 用户能力:检查媒体和媒体参数;
  • 建立会话:“振铃”,在呼叫和被叫方同时建立会话的参数;
  • 会话管理:包括会话的传输和终止,修改会话参数以及请求服务

2.SIP的结构

在SIP协议中主要包含以下几种逻辑上的角色:UA、Proxy Server、 Register/Location Server、Redirect Server。

  • UA:用户代理(User Agent)类似于http协议中浏览器的角色,是用户操作的终端界面,用户代理需要符合SIP协议的要求,但是结合其他的协议根据不同的应用场景,会有不同的实现逻辑。比如,SIP协议结合H.323VoIP协议可以实现软件电话功能。用户代理分为UAC(UA Client)和UAS(UA Server)两种逻辑实体,UAC发送SIP Request并接受Response,UAS接收SIP Request并返回Response,一个物理设备既可以是UAC同时也可以是UAS。
  • Proxy Server:代理服务器的作用主要是转发Request和Response给其他的Proxy Server或者UA,Proxy Server分为有状态代理服务器(Stateful Proxy)和无状态代理服务器(Stateless Proxy),前者会保留一次通信事务的状态,通过一个有限状态机来控制转发操作,而后者不保存状态,只是实现透明的转发操作。
  • Registration/Location Server:注册和定位服务器用于登记和定位UA,在线的UA会定时的向Registration服务器发送SIP消息来表明UA当前的位置(如IP地址、端口号等),Registration服务器会将该信息存入数据库(或者散列表)中,当其他UA向该UA发送request时就能获得该UA的位置。
  • Redirect Server:用于重定向,在逻辑上相当于一个特殊功能的UA。

image

image

1.概念

会话是SIP协议中一个重要的概念,它不同于会话,它是发生在两个UA之间点对点通讯。通俗来说,就像是两个人说话,举个例子:

A:Hi,我叫Tommy,你好!

扫描二维码关注公众号,回复: 47758 查看本文章

B:我叫Elaine,很高兴认识你

A:不知道今晚你有没有时间,请你喝咖啡

B:我有时间。

A:那就今天晚上7点在华语的星巴克

B:嗯,好的

A:那就这么定了,晚上见。

B:晚上见。

通常是有一方发起对话,当对方有没有回应,或者回应是“不好意思我不认识你”、“我现在忙没时间”时对话就无法开始;如果对方回应是“稍等”,那对话就处于早期等待开始的状态;如果对法给出回应是“你好”的时候表示对方愿意与你对话,对话就正式开始了。对话的结束通常是一方说“再见”之类的话,或者对方说完“稍等”之后又说“今天谈不了了”,这样对话就算结束了。对一个对话来说对话的双方需要知道自己在跟谁说话,要通过怎样的媒介对话(比如电话、QQ等)对话的顺序等信息,这样一个人同时与多个人对话(比如聊QQ)时也不会出现混乱。两个UA之间的对话也是一样的道理,对话需要有一个开始的标志和结束的标志,中间是对话的内容,对话的双方要保持对话的状态直到对话结束。

2.状态转换

对话包括三种状态:早期(early)、确认(confirmed)、关闭(closed)。

对话由包含特定方法的请求的无失败的应答来创建,具体来说一个对于INVITE请求的101-199应答或者2xx应答会创建一个应答。

  • 一个请求的非终结应答(101-199)将会创建一个早期(early)对话。
  • 一个请求的2xx终结应答将会使一个对话进入确认(confirmed)状态,进入确认状态的对话可以发起一个新的事务(transaction)。
  • 处于早期状态的对话收到该对话的请求对应的非2xx终结应答时会进入关闭(closed)状态,处于确认状态的对话中发送一个BYE请求后,对话也会进入关闭状态

image

3.对话信息

前面提到对话的双方UA需要为对话保持一个状态,也就是对话的信息,这些信息是UA用来区别不同对话的,这些信息在同一个UA端唯一的对应一个对话,但是对话的两个UA对于同一个对话的描述信息却不一定是一样的,实际上在SIP协议中对话双方对于对话的描述信息是不同的。参与对话的UA需要用一个dialog-ID来唯一确定一个对话,这个dialog-ID是由Call-ID和remote-tag和local-tag组成的,同时需要知道双方的地址,即需要一个local-uri和remote-uri,需要知道对话的顺序,那就需要一个remote-CSeq和local-CSeq来标记对话内容的顺序等。

1.总体结构

看了这么长时间的RFC文旦,谈谈我对SIP协议通信粒度的理解吧,在SIP协议中通信的行为分成了不同的粒度,从小到大分别是点到点的sip消息的传输(这点是我自己总结的),sip事务,sip对话以及sip会话。点到点的sip消息的传输时sip协议传输的最基本的单位,发生在传输层(Transport Layer),就是将一个sip message通过udp、tcp或tls等底层协议发送到目的UA(或者Proxy)的传输层。事物的粒度在点对点sip消息传送之上,包含了一系列的sip消息传输,事务由一个request、0到多个临时response以及一到多个最终response组成,表示了一次完整的request-response过程。而对话粒度更大,一次对话从进入early状态到closed状态可能包含0到多个事务(对话收到1xx进入early后收到non-2xx的response时会直接进入closed,否则必须经过BYE事务才能进入closed状态)。对话应该发生在Transaction User层,由用户控制对话的开始和结束。sip会话表示了若干用户之间通信的过程,可能包含多个对话过程。

image

2.事务的状态机

  • INVITE客户端事务(INVITE Client Transaction)

image

  • 非INVITE客户端事务(Non-INVITE Client Transaction)

image

  • INVITE服务端事务(INVITE serverTransaction)

image

  • 非INVITE服务端事务(Non-INVITE server Transaction)

image

3.sip消息与状态机的匹配

由于在transport层收到的sip消息要交给相应的状态机来处理,因此在transaction层需用sip消息匹配状态机的实例,而这个匹配分为两类:

  • 1. UAC事务与response匹配;
  • 2. UAS事务与request匹配;

1. UAC事务与response匹配

当UAC发出一个请求时会创建一个相应的事务,假设请求ReqA创建了事务实例TA,之后如果收到了响应RespX,可以通过看RespX是否满足以下条件来看该响应是否与TA匹配:

  • RespX的via头域最上面的一条的branch参数,与ReqA的via头域最上一条的branch参数相等;
  • RespX的CSeq头域中的方法(method)与ReqA的CSeq头域中的方法相同,这是由于cancel请求会创建一个新事务但是却与要取消的请求有同样的branch参数;

同时满足以上两个条件时,RespX与事务实例TA匹配。

2. UAS事务与request匹配

当UAS收到一个请求时会创建一个相应的事务,假设请求ReqA创建了事务实例TA,之后如果收到了请求ReqX,可以通过看ReqX是否满足以下条件来看该响应是否与TA匹配:

  • ReqX的via头域最上面的一条的branch参数与ReqA的via头域最上一条的相等;
  • ReqX的via头域最上面的一条的sent-by的值与ReqA的via头域最上一条的相等;
  • ReqX的CSeq头域中的方法(method)与ReqA的CSeq头域中的方法相同;

同时满足以上三个条件时,ReqX与事务实例TA匹配。

猜你喜欢

转载自www.cnblogs.com/kangzi139/p/8918694.html