一、概述
SIP消息由3部分组成:启动行、消息头、消息体。以回车换行符号CRLF或由CR、LF(十六进制为0x0d、0x0a)其中之一组成的标志进行换行。消息头后填充空行CRLF。
SIP消息的格式如下所示:
起始行
消息头部(若干个头字段)
空行(CRLF即0d 0a 0d 0a)
消息体(SDP)
1、启动行
启动行分为请求行和响应行
1.1请求
请求行包括3部分: 方法名称、请求URI、SIP版本,结束符号可以为CRLF、CR、LF,空格可以被忽略
如:
Request-Line: INVITE tel:15917474126;phone-context=ims.mnc000.mcc460.3gppnetwork.org SIP/2.0
方法(Method):RFC3261规格中共定义了6种方法,REGISTER、INVITE、ACK、CANCEL、BYE、OPTIONS;
注册(REGISTER) ——提供地址解析的映射,让服务器知道其它用户的位置,用于发送注册请求消息;
邀请(INVITE) ——邀请用户加入呼叫,用于发起一个新的会话;
确认(ACK) ——确认客户机已经接收到对INVITE的最终响应,用于完成会话的建立;
可选项(OPTIONS) ——请求关于服务器能力的信息
再见(BYE) ——终止呼叫上的两个用户之间的呼叫,用于结束一个会话;
取消(CANCEL)——用于取消一个请求(一般是针对INVITE);
请求URI:正在发送请求并被处理的用户信息或服务,不能包含空格不能包含在<>之内;
SIP版本:SIP版本是大小写敏感的,必须为大写,但实际使用中如果小写也没什么差异;
1.2响应
响应消息的起始行为状态行(Status-Line),状态行由协议版本、状态码和状态原因短语组成,各个部分之间用一个空格字符进行分隔。下面介绍其中的状态码。
SIP协议中共定义了6类状态码,其中状态码的第1位数字用于指示响应类型,后两位数字表示具体响应。
响应行包括3部分:SIP版本、状态码、过程阶段,结束符号可以为CRLF、CR、LF,空格可以被忽略,格式如下:
Status-Line: SIP-Version SP Status-Code SP Reason-Phrase CRLF
如:
Status-Line: SIP/2.0 183 Session Progress
状态码给机器翻译使用,Reason-Phrase给用户查看使用;
状态码范围如下,第一个数字为类别代表,共3个数字:
1xx: Provisional -- request received, continuing to process the
request;临时响应,表示请求消息正在被处理
2xx: Success -- the action was successfully received, understood,
and accepted;成功响应,表示请求已被成功接收,完全理解并被接受;
3xx: Redirection -- further action needs to be taken in order to
complete the request;重定向响应,表示需采取进一步以完成该请求;
4xx: Client Error -- the request contains bad syntax or cannot be
fulfilled at this server;客户机错误,表示请求消息中包含语法错误信息或服务器无法完成客户机请求;
5xx: Server Error -- the server failed to fulfill an apparently
valid request;服务器错误,表示服务器无法完成合法请求;
6xx: Global Failure -- the request cannot be fulfilled at any;全局故障,表示任何服务器无法完成该请求
2、消息头
头字段提供了关于请求(或应答)的消息和关于这些消息所包含的消息体的信息。一些头字段可以在请求或应答两种消息中使用,而其他的头字段只能单独特定地用于请求(或应答)。头字段由头字段名、后边跟着一个冒号、再后面跟着头字段值组成。头字段格式如下所示:
field-name:field-value
Via:(缩写为v:)头字段定义SIP事务的下层(传输层)传输协议,并标识响应消息将要被发送的位置。只有当到达下一跳所用的传输协议被选定后,才能在请求消息中加入Via头字段值;头字段指定目前请求消息经过的路径,同时指定响应也要按该路径返回。该字段值中的branch ID参数是一个事务标识符,代理服务器用它来检测环路。Via头字段包含一个用来发送消息的传送协议和客户端的主机名或者网络地址,该头字段还可能包含一个接收响应的端口号;
Via域格式如下:
Via: SIP/2.0/TCP [2409:8809:8200:E9BE:6786:B969:9B1F:5C2B]:8904;branch=z9hG4bK1050740829
<=SIP版本号(2.0)、传输类型(UDP)、呼叫地址、
<=branch是一随机码,它被看作传输标识
<=Via字段中地址是消息发送方或代理转发方设备地址,一般由主机地址和端口号组成
<=传输类型可以为UDP、TCP、TLS、SCTP
Call-ID:(缩写为i:)头字段是用来将消息分组的唯一性标识,唯一的标识某个客户端的某个特定的会话或所有的注册请求。一个多媒体会议可以发起几个Call-ID不同的呼叫,例如,一个发 起者A可以邀请用户B参与一个会议,随后又邀请用户C参与同一个会议,那么,A与B有一个Call-ID,A与C有另一个Call-ID。那么,A发送 BYE请求时,就是通过不同的Call-ID来选择结束那个会话。Call-ID区分大小写并逐字节比较;
Call-ID:527451154_2334621800@2409:8809:8200:e9be:6786:b969:9b1f:5c2b
<=呼叫ID是由本地设备生成的,全局唯一值。每次呼叫该值唯一不变
<=对于用户代理发送INVITE消息,本地将生成From tag和Call-ID全局唯一码,被叫方代理则生成To tag全局唯一 码。这三个随机码做为整个对话中对话标识(dialog indentifier)在通话双方使用。
CSeq:头字段用于标识事务并对事务进行排序。它由一个请求方法和一个序列号组成,请求方法必须与对应的请求消息类型一致;
该头字段用于把某对话中的事务进行排序且提供了一种唯一标识某事务的方法(即INVITE、ACK等method),并能够区分某请求是新的请求还是重发的请求。如果两个Cseq的数字序列以及方法都相等,那么这两个Cseq就是等价的。
200 OK中的Cseq:完整地复制对应请求中的Cseq,不做任何修改;
ACK中的Cseq:和对应的最终响应有相同的整数序列,只是方法名变为ACK;
CANCEL中的Cseq:和对应的请求(一般是INVITE)由相同的整数序列,只是方法名变为CANCEL;
CSeq:527451154 INVITE
<=CSeq,又叫命令队列(Command Seqence),每发送一个新的请求,该数自动加1
Max-Fowords:(最大转发次数)头字段限定一个请求消息在到达目的地之前允许经过的最大跳数,即规定向下游转发消息的代理服务器和网关的个数。它包含一个整数值,每经过一跳,这个值就被减一。如果在请求消息到达目的地之前该值变为零,那么请求将被拒绝并返回一个483(跳数过多)错误响应消息
Max-Forwards: 70
<=默认设置为70
<=最大跳跃数,就是经过SIP服务器的跳跃次数,主要是防止循环跳跃
<=每经过代理服务器,该整数减一
Content-Length:标示消息体的内容长度,如:
Content-Length: 520
3、消息体(SDP:Session Description Protocol)
请求和应答都可能含有消息体,它被一个空行与消息头分开。被SIP消息携带的消息体通常是会话描述符(即SDP),但它也可以由任何不透明物体组成,它就象附件一样包含在SIP消息中
SDP包括以下一些方面:
1) 会话的名称和目的
2) 会话存活时间
3) 包含在会话中的媒体信息,包括:
媒体类型(video, audio, etc)
传输协议(RTP/UDP/IP, H.320, etc)
媒体格式(H.261 video, MPEG video, etc)
多播或远端(单播)地址和端口
4) 为接收媒体而需的信息(addresses, ports, formats and so on)
5) 使用的带宽信息
6) 可信赖的接洽信息(Contact information)
SDP会话描述是基于文字的,一个会话描述由一些类似如下形式的文字行组成:
Tyte:value
类型域为一个单独字符,而值域的格式则取决于它前面的类型语。一个SDP描述含有会话级信息和媒体级信息。会话级信息应用于整个会话。例如,它能成为会话始发者或者会话的名字。媒体级信息作用于特殊的媒体流。例如,它能作为一个编码器给音频流编码或者是给视频流发送端口号。
一个SDP会话描述以会话级信息和媒体级信息开始,会话级部分以v=0开始,v代表类型,0为值,意思是协议版本号为0(SDP版本0)。接下来的行直到媒体流部分或者会话描述的终点,提供了整个会话的信息。媒体级部分以m行开始。下面的行直到下一个m行出现,或者直到会话描述的终点,提供了特定媒体流的信息。
SDP具体语法如下:
会话描述:
v= (protocol version) //SDP版本,默认为0
o= (owner/creator and session identifier) //<用户名><会话id><版本><地址>
s= (session name) //会话名
i=* (session information) //会话信息
u=* (URI of description) //u=http://www.zte.com.cn/staff/sdp.ps
e=* (email address)
p=* (phone number)
c=* (connection information -如已经包含在所有媒体中则该行不需要)
b=* (bandwidth information)
z=* (time zone adjustments) //时区调整
k=* (encryption key) //<方法>:<密钥>或k=<方法>
a=* (zero or more session attribute lines) //a=<属性> 或a=<属性>:<值>
时间描述:
t= (time the session is active) //<开始时间><结束时间>,单位秒
r=* (zero or more repeat times) //<重复时间><活动持续时间
媒体描述:
m= (media name and transport address)//m=<媒体><端口><传送><格式列表>
i=* (media title媒体称呼)
c=* (connection information - 如已经包含在会话级描述则为可选)
b=* (bandwidth information)
k=* (encryption key)
a=* (zero or more media attribute lines)
注:v,o,s,t,m为必须的,其他项为可选。
如果SDP语法分析器不能识别某一类型(Type),则整个描述丢失;
如果"a="的某属性值不理解,则予以丢失
整个协议区分大小写
二、SIP实体
2.1用户代理
用户代理(UA,User Agent)表示一个终端系统。它可以是SIP电话机或者电脑上的SIP软终端。它包括两部分,用户代理客户端(UAC,User Agent Client)和用户代理服务器端(UAS,User Agent Server),前者产生请求,后者产生对应的响应。UAC和UAS是逻辑上的两个部分,每个终端系统都包含了UAC和UAS的功能。
2.2代理服务器
代理服务器(Proxy)是将请求消息路由到用户代理终端实体。一个请求消息在到达用户代理之前可能要经过若干个代理服务器的转发,每个代理服务器都要进行路由决策,并在将请求信息转发到下一个实体之前对其进行修改。响应消息将遍历请求信息所经的那些服务器,但顺序却完全相反。
按照工作模式,代理服务器分为有状态代理服务器(Stateful Proxy)和无状态代理服务器(Stateless Proxy)两种类型。
---无状态代理服务器只是作为一个简单的消息转发实体,它根据请求消息来做转发目的地和路由决策,然后把请求转发到下游的某个实体;
对于响应消息,则只简单地将其往上游方向转发。一旦消息转发完毕,无状态代理服务器将丢弃所有与此消息相关的信息。
---有状态代理服务器会记住它所收到的每个请求的信息,如事务状态,以及作为某一请求的处理结果而发送的任何请求的信息。这些信息将影响它对后续 的、与先前接收的某一请求相关的信息的处理。
2.3重定向服务器
重定向服务器(Redirect Server)是一个SIP实体,它接受用户代理或代理服务器的请求,对这些请求发送3xx(重定向响应)响应,响应消息中包含了请求的目标用户的可能地址的列表,以便用户代理或代理服务器重新发送请求消息。
2.4注册服务器
注册服务器(Registrar Server)是一个接收注册的SIP服务器,用以进行管理以及特定的服务。一个注册服务器通常伴同一个重定向服务器或者一个代理服务器同时出现。
2.5定为服务器
定位服务器(Location Server)不是SIP实体,但它们是任何使用SIP协议的体系结构中非常重要的一部分。位置服务器存储并且向用户返回可能的位置信息。它可以利用从注册服务器或者其他数据库得来的信息。大部分的注册服务器接收到位置信息时即刻将这些信息上载到定位服务器。