【1】SIP消息格式

SIP消息分为请求和响应两类。

请求消息是UAC(客户端)发往UAS(服务器端),响应消息是UAS发往UAC。

不论请求消息或者响应消息,它都是由一个起始行、若干个头字段和一个消息体组成。

消息格式:



起始行
 
消息头部(若干个头字段)
 
空行
 
消息体(SDP)



如下实例(由wireshark抓包所得的sip包):

sigmesh vendor消息 sip消息487_字段

(1)起始行

如上实例,起始行如下:

sigmesh vendor消息 sip消息487_sigmesh vendor消息_02

说明:

起始行对于请求是请求行,对于响应是状态行。

Method:方法表示请求的类型,核心的类型有6种,INVITE,ACK,BYE,CANCEL,REGISTER和OPTIONS

Request-URI:请求的URI表示此请求将要被发送的目标地址

SIP-Version:一般为SIP/2.0

如下图为响应消息,起始行为状态行(状态行由协议版本、状态码和状态原因短语组成):

sigmesh vendor消息 sip消息487_方法名_03

(2)消息头

如上实例,消息头展开如下:

sigmesh vendor消息 sip消息487_字段_04

说明:

[1] Via

via头字段指定目前请求消息经过的路径(专业可理解为路由),同时指定响应也要按该路径返回。

该字段值中的branch ID参数是一个事务标识符,代理服务器用它来检测环路。

[2] Max-forwards

在RFC3261中规定,Max-Forwards(最大转发次数)头字段必须和任何方法一起规定向下游转发消息的代理服务器和网关的个数。

当某客户端沿着某条链路发送请求消息的时候,使用该字段可以有效地防止链路中出错或者发生回环。

Max-forwards头字段的值是一个0-255的整数,指示了该请求还允许被转发的次数。转发该请求时,每经过一个服务器该值就减一。

一般默认为70。例如:

Max-Forwards: 70

[3] Contact

Contact字段的值含有一个URI,UA可根据这个地址,直接找到另一个UA,从而避开SIP服务器。

关于rinstance参数,因为有的SIP终端支持多路通话,所以利用rinstance可以区别到底属于哪路通话。

[4] To

To头部字段指明请求消息的逻辑接收者或者是用户或资源的注册帐号,该地址是作为请求消息的目标地址。

特别强调,将一个请求的To头字段和Request-URI区分开来非常重要:

在整个会话过程中,To头字段含有同样的内容,它是打算用于远端用户代理的,它不能被代理改变。

而Request-URI含有在信令路径中下一跳的地址,并因此在路途中被每个代理改变。

[5] From

From头域包含了请求发起者的逻辑标志,可能是用户的address-of-record。

就像To头域一样,From头域也包含一个URI并且可以包含一个显示的姓名。

SIP可以用这个头域来实现对请求的检查和选择一个规则进行对请求的处理(比如,自动的呼叫拒绝,凡是某人发过来的东西,一律无视等等)。

同样的,因为From头域包含的是逻辑名字,所以From URI也可以不包含IP地址或者UA对应的主机名字。

这个域也包含了一个TAG参数,这个TAG参数是一个随机字串(1928301774),是软电话(softphone)在URI上增加的一个随机串。用来做标志用途的。

[6] Call-ID

Call-ID头字段唯一的标识某个客户端的某个特定的会话或所有的注册请求。

一个多媒体会议可以发起几个Call-ID不同的呼叫,例如,一个发 起者A可以邀请用户B参与一个会议,随后又邀请用户C参与同一个会议,那么,A与B有一个Call-ID,A与C有另一个Call-ID。

那么,A发送 BYE请求时,就是通过不同的Call-ID来选择结束那个会话。

Call-ID区分大小写并逐字节比较。

[7] CSeq

命令序列头字段Cseq位于请求消息中,包含两个字段:一个无符号整数字段和一个方法名。

该头字段用于把某对话中的事务进行排序且提供了一种唯一标 识某事务的方法(即INVITE、ACK等method),并能够区分某请求是新的请求还是重发的请求。

如果两个Cseq的数字序列以及方法都相等那么这 两个Cseq就是等价的。

例如:Cseq: 8019084 INVITE

200 OK中的Cseq:完整地复制对应请求中的Cseq,不做任何修改;

ACK中的Cseq:和对应的最终响应有相同的整数序列,只是方法名变为ACK;

CANCEL中的Cseq:和对应的请求(一般是INVITE)由相同的整数序列,只是方法名变为CANCEL;

[8] Allow

Allow列出了发起请求UA支持的方法列表。UA能理解的所有方法都必须列于该头字段中。

消息中若无该头字段,则意味UA未提供任何关于它所支持方法的信息,并不意味着UA不支持任何方法。

响应消息中的Allow包含OPTIONS以外其他的方法,因此可以减少所需消息数量。

例如:

Allow: OPTIONS, SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, MESSAGE

[9] Content-Type

Content-Type头字段指定发给对方的消息体的媒体类型。

如果消息体不为空,那么Content-Type头字段就必须存在。

如果消息体是空的,并且该头字段存在,那么就表示了特定类型的媒体的包体长度为0(比如空的音频文件)。

[10] Supported

Supported头字段列举了UAC或者UAS支持的所有扩展。

Supported头字段包含了一个UAS或者UAC所支持的option tag列表。如果本字段是空的,表示不支持任何扩展。

[11] User-Agent

User-Agent头字段包含了发起请求的UAC信息。

如果显示UA的特定软件版本信息,假如该软件存在安全漏洞,该UA就容易受到攻击,应把User-Agent字段作为可配置的选项。

[12] Content-Length

Content-Length头字段指定发给对方的消息内容长度。

[13] Proxy-Authorization

Proxy-Authorization头字段用于用户对要求鉴权的proxy标识自己。

Proxy-Authorization头字段包含一个证书,其中包含UA对于proxy的鉴权信息和所要请求的资源的域。

关于多字段名的一般规定并不适用于Proxy-Authorization和Authorization头字段。

虽然多个数值之间没有逗号分隔,该头字段名仍可以出现多次,但是不可以将它们结合成一个单独的头字段行。

带有鉴权消息的实例如下:

sigmesh vendor消息 sip消息487_Max_05

(3)消息体

如上实例,消息头如下:

sigmesh vendor消息 sip消息487_Max_06

说明:关于消息体内容,我们重点关注一下媒体描述Media Description中的编码类型。如上例,G.711

 

Good Good Study, Day Day Up.

顺序 选择 循环 总结