终端发起请求时如果服务器端需要对用户进行认证,那么会在本地产生本次认证的NONCE,并且通过认证请求头域将所有必要的参数返回给终端从而发起对用户认证过程。
终端收到认证请求消息后根据服务器端返回的信息和用户配置等信息采用特定的算法生成加密的RESPONSE,并且通过新的请求消息发送给服务器端。 服务器端在收到带有认证响应的新的请求消息后首先检查NONCE的正确性。如果NONCE不是本地产生,则直接返回失败。否则如果NONCE是本地产生,但是认证过程已经超时,则服务器端会重新产生NONCE并重新发起对用户的认证过程。其中老的NONCE会通过CNONCE参数返回。
NONCE验证通过后服务器端会根据NONCE、用户名、密码(服务器端可以根据本地用户信息获取用户的密码)、URI等采用和终端相同的算法生成RESPONSE,并且对此RESPONSE和请求消息中的RESPONSE进行比较,如果二者一致则用户认证成功,否则认证失败。 Authorization字段的一般格式为:
Authorization:认证方式 USERNAME,REALM,NONCE,RESPONSE,URI,CNONCE,ALGORITHM
认证方式:有DIGEST、BASIC、CHAP-PASSWORD、CARDDIGEST等认证方式。DIGEST为HTTP-DIGEST认证方式。目前SoftX3000只支持HTTP-DIGEST方式。以后为了实现Uniphone的卡号呼叫还会加入卡号认证的CARDDIGEST方式。
USERNAME:被认证的用户的用户名。 REALM:用于标识发起认证过程的域。
NONCE:由发起认证过程的实体产生的加密因子。
RESPONSE:终端在收到服务器的认证请求后根据服务器端产生的NONCE、用户名、密码、URI等信息经过一定的算法生成的一个字符串。该字符串中包含了经过加密后的用户密码。(在认证过程中处理用户密码之外其他信息都会通过SIP消息以明文的方式在终端和服务器端进行传递。)
URI:发起的呼叫请求消息的Request-URI。由于终端在收到认证请求后需要重新向服务器端发起请求(其中带有认证响应信息)。该请求消息在经过网络服务器时某些字段包括Request-URI都有可能被修改。认证头域的URI参数用于传递终端发起请求时原始消息的Request-URI用于对认证信息进行认证,这样才能保证认证过程的正确性。
CNONCE:如果在服务器端超时后终端才向服务器返回了带有认证响应的新的请求消息,则服务器端需要重新产生NONCE重新对用户进行认证。其中NONCE中带有新的NONCE,老的NONCE会通过CNONCE参数返回给终端。
ALGORITHM:用于传递生成RESPONSE的算法。
举例:
Authorization: DIGEST USERNAME=\NONCE=\
RESPONSE=\sip:191.169.150.30\
(3) 请求消息示例
下面是SIP请求消息编码的示例:
INVITE sip:66500002@191.169.1.110 SIP/2.0
From:
Call-ID: 20973e49f7c52937fc6be224f9e52543@sx3000
Via: SIP/2.0/UDP 191.169.1.116:5061;branch=z9hG4bkbc427dad6 Contact:
Allow:INVITE,ACK,CANCEL,OPTIONS,BYE,REGISTER,PRACK,INFO,UPDATE,SUBSCRIBE,
NOTIFY,MESSAGE,REFER
Content-Length:230
Content-Type: application/sdp v: 0
o: HuaweiSoftX3000 1073741831 1073741831 IN IP4 191.169.1.116 s: Sip Call
c: IN IP4 191.169.1.95 t: 0 0
m: audio 30000 RTP/AVP 8 0 4 18 a: rtpmap:8 PCMA/8000 a: rtpmap 0 PCMU/8000 a: rtpmap 4 G723/8000 a: rtpmap 18 G729/8000
第一行:请求起始行。INVITE请求消息。请求URI,即被邀用户的当前地址为“sip:66500002@191.169.1.110”。SIP版本号为2.0。 第二行:From
字段。指明请求发起方的地址为
“
字段。指明请求接收方的地址为
“
IP地址为191.169.1.116的SoftX3000控制下的终端44510000拨打IP地址为191.169.1.110的SoftX3000控制下的66500002终端。终端类型可以为SIP、H.323、IAD/AG下挂的ESL等。
第四行:Cseq字段。用于将INVITE请求和其触发的响应、对应的ACK、CANCEL请求相关联。
第五行:Call-ID字段。该字段唯一标识一个特定的邀请,全局唯一。Call-ID为“20973e49f7c52937fc6be224f9e52543@sx3000”,sx3000为发起呼叫的SoftX3000的域名,20973e49f7c52937fc6be224f9e52543为本地标识。 第六行:Via字段。该字段用于指示该请求历经的路径。“SIP/2.0/UDP”表示发送的协议,协议名为“SIP”,协议版本为2.0,传输层为UDP;“191.169.1.116:5061”表示发送方SoftX3000 IP地址为191.169.1.116,端
口号为5061;“branch=z9hG4bkbc427dad6”为分支参数,SoftX3000并行分发请求时标记各个分支。
第七行:Contact字段。指示其后的请求(如BYE请求)可以直接发往
第八行:100rel扩展,该字段为100类响应消息的可靠传输提供了相应的机制。 第九行:Max-Forwards字段。表示该请求到达其目的地址所允许经过的中转站的最大值为70。
第十行:Allow字段。给出IP地址为191.169.1.116的SoftX3000支持的请求消息类型 列表。
第十一~十二行:Content-Length字段,表示消息长度为230个字节。 第十三行:Content-Type字段,表示消息中携带的消息体是单消息体且为SDP。 第十四行:空行,表示下面为SDP会话描述。 第十五行:SDP协议版本号,目前为0版本。
第十六行:会话拥有者/创建者和会话标识,用于给出会话的发起者(其用户名和用户主机地址)以及会话标识和会话版本号。“HuaweiSoftX3000”为用户名,用户名是用户在发起主机上的登录名,如果主机不支持用户标识的概念,该字段标记为“-”。第一个“1073741831”为会话标识,会话标识为一数字串,使得多元组(用户名、会话标识、网络类型、地址类型、地址)构成会话的全球唯一的标识符。第二个“1073741831”为版本号,指该会话公告的版本。供代理服务器检测同一会话的若干个公告哪一个是最新的公告。其基本要求是会话数据修改后,其版本号应递增。“IN”指网络类型,为文本串形式,目前规定的“IN”为Internet。“IP4”指地址类型,为文本串形式,目前已定义的有“IP4”和“IP6”两种。“191.169.1.116”为创建会话的主机的IP地址。对于IP4地址类型,可以是域名全称或点分十进制IP4地址表示形式。对于IP6地址类型,可以是域名全称或压缩文本IP6地址表示形式。 第十七行:会话名。每个会话描述必需有一个且只有一个会话名。
第十八行:连接数据。网络类型和地址类型目前的定义值仅限于IN和IP4。“191.169.1.95”为SoftX3000(IP地址:191.169.1.116)控制下的终端的IP地址(终端类型为SIP、H.323电话或IAD/AG下挂的ESL电话)。
第十九行:时间描述,给出会话激活的时间区段,允许会话周期性发生。 “0”表示起始时间。该字段的格式为t:<起始时间><终止时间>。其中起始时间和终止时间值为NTP(Network Time Protocol)时间值的十进制表示,单位为秒。 第二十行:媒体级描述,该部分给出只适用于该媒体流的信息。“audio”表示媒体类型为音频。目前定义的媒体类型有5种:音频、视频、应用、数据和控制。“30000”指明媒体流发往的传送层端口,即终端的UDP端口号(终端类型为SIP、H.323电话或IAD/AG下挂的ESL电话)。“RTP/AVP”为传送层协议,其值和“c”行中的地址类型有关,对于IP4来说,大多数媒体业务流都在RTP/UDP上传送,已定义如下两类协议:RTP/AVP,音频/视频应用文档,
在UDP上传送;Udp,UDP协议。“8 0 4 18”对于音频和视频来说,就是RTP音频/视频应用文档中定义的媒体静荷类型。表示会话中所有这些格式都可能被用到,但第一个格式是会话的缺省格式。
该行总体表示,缺省A律PCM编码单信道音频信号,其在RTP音频/视频应用文档中的静态静荷类型号为8 ,该信号发往UDP端口30000。
第二十一~二十四行:rtpmap属性行,指明从RTP静荷类型至编码的映射关系。该行的格式为:a: rtpmap:<静荷类型><编码名>/<时钟速率>[/<编码参数>]。其中,<编码参数>指的就是音频信道数,对于视频信号尚无编码参数。 2. 响应消息 (1) 响应消息结构
如图3-4所示是SIP响应消息的格式,由起始行、消息头和消息体组成。通过换行符区分消息头中的每一行参数。对于不同的响应消息,有些参数可选。
图3-4 SIP响应消息结构
(2) 响应消息参数
响应消息参数请参考“请求消息参数”一节。 (3) 响应消息示例
下面是SIP响应消息编码的示例:
SIP/2.0 180 Ringing
From:
Call-ID: 20973e49f7c52937fc6be224f9e52543@sx3000
Via: SIP/2.0/UDP 191.169.1.116:5061;branch=z9hG4bkbc427dad6 Require:100rel RSeq:1
Contact:
Content-Type:application/sdp v=0
o=HuaweisoftX3000 1073741824 1073741824 IN IP4 191.169.1.110 s=Sip Call
c=IN IP4 191.169.1.135 t=0 0
m=audio 30016 RTP/AVP 8 a=rtpmap:8 PCMA/8000
第一行:SIP协议,版本号为2.0。状态码为180。“Ringing”为注释短语。表示向被叫送振铃。
第二行、第三行:请参考“请求消息示例”小节。
第四行:Cseq字段。用于将INVITE请求和其触发的响应、对应的ACK、CANCEL请求相关联。该响应消息和上文中的请求消息Cseq字段相同,均为“1 INVITE”,表明该响应消息由上文中的请求消息触发。 第五~第十一行:请参考“请求消息示例”小节。 第十二行:空行,表示下面为SDP会话描述。 第十三行:SDP协议版本号,目前为0版本。
第十四行:会话拥有者/创建者和会话标识,用于给出会话的发起者(其用户名和用户主机地址)以及会话标识和会话版本号。“HuaweiSoftX3000”为用户名,用户名是用户在发起主机上的登录名,如果主机不支持用户标识的概念,该字段标记为“-”。第一个“1073741824”为会话标识,会话标识为一数字串,使得多元组(用户名、会话标识、网络类型、地址类型、地址)构成会话的全球唯一的标识符。第二个“1073741824”为版本号,指该会话公告的版本。供代理服务器检测同一会话的若干个公告哪一个是最新的公告。其基本要求是会话数据修改后,其版本号应递增。“IN”指网络类型,为文本串形式,目前规定的“IN”为Internet。“IP4”指地址类型,为文本串形式,目前已定义的有“IP4”和“IP6”两种。“191.169.1.110”为创建会话的主机的IP地址。 第十五行:会话名。每个会话描述必需有一个且只有一个会话名。
第十六行:连接数据。网络类型和地址类型目前的定义值仅限于IN和IP4。“191.169.1.135”为SoftX3000(IP地址:191.169.1.110)控制下的终端的IP地址(终端类型为SIP、H.323电话或IAD/AG下挂的ESL电话)。 第十七行:时间描述,给出会话激活的时间区段,允许会话周期性发生。 第十八行:媒体级描述,该部分给出只适用于该媒体流的信息。“audio”表示媒体类型为音频。“30016”指明媒体流发往的传送层端口,即终端的UDP端