话描述中的标识,例如SDP中的o(源)字段的会话标识和版本号判定这些邀请的重复性。
Call-ID的一般格式为: Call-ID:本地标识@主机
其中,主机应为全局定义域名和全局可选路IP地址,此时,本地标识由在“主机”范围内唯一的URI字符组成。否则,本地标识必须是全局唯一的值,以保证Call-ID的全局唯一性。Call-ID字符需区分大小写。 Call-ID示例:
Call-Id: call-973636852-4@191.169.150.101
其中,191.169.150.101为主机的IP地址,call-973636852-4为全局唯一的本地标识。
?
From
所有请求和响应必须包含此字段,以指示请求的发起者。服务器将此字段从请求消息复制到响应消息。 该字段的一般格式为:
From:显示名
其中,显示名为用户界面上显示的字符,如果系统不予显示,应置显示名为“匿名(Anonymous)”。显示名为任选字段。tag称为标记,为16进制数字串,中间可带连字符“-”。当两个共享同一SIP地址的用户实例用相同的Call-ID发起呼叫邀请时,就需用此标记予以区分。标记值必须全局唯一。用户在整个呼叫期间应保持相同的Call-ID和标记值。 From字段的示例:
From:
?
To
该字段指明请求的接收者,其格式和From相同,仅第一个关键词代之以To。所有请求和响应消息必须包含此字段。
字段中的标记参数可用于区分由同一SIP URL标识的不同的用户实例。由于代理服务器可以并行分发多个请求,同一请求可能到达用户的不同实例(如住宅电话等)。由于每个实例都可能响应,因此需用标记来区分来自不同实例的响应。需要注意的是,To字段中的标记是由每个实例至于响应消息中的。 To字段的示例:
To:
To:
注意,在SIP中,Call-ID、From和To三个字段标识一个呼叫分支。在代理服务器并行分发请求时,一个呼叫可能会有多个呼叫分支。
?
Cseq
Cseq称之为命令序号。客户在每个请求中应加入此字段,它由命令名称和一个十进制序号组成,该序号由请求客户选定,在Call-ID范围内唯一确定。序号初
值可为任意值,其后具有相同Call-ID值,但不同命令名称、消息体的请求,其Cseq序号应加1。重发请求的序号保持不变。服务器将请求中的Cseq值复制到响应消息中,用于将请求和其触发的响应相关联。
ACK和CANCEL请求的Cseq值(十进制序号)和对应的INVITE请求相同,BYE请求的Cseq序号应大于INVITE请求。服务器必须记忆相同Call-ID的INVITE请求的最高序号,收到序号低于此值的INVITE请求应在给出响应后予以丢弃。
由代理服务器并行分发的请求,其Cseq值相同。严格来说,Cseq对于任何可由BYE或CANCEL请求取消的请求以及客户可连续发送多个具有相同Call-ID请求的情况都是需要的,其作用是判定响应和请求的对应关系。 Cseq字段的示例:
Cseq: 1 INVITE
?
Via
Via字段用以指示请求历经的路径。它可以防止请求消息传送产生环路,并确保响应和请求消息选择同样的路径,以保证通过防火墙或满足其它特定的选路要求。
发起请求的客户必须将其自身的主机名或网络地址插入请求的Via字段,如果未采用缺省端口号,还需插入此端口号。在请求前传过程中,每个代理服务器必须将其自身地址作为一个新的Via字段加在已有的Via字段之前。如果代理服务器收到一个请求,发现其自身地址位于Via头部中,则必须回送响应“检测到环路”。
当请求消息通过网络地址翻译点(如防火墙)时,请求的源地址和端口号可能被改变,此时Via字段就不能成为响应消息选路的依据。为了防止这一点,代理服务器应校验顶端Via字段,如果发现其值和代理服务器检测到的前站地址不符,则应在该Via字段中加入“receive”参数,如此修改后的字段称为“接收方标记Via头部字段”。例如:
Via:SIP/2.0/UDP softx3000.bell-telephone.com:5060 Via:SIP/2.0/UDP 10.0.0.1:5060;received=191.169.12.30
由点10.0.0.1发出的请求消息路径外部地址为191.169.12.30的网络地址翻译点后,到达代理服务器softx3000.bell-telephone.com。后者注意到前站发送地址和Via字段地址不符,就把实际发送地址作为接收方标记加在顶端Via字段的末尾,然后再将代理自己的地址作为新加的Via字段置于最上面。 若代理服务器向多播地址发送请求,则必须在其Via头部字段中加入“多播地址(maddr)”参数,此参数指明该多播地址。
代理服务器或UAC收到Via头部字段时的处理规则是:
规则1:第1个Via头部字段应该指示本代理服务器或UAC。如果不是,丢弃该消息,否则,删除该Via字段。
规则2:如果没有第2个Via头部字段,则该响应已经到达目的地。否则,继续做如下处理。
规则3:如果第2个Via头部字段包含“maddr”参数,则按该参数指示的多播地址发送响应,端口号由“发送方”参数指明,如未指明,就使用端口号5060。响应的生存期应置为“生存期(ttl)”参数指定的值,如未指明,则置为1。 规则4:如果第2个Via字段不包含“maddr”参数,但有一个接收方标记字段,则应将该响应发往“received”参数指示的地址。
规则5:如果既无“maddr”参数又无标记,就按发送方参数指示的地址发送响应。
Via字段的一般格式为:
Via:发送协议 发送方;隐藏参数;生存期参数;多播地址参数;接收方标记,分支参数
其中,发送协议的格式为:协议名/协议版本/传送层,协议名和传送层的缺省值分别为SIP和UDP。发送方为通常的发送方主机和端口号。隐藏参数就是关键词hidden,如有此参数,表示该字段已由上游代理予以加密,以提供隐私服务。多播地址参数和接收方标记的意义如前所述。生存期参数与多播地址参数配用。分支参数用于代理服务器并行分发请求时标记各个分支,当响应到达时,代理可判定是哪一分支的响应。 Via字段的示例:
Via:SIP/2.0/UDP191.169.1.116:5061;ttl=16;maddr=191.169.10.20;branch=z9hG4bkbc427dad6
?
Contact
该字段用于INVITE、ACK和REGISTER请求以及成功响应、呼叫进展响应和重定向响应消息,其作用是给出其后和用户直接通信的地址。
INVITE和ACK请求中的Contact字段指示该请求发出的位置。它使被叫可以直接将请求(如BYE请求)发往该地址,而不必借助Via字段经由一系列代理服务器返回。
对INVITE请求的成功响应消息可包含Contact字段,它使其后SIP请求(如ACK请求)可直接发往该字段给定的地址。该地址一般是被叫主机的地址,如果该主机位于防火墙之后,则为代理服务器地址。
对应于INVITE请求的呼叫进展响应消息中包含的Contact字段的含义和成功响应消息相同。但是,CANCEL请求不能直接发往该地址,必须沿原请求发送的路径前传。
REGISTER请求中的Contact字段指明用户可达位置。该请求还定义了通配Contact字段“*”,它只能和值为0的“失效”字段配用,表示去除某用户的所有登记。Contact字段也可设定“失效”参数(任选),给定登记的失效时间。如果没有设定该参数,则用“失效”字段值作为其缺省值。如果两者均无,则认为SIP URI的失效时间为1小时。
REGISTER请求的成功响应消息中的Contact字段返回该用户当前可达的所有位置。
重定向响应消息,如用户临时迁移、永久迁移、地址模糊等消息中的Contact字段给出供重试的其它可选地址,可用于对BYE、INVITE和OPTIONS请求的响应消息。
Contact字段的一般格式为:
Contact:地址;q参数;动作参数;失效参数;扩展属性
其中,地址的表示形式和To,From字段相同。q参数,其取值范围为[0,1],指示给定位置的相对优先级。数值越大,优先级越高。动作参数仅用于REGISTER请求。它表明希望服务器对其后至该客户的请求进行代理服务还是重定向服务。如果未含此参数,则执行动作取决于服务器的配置。失效参数指明URI的有效时间,可用秒表示,也可用SIP日期表示。扩展属性就是扩展名。 Contact字段的示例为:
Contact:
?
Max-Forwards
该字段用于定义一个请求到达其目的地址所允许经过的中转站的最大值。请求每经过一个中转站,该值减1。如果该值为0时该请求还没有到达其目的地址,服务器将回送“483”(Too Many Hops)响应并终止这个请求。
设置该字段的目的主要是为了出现环路时不会一直消耗代理服务器的资源。该字段的初始值为70。
Max-Forwards字段的一般格式为:
Max-Forwards:十进制整数
?
Allow
该字段给出代理服务器支持的所有请求消息类型列表。 Allow字段的示例:
Allow: INVITE, ACK, OPTIONS, CANCEL, BYE
?
Content-Length
该字段表示消息体的大小,为十进制值。应用程序使用该字段表示要发送的消息体的大小,而不考虑实体的媒体类型。如果使用基于流的协议(如TCP协议)作为传输协议,则必须使用此消息头字段。
消息体的长度不包括用于分离消息头部和消息体的空白行。 Content-Length值必须大于等于0。如果消息中没有消息体,则Content-Length头字段值必须设为0。
SDP用于构成请求消息和2xx响应消息的消息体。 Content-Length字段的一般格式为: Content-Length:十进制值 Content-Length字段的示例:
Content-Length: 349
表示消息体的长度为349个字节。
?
Content-Type
Content-Type字段表示发送的消息体的媒体类型。如果消息体不为空,则必须存在Content-Type 头字段。如果消息体为空且Content-Type 头字段存在,则表示此类型的消息体长度为0 (如一个空的声音文件)。 Content-Type字段的示例:
Content-Type: application/sdp
?
Supported
SIP协议中定义的100类临时响应消息的传输是不可靠的,即UAS发送临时响应后并不能保证UAC端能够接受到该消息。
如果需要在该响应消息中携带媒体信息,那么就必须保证该消息能够可靠的传输到对端。100rel扩展为100类响应消息的可靠传输提供了相应的机制。100rel新增加对临时响应消息的确认请求方法:PRACK。
如果UAC支持该扩展,则在发送的消息中增加Supported:100rel头域和字段。如果UAS支持该扩展,则在发送100类响应时增加Require:100rel头域和字段。UAC收到该响应消息后需要向UAS发送PRACK请求通知UAS已收到该临时响应。UAS向UAC发送对PRACK的2XX响应消息结束对该临时响应的确认过程。
如果某一UA想要在发送的临时响应消息中携带SDP消息体,那么UAC和UAS都必须支持和使用100rel扩展以保证该消息的可靠传输。 举例:
Supported: 100rel
?
User-Agent
User-Agent头字段包含有发起请求的用户终端的信息。
显示用户代理的软件版本信息可能会令用户在使用有安全漏洞的软件易受到外界攻击,因此,应该使User-Agent头字段成为可选配置项。 举例:
User-Agent: Softphone Beta1.5
?
Expires
Expires头字段指定了消息(或消息内容)多长时间之后超时。 举例:
Expires: 5
?
Accept-Language
Accept-Language头字段用在请求消息中,表示原因短语、会话描述或应答消息中携带的状态应答内容的首选语言类型。如果消息中没有Accept-Language头字段,则服务器端认为客户端支持所有语言。 举例:
Accept-Language: en
?
Authorization
Authorization字段包含某个终端的鉴权证书。 首先介绍一下终端向服务器端请求认证的一般过程: