1.定义:SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议,它是一个应用层的信令控制协议。用于创建、修改和释放一个或多个参与者的会话。这些会话可以是Internet多媒体会议 、IP电话或多媒体分发。会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信。
以下转自http://www.cnblogs.com/wangxuchu/archive/2012/10/04/2693372.html;
lesson 1
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。
lesson 2:转自http://www.cnblogs.com/wangxuchu/archive/2012/10/04/2693373.html
1.概念
会话是SIP协议中一个重要的概念,它不同于会话,它是发生在两个UA之间点对点通讯。通俗来说,就像是两个人说话,举个例子:
A:Hi,我叫Tommy,你好!
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请求后,对话也会进入关闭状态
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来标记对话内容的顺序等。
lesson 3:转自:http://www.cnblogs.com/wangxuchu/archive/2012/10/04/2708769.html
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会话表示了若干用户之间通信的过程,可能包含多个对话过程。
2.事务的状态机
- INVITE客户端事务(INVITE Client Transaction)
- 非INVITE客户端事务(Non-INVITE Client Transaction)
- INVITE服务端事务(INVITE serverTransaction)
- 非INVITE服务端事务(Non-INVITE server Transaction)
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匹配。