1、请求消息 消息含义INVITE发起会话请求,邀请用户加入一个会话,会话描述含于消息体中。对于两方呼叫来说,主叫方在会话描述中指示其能够接受的媒体类型及其参数。被叫方必需在成功响应消息的消息体中指明其希望接受哪些媒体,还可以指示其行将发送的媒体。如果收到的是关于参加会议的邀请,被叫方可以根据 Call-ID 或者会话描述中的标识确定用户已经加入该会议,并返回成功响应消息。ACK 证实已收到对于 INVITE 请求的最终响应。该消息仅和 INVITE 消息配套使用。BYE 结束会话CANCEL 取消尚未完成的请求,对于已完成的请求(即已收到最终响应的请求)则没有影响REGISTER 注册OPTIO
2、NS 查询服务器的能力表 3-2 响应消息序号 状态码 消息功能信息响应(呼叫进展响应) 表示已经接收到请求消息,正在对其进行处理100 试呼叫180 振铃181 呼叫正在前转1xx182 排队成功响应 表示请求已经被成功接受、处理2xx200 OK重定向响应 表示需要采取进一步动作,以完成该请求300 多重选择301 永久迁移302 临时迁移303 见其它305 使用代理3xx380 代换服务客户出错 表示请求消息中包含语法错误或者 SIP 服务器不能完成对该请求消息的处理400 错误请求401 无权4xx402 要求付款序号 状态码 消息功能403 禁止404 没有发现405 不允许的方法
3、406 不接受407 要求代理权408 请求超时410 消失413 请求实体太大414 请求 URI 太大415 不支持的媒体类型416 不支持的 URI 方案420 分机无人接听421 要求转机423 间隔太短480 暂时无人接听481 呼叫腿/事务不存在482 相环探测483 跳频太高484 地址不完整485 不清楚486 线路忙487 终止请求488 此处不接受491 代处理请求493 难以辨认服务器出错 表示 SIP 服务器故障不能完成对正确消息的处理500 内部服务器错误501 没实现的502 无效网关503 不提供此服务504 服务器超时5xx505 SIP 版本不支持序号 状态码
4、 消息功能513 消息太长全局故障 表示请求不能在任何 SIP 服务器上实现600 全忙603 拒绝604 都不存在6xx606 不接受请求消息和响应消息都包括 SIP 头字段和 SIP 消息字段。目 录第 3 章 SIP 协议3.1 概述3.1.1 基本概念3.1.2 相关术语3.1.3 协议栈结构3.1.4 SIP 协议的应用3.2 协议消息3.2.1 消息类型3.2.2 消息结构3.3 基本消息流程3.3.1 SIP 用户注册流程3.3.2 成功的 SIP 用户呼叫流程3.3.3 成功的 SIP 中继呼叫流程3.3.4 成功的 SIP-T 中继呼叫流程第 3 章 SIP 协议3.1 概述
5、3.1.1 基本概念会话启动协议 SIP(Session Initiation Protocol)是由 IETF 提出并主持研究的一个在IP 网络上进行多媒体通信的应用层控制协议,它被用来创建、修改、和终结一个或多个参加者参加的会话进程。这些会话包括 Internet 多媒体会议、Internet 电话、远程教育以及远程医疗等。即所有的因特网上交互式两方或多方多媒体通信活动,统称为多媒体会话。参加会话的成员可以通过组播方式、单播联网方式或者两者结合的方式进行通信。SIP 协议是一个正在发展和不断研究中的协议。一方面,它借鉴了其他 Internet 标准和协议的设计思想,在风格上遵循因特网一贯坚
6、持的简练、开放、兼容和可扩展等原则,并充分注意到因特网开放而复杂的网络环境下的安全问题。另一方面,它也充分考虑了对传统公共电话网的各种业务,包括 IN 业务和 ISDN 业务的支持。利用带有会话描述的 SIP 邀请消息来创建会话,以使参加者能够通过 SIP 交互进行媒体类型协商。它通过代理和重定向请求用户当前位置,以支持用户的移动性。用户也可以登记它们的当前位置。SIP 协议独立于其他会议控制协议,它在设计上独立于下面的传输层协议,因此可以灵活方便地扩展其他附加功能。SIP 作为一个应用层的多媒体会话信令协议,可以被用来发起一个会话进程、在会话中邀请其他参加者加入会议,会话本身可以通过基于组播
7、协议的会话通告协议(SAP)、电子邮件、网页通告、以及轻量级号薄访问协议(LDAP )等方式预先通告各个可能的参加者。SIP 协议支持别名映射、重定向服务、ISDN 和 IN 业务。它支持个人移动(personal mobility),即终端用户能够在任何地方、任何时间请求和获得已订购的任何电信业务。总的来说,会话启动协议能够支持下列五种多媒体通信的信令功能: 用户定位:确定参加通信的终端用户的位置; 用户通信能力协商:确定通信的媒体类型和参数; 用户意愿交互:确定被叫是否乐意参加某个通信; 建立呼叫:包括向被叫“振铃”,确定主叫和被叫的呼叫参数; 呼叫处理和控制:包括呼叫重定向、呼叫转移、终
8、止呼叫等等。SIP 协议可以通过 MCU(Multipoint Control Unit)、单播联网方式、或组播方式创建多方会话,支持 PSTN 和因特网电话之间的网关功能。SIP 协议可以与其他用于建立呼叫的信令系统或协议结合使用,它在设计上充分考虑了对其他协议的可扩展性。譬如,SIP 协议支持的主叫可以识别出 H.323 协议支持的被叫,通过 H.245 网关利用 H.225.0 协议向被叫发起并建立呼叫;另外,一个 SIP 主叫可以识别出 PSTN 上的被叫及其电话号码,通过与 PSTN 相连的网关向被叫发起并建立呼叫。SIP 协议不提供发言控制( floor control)、投票等会
9、议控制功能,也不规定如何管理一个会议。但是 SIP 协议可被用来引发这些会议控制协议。SIP 协议本身不具备资源预留功能,但可以向被邀请者们传达这方面的信息。3.1.2 相关术语1. 呼叫一个呼叫是由一个公共源端所邀请的在一个会议中的所有参加者组成,由一个全球唯一的 Call-ID 进行标识。例如:由同一个源邀请的一个会议的所有参加者构成一个呼叫;点到点 IP 电话会话是一种最简单的会话,它映射为单一的 SIP 呼叫。通常情况下,呼叫由主叫方创建,但是更一般说来,呼叫可由并不参与媒体通信的第三方创建,此时会话的主叫方和会话的邀请方并不相同。对于多播会议来说,一个用户可由不同的人邀请参加同一会议
10、,则每一个邀请应视作不同的呼叫。对于基于 MCU的会议,每个参与者使用一个呼叫邀请自己加入 MCU。2. 事务SIP 是一个客户 /服务器协议。客户和服务器之间的操作从第 1 个请求至最终响应为止的所有消息构成一个 SIP 事务。一个正常的呼叫一般包含三个事务。其中,呼叫启动包含两个操作请求:邀请(Invite)和证实(ACK ),前者需要回送响应,后者只是证实已收到最终响应,不需要回送响应。呼叫终结包含一个操作请求:再见(Bye)。3. SIP URL为了能正确传送协议消息,SIP 还需解决两个重要的问题。一是寻址,即采用什么样的地址形式标识终端用户;二是用户定位(下面介绍)。SIP 沿用
11、WWW 技术解决这两个问题。寻址采用 SIP URL(Uniform Resource Locators),按照 RFC2396 规定的 URI 导则定义其语法,特别是用户名字段可以是电话号码,以支持 IP 电话网关寻址,实现 IP 电话和 PSTN 的互通。SIP URL 的一般结构为:SIP:用户名:口令 主机:端口;传送参数;用户参数;方法参数;生存期参数;服务器地址参数?头部名头部值“SIP”表示需采用 SIP 协议和所指示的端系统通信。“用户名”可以由任意字符组成,一般可取类似与 E-mail 用户名形式,也可以是电话号码(SoftX3000 目前用户名是电话号码)。“主机”可为主机
12、域名或 IPv4 地址。“端口”指示请求消息送往的端口号,其缺省值为 5060,即公开的 SIP 端口号。“口令”可以置于 SIP URL 中,但一般不建议这样做,因为其安全性是有问题的。“传送参数”指示采用 TCP 还是 UDP 传送,缺省值为 UDP。“用户参数”,SIP URL 的一个特定功能是允许主机类型为 IP 电话网关,此时,用户名可以为一般的电话号码。由于 BNF 语法表示无法区分电话号码和一般的用户名,因此,在域名后增加了“用户参数”字段。该字段有两个可选值:IP 和电话,当其设定为“电话”时,表示用户名为电话号码,对应的端系统为 IP 电话网关。“方法参数”指示所用的方法(操
13、作)。“生存期参数”指示 UDP 多播数据包的寿命,仅当传送参数为 UDP、服务器地址参数为多播地址时才能使用。“服务器地址参数”指示和该用户通信的服务器的地址,它覆盖“主机”字段中的地址,通常为多播地址。“传送参数”、“生存期参数”、“服务器地址参数”和“方法参数”均属于 URL 参数,只能在重定向地址,即后面所说的 Contact 字段中才能使用。下面给出若干个 SIP URL 的示例:Sip; 55500200191.169.1.112; 55500200 为用户名, 191.169.1.112 为 IP 电话网关的 IP 地址。Sip; 55500200127.0.0.1:5061;
14、User=phone;55500200 为用户名, 127.0.0.1 为主机的 IP 地址,5061 为主机端口号。用户参数为“电话”,表示用户名为电话号码。Sip: ; method=REGISTER;Alice 为用户名, 为主机域名。方法参数为“登记”。4. 用户定位用户定位基于登记。SIP 用户终端上电后即向登记服务器(SoftX3000)登记,SIP 专门为此定义了一个“登记”(REGISTER)请求消息,并规定了登记操作过程。5. 定位服务(Location Service)SIP 重定位服务器或代理服务器用来获得被叫位置的一种服务,可由定位服务器提供,但 SIP 协议不规定 S
15、IP 服务器如何请求定位服务。在华为 U-SYS 解决方案中,SoftX3000 兼任定位服务器的角色。6. 代理,代理服务器(Proxy、Proxy sever)作为一个逻辑网络实体代表客户端转发请求或者响应,可以同时作为客户端和服务器端。代理服务器有三种形态:Stateless、Stateful 和 Call Stateful,其可以采用分支、循环等方式向多个地址尝试转发请求。代理服务器的主要功能:路由、认证鉴权、计费监控、呼叫控制、业务提供等。在华为 U-SYS 解决方案中,SoftX3000 兼任代理服务器的角色。7. 重定向服务器(Redirect server)重定向服务器将请求中
16、的目的地址映射为零个或多个新的地址,然后返回给客户端,客户端直接再次向这些新的地址发起请求。重定向服务器并不接收或者拒绝呼叫,主要完成路由功能,与注册过程配合可以支持 SIP 终端的移动性。在华为 U-SYS 解决方案中,SoftX3000 兼任重定向服务器的角色。8. 注册员(Registrar )注册员为接收注册请求的服务器,通常与 Proxy 或者 Redirect Server 共存。注册员需要将注册请求中的地址映射关系保存到数据库中,供后续的相关呼叫过程使用,同时可以提供定位服务。在华为 U-SYS 解决方案中,SoftX3000 兼任注册员的角色。9. 用户助理(User Agen
17、t)用来发起或者接收请求的逻辑实体称为 User Agent。10. 用户助理客户(User Agent Client)发起请求的一方称为 UAC(User Agent Client),举例 SIP Phone 就是 UAC 的一种实际形态。11. 用户助理服务器(User Agent Server)接收请求的一方称为 UAS(User Agent Server),举例 SoftX3000 就是 UAS 的一种实际形态。注意:UAC 和 UAS 的划分是针对一个事务而言的。3.1.3 协议栈结构SIP 协议栈结构如 图 3-1 所示。图 3-1 SIP 协议栈SIP 协议是 IETF 多媒体数
18、据和控制体系结构的一部分,与其它协议相互合作,例如:RSVP( Resource ReServation Protocol)用于预约网络资源,RTP(Real-time Transmit Protocol)用于传输实时数据并提供服务质量(QoS )反馈,RTSP (Real-Time Stream Protocol)用于控制实时媒体流的传输, SAP(Session Announcement Protocol)用于通过组播发布多媒体会话,SDP(Session Description Protocol)用于描述多媒体会话。但是 SIP 协议的功能和实施并不依赖这些协议。传输层支持:SIP 协议
19、承载在 IP 网,网络层协议为 IP,传输层协议可用 TCP 或UDP,推荐首选 UDP。3.1.4 SIP 协议的应用SoftX3000 通过 SIP/SIP-T 与其它软交换系统互通,以及与其它 SIP 域设备(如 SIP Phone,SIP Softphone 等)互通,SIP 协议在 NGN 中的典型应用如 图 3-2 所示:图 3-2 SIP 在 NGN 中的典型应用3.2 协议消息3.2.1 消息类型SIP 消息采用文本方式编码,分为两类:请求消息和响应消息。1. 请求消息用于客户端为了激活按特定操作而发给服务器的 SIP 消息,包括 INVITE, ACK,OPTIONS,BYE
20、,CANCEL 和 REGISTER 消息等,各消息功能如 表 3-1 所示。表 3-1 请求消息请求消息 消息含义INVITE发起会话请求,邀请用户加入一个会话,会话描述含于消息体中。对于两方呼叫来说,主叫方在会话描述中指示其能够接受的媒体类型及其参数。被叫方必需在成功响应消息的消息体中指明其希望接受哪些媒体,还可以指示其行将发送的媒体。如果收到的是关于参加会议的邀请,被叫方可以根据 Call-ID 或者会话描述中的标识确定用户已经加入该会议,并返回成功响应消息。ACK 证实已收到对于 INVITE 请求的最终响应。该消息仅和 INVITE 消息配套使用。BYE 结束会话CANCEL 取消尚
21、未完成的请求,对于已完成的请求(即已收到最终响应的请求)则没有影响REGISTER 注册OPTIONS 查询服务器的能力2. 响应消息用于对请求消息进行响应,指示呼叫的成功或失败状态。不同类的响应消息由状态码来区分。状态码包含三位整数,状态码的第一位用于定义响应类型,另外两位用于进一步对响应进行更加详细的说明。各响应消息分类和含义如 表 3-2 所示。表 3-2 响应消息序号 状态码 消息功能信息响应(呼叫进展响应) 表示已经接收到请求消息,正在对其进行处理100 试呼叫180 振铃181 呼叫正在前转1xx182 排队成功响应 表示请求已经被成功接受、处理2xx200 OK重定向响应 表示需
22、要采取进一步动作,以完成该请求300 多重选择301 永久迁移302 临时迁移303 见其它305 使用代理3xx380 代换服务客户出错 表示请求消息中包含语法错误或者 SIP 服务器不能完成对该请求消息的处理400 错误请求401 无权402 要求付款403 禁止404 没有发现405 不允许的方法406 不接受407 要求代理权408 请求超时410 消失4xx413 请求实体太大序号 状态码 消息功能414 请求 URI 太大415 不支持的媒体类型416 不支持的 URI 方案420 分机无人接听421 要求转机423 间隔太短480 暂时无人接听481 呼叫腿/事务不存在482 相
23、环探测483 跳频太高484 地址不完整485 不清楚486 线路忙487 终止请求488 此处不接受491 代处理请求493 难以辨认服务器出错 表示 SIP 服务器故障不能完成对正确消息的处理500 内部服务器错误501 没实现的502 无效网关503 不提供此服务504 服务器超时505 SIP 版本不支持5xx513 消息太长全局故障 表示请求不能在任何 SIP 服务器上实现600 全忙603 拒绝604 都不存在6xx606 不接受请求消息和响应消息都包括 SIP 头字段和 SIP 消息字段。在 SIP 消息中加入 SDP 消息正文部分。3.2.2 消息结构1. 请求消息(1) 请求
24、消息结构如 图 3-3 所示是 SIP 请求命令的格式,由起始行、消息头和消息体组成。通过换行符区分消息头中的每一条参数行。对于不同的请求消息,有些参数可选。图 3-3 SIP 请求消息结构(2) 请求消息参数下面仅对几个常用的参数字段进行说明。 Call-ID该字段用以唯一标识一个特定的邀请或标识某一客户的所有登记。需要注意的是,一个多媒体会议可能会有多个呼叫,每个呼叫有其自己的 Call-ID。例如,某用户可数次邀请某人参加同一历时很长的会议。用户也可能会收到数个参加同一会议或呼叫的邀请,其 Call-ID 各不相同。用户可以利用会话描述中的标识,例如SDP 中的 o(源)字段的会话标识和
25、版本号判定这些邀请的重复性。Call-ID 的一般格式为:Call-ID:本地标识主机其中,主机应为全局定义域名和全局可选路 IP 地址,此时,本地标识由在 “主机”范围内唯一的 URI 字符组成。否则,本地标识必须是全局唯一的值,以保证 Call-ID 的全局唯一性。Call-ID 字符需区分大小写。Call-ID 示例:Call-Id: call-973636852-4191.169.150.101其中,191.169.150.101 为主机的 IP 地址,call-973636852-4 为全局唯一的本地标识。 From所有请求和响应必须包含此字段,以指示请求的发起者。服务器将此字段从请
26、求消息复制到响应消息。该字段的一般格式为:From:显示名 ;tag=xxxx其中,显示名为用户界面上显示的字符,如果系统不予显示,应置显示名为“匿名(Anonymous)”。显示名为任选字段。 tag 称为标记,为 16 进制数字串,中间可带连字符“-”。当两个共享同一 SIP 地址的用户实例用相同的 Call-ID 发起呼叫邀请时,就需用此标记予以区分。标记值必须全局唯一。用户在整个呼叫期间应保持相同的Call-ID 和标记值。From 字段的示例:From: ;tag=1c17691 To该字段指明请求的接收者,其格式和 From 相同,仅第一个关键词代之以 To。所有请求和响应消息必须
27、包含此字段。字段中的标记参数可用于区分由同一 SIP URL 标识的不同的用户实例。由于代理服务器可以并行分发多个请求,同一请求可能到达用户的不同实例(如住宅电话等)。由于每个实例都可能响应,因此需用标记来区分来自不同实例的响应。需要注意的是,To 字段中的标记是由每个实例至于响应消息中的。To 字段的示例:To: To: ;tag=62beb3ca注意,在 SIP 中,Call-ID、From 和 To 三个字段标识一个呼叫分支。在代理服务器并行分发请求时,一个呼叫可能会有多个呼叫分支。 CseqCseq 称之为命令序号。客户在每个请求中应加入此字段,它由命令名称和一个十进制序号组成,该序号
28、由请求客户选定,在 Call-ID 范围内唯一确定。序号初值可为任意值,其后具有相同 Call-ID 值,但不同命令名称、消息体的请求,其 Cseq 序号应加 1。重发请求的序号保持不变。服务器将请求中的 Cseq 值复制到响应消息中,用于将请求和其触发的响应相关联。ACK 和 CANCEL 请求的 Cseq 值(十进制序号)和对应的 INVITE 请求相同,BYE 请求的 Cseq 序号应大于 INVITE 请求。服务器必须记忆相同 Call-ID 的 INVITE 请求的最高序号,收到序号低于此值的 INVITE 请求应在给出响应后予以丢弃。由代理服务器并行分发的请求,其 Cseq 值相同
29、。严格来说,Cseq 对于任何可由 BYE或 CANCEL 请求取消的请求以及客户可连续发送多个具有相同 Call-ID 请求的情况都是需要的,其作用是判定响应和请求的对应关系。Cseq 字段的示例:Cseq: 1 INVITE ViaVia 字段用以指示请求历经的路径。它可以防止请求消息传送产生环路,并确保响应和请求消息选择同样的路径,以保证通过防火墙或满足其它特定的选路要求。发起请求的客户必须将其自身的主机名或网络地址插入请求的 Via 字段,如果未采用缺省端口号,还需插入此端口号。在请求前传过程中,每个代理服务器必须将其自身地址作为一个新的 Via 字段加在已有的 Via 字段之前。如果
30、代理服务器收到一个请求,发现其自身地址位于 Via 头部中,则必须回送响应“检测到环路”。当请求消息通过网络地址翻译点(如防火墙)时,请求的源地址和端口号可能被改变,此时 Via 字段就不能成为响应消息选路的依据。为了防止这一点,代理服务器应校验顶端 Via 字段,如果发现其值和代理服务器检测到的前站地址不符,则应在该 Via 字段中加入“receive”参数,如此修改后的字段称为 “接收方标记 Via 头部字段”。例如:Via:SIP/2.0/UDP softx3000.bell-:5060Via:SIP/2.0/UDP 10.0.0.1:5060;received=191.169.12.3
31、0由点 10.0.0.1 发出的请求消息路径外部地址为 191.169.12.30 的网络地址翻译点后,到达代理服务器 softx3000.bell-。后者注意到前站发送地址和 Via 字段地址不符,就把实际发送地址作为接收方标记加在顶端 Via 字段的末尾,然后再将代理自己的地址作为新加的 Via 字段置于最上面。若代理服务器向多播地址发送请求,则必须在其 Via 头部字段中加入“多播地址(maddr)”参数,此参数指明该多播地址。代理服务器或 UAC 收到 Via 头部字段时的处理规则是:规则 1:第 1 个 Via 头部字段应该指示本代理服务器或 UAC。如果不是,丢弃该消息,否则,删除
32、该 Via 字段。规则 2:如果没有第 2 个 Via 头部字段,则该响应已经到达目的地。否则,继续做如下处理。规则 3:如果第 2 个 Via 头部字段包含“maddr”参数,则按该参数指示的多播地址发送响应,端口号由“发送方”参数指明,如未指明,就使用端口号 5060。响应的生存期应置为“生存期(ttl)”参数指定的值,如未指明,则置为 1。规则 4:如果第 2 个 Via 字段不包含“maddr”参数,但有一个接收方标记字段,则应将该响应发往“received”参数指示的地址。规则 5:如果既无“maddr” 参数又无标记,就按发送方参数指示的地址发送响应。Via 字段的一般格式为:Vi
33、a:发送协议 发送方;隐藏参数;生存期参数;多播地址参数;接收方标记,分支参数其中,发送协议的格式为:协议名/协议版本/ 传送层,协议名和传送层的缺省值分别为SIP 和 UDP。发送方为通常的发送方主机和端口号。隐藏参数就是关键词 hidden,如有此参数,表示该字段已由上游代理予以加密,以提供隐私服务。多播地址参数和接收方标记的意义如前所述。生存期参数与多播地址参数配用。分支参数用于代理服务器并行分发请求时标记各个分支,当响应到达时,代理可判定是哪一分支的响应。Via 字段的示例:Via:SIP/2.0/UDP191.169.1.116:5061;ttl=16;maddr=191.169.1
34、0.20;branch=z9hG4bkbc427dad6 Contact该字段用于 INVITE、ACK 和 REGISTER 请求以及成功响应、呼叫进展响应和重定向响应消息,其作用是给出其后和用户直接通信的地址。INVITE 和 ACK 请求中的 Contact 字段指示该请求发出的位置。它使被叫可以直接将请求(如 BYE 请求)发往该地址,而不必借助 Via 字段经由一系列代理服务器返回。对 INVITE 请求的成功响应消息可包含 Contact 字段,它使其后 SIP 请求(如 ACK 请求)可直接发往该字段给定的地址。该地址一般是被叫主机的地址,如果该主机位于防火墙之后,则为代理服务器
35、地址。对应于 INVITE 请求的呼叫进展响应消息中包含的 Contact 字段的含义和成功响应消息相同。但是,CANCEL 请求不能直接发往该地址,必须沿原请求发送的路径前传。REGISTER 请求中的 Contact 字段指明用户可达位置。该请求还定义了通配 Contact字段“*”,它只能和值为 0 的“失效”字段配用,表示去除某用户的所有登记。Contact 字段也可设定 “失效”参数(任选),给定登记的失效时间。如果没有设定该参数,则用“失效”字段值作为其缺省值。如果两者均无,则认为 SIP URI 的失效时间为 1 小时。REGISTER 请求的成功响应消息中的 Contact 字
36、段返回该用户当前可达的所有位置。重定向响应消息,如用户临时迁移、永久迁移、地址模糊等消息中的 Contact 字段给出供重试的其它可选地址,可用于对 BYE、INVITE 和 OPTIONS 请求的响应消息。Contact 字段的一般格式为:Contact:地址; q 参数;动作参数;失效参数;扩展属性其中,地址的表示形式和 To,From 字段相同。q 参数,其取值范围为0,1 ,指示给定位置的相对优先级。数值越大,优先级越高。动作参数仅用于 REGISTER 请求。它表明希望服务器对其后至该客户的请求进行代理服务还是重定向服务。如果未含此参数,则执行动作取决于服务器的配置。失效参数指明 U
37、RI 的有效时间,可用秒表示,也可用 SIP 日期表示。扩展属性就是扩展名。Contact 字段的示例为:Contact: ;q=0.7;expires=3600 Max-Forwards该字段用于定义一个请求到达其目的地址所允许经过的中转站的最大值。请求每经过一个中转站,该值减 1。如果该值为 0 时该请求还没有到达其目的地址,服务器将回送“483”(Too Many Hops)响应并终止这个请求。设置该字段的目的主要是为了出现环路时不会一直消耗代理服务器的资源。该字段的初始值为 70。Max-Forwards 字段的一般格式为:Max-Forwards:十进制整数 Allow该字段给出代理
38、服务器支持的所有请求消息类型列表。Allow 字段的示例:Allow: INVITE, ACK, OPTIONS, CANCEL, BYE Content-Length该字段表示消息体的大小,为十进制值。应用程序使用该字段表示要发送的消息体的大小,而不考虑实体的媒体类型。如果使用基于流的协议(如 TCP 协议)作为传输协议,则必须使用此消息头字段。消息体的长度不包括用于分离消息头部和消息体的空白行。 Content-Length 值必须大于等于 0。如果消息中没有消息体,则 Content-Length 头字段值必须设为 0。SDP 用于构成请求消息和 2xx 响应消息的消息体。Content
39、-Length 字段的一般格式为:Content-Length:十进制值Content-Length 字段的示例:Content-Length: 349表示消息体的长度为 349 个字节。 Content-TypeContent-Type 字段表示发送的消息体的媒体类型。如果消息体不为空,则必须存在Content-Type 头字段。如果消息体为空且 Content-Type 头字段存在,则表示此类型的消息体长度为 0 (如一个空的声音文件)。Content-Type 字段的示例:Content-Type: application/sdp SupportedSIP 协议中定义的 100 类临时响
40、应消息的传输是不可靠的,即 UAS 发送临时响应后并不能保证 UAC 端能够接受到该消息。如果需要在该响应消息中携带媒体信息,那么就必须保证该消息能够可靠的传输到对端。100rel 扩展为 100 类响应消息的可靠传输提供了相应的机制。100rel 新增加对临时响应消息的确认请求方法:PRACK。如果 UAC 支持该扩展,则在发送的消息中增加 Supported:100rel 头域和字段。如果UAS 支持该扩展,则在发送 100 类响应时增加 Require:100rel 头域和字段。UAC 收到该响应消息后需要向 UAS 发送 PRACK 请求通知 UAS 已收到该临时响应。 UAS 向UA
41、C 发送对 PRACK 的 2XX 响应消息结束对该临时响应的确认过程。如果某一 UA 想要在发送的临时响应消息中携带 SDP 消息体,那么 UAC 和 UAS 都必须支持和使用 100rel 扩展以保证该消息的可靠传输。举例:Supported: 100rel User-AgentUser-Agent 头字段包含有发起请求的用户终端的信息。显示用户代理的软件版本信息可能会令用户在使用有安全漏洞的软件易受到外界攻击,因此,应该使 User-Agent 头字段成为可选配置项。举例:User-Agent: Softphone Beta1.5 ExpiresExpires 头字段指定了消息(或消息内
42、容)多长时间之后超时。举例:Expires: 5 Accept-LanguageAccept-Language 头字段用在请求消息中,表示原因短语、会话描述或应答消息中携带的状态应答内容的首选语言类型。如果消息中没有 Accept-Language 头字段,则服务器端认为客户端支持所有语言。举例:Accept-Language: en AuthorizationAuthorization 字段包含某个终端的鉴权证书。首先介绍一下终端向服务器端请求认证的一般过程:终端发起请求时如果服务器端需要对用户进行认证,那么会在本地产生本次认证的NONCE,并且通过认证请求头域将所有必要的参数返回给终端从而
43、发起对用户认证过程。终端收到认证请求消息后根据服务器端返回的信息和用户配置等信息采用特定的算法生成加密的 RESPONSE,并且通过新的请求消息发送给服务器端。服务器端在收到带有认证响应的新的请求消息后首先检查 NONCE 的正确性。如果NONCE 不是本地产生,则直接返回失败。否则如果 NONCE 是本地产生,但是认证过程已经超时,则服务器端会重新产生 NONCE 并重新发起对用户的认证过程。其中老的 NONCE 会通过 CNONCE 参数返回。NONCE 验证通过后服务器端会根据 NONCE、用户名、密码(服务器端可以根据本地用户信息获取用户的密码)、URI 等采用和终端相同的算法生成 R
44、ESPONSE,并且对此 RESPONSE 和请求消息中的 RESPONSE 进行比较,如果二者一致则用户认证成功,否则认证失败。Authorization 字段的一般格式为:Authorization:认证方式 USERNAME,REALM,NONCE,RESPONSE ,URI ,CNONCE,ALGORITHM认证方式:有 DIGEST、BASIC 、CHAP-PASSWORD 、CARDDIGEST 等认证方式。DIGEST 为 HTTP-DIGEST 认证方式。目前 SoftX3000 只支持 HTTP-DIGEST 方式。以后为了实现 Uniphone 的卡号呼叫还会加入卡号认证的
45、 CARDDIGEST 方式。USERNAME:被认证的用户的用户名。REALM:用于标识发起认证过程的域。NONCE:由发起认证过程的实体产生的加密因子。RESPONSE:终端在收到服务器的认证请求后根据服务器端产生的 NONCE、用户名、密码、URI 等信息经过一定的算法生成的一个字符串。该字符串中包含了经过加密后的用户密码。(在认证过程中处理用户密码之外其他信息都会通过 SIP 消息以明文的方式在终端和服务器端进行传递。)URI:发起的呼叫请求消息的 Request-URI。由于终端在收到认证请求后需要重新向服务器端发起请求(其中带有认证响应信息)。该请求消息在经过网络服务器时某些字段包
46、括 RequestURI 都有可能被修改。认证头域的 URI 参数用于传递终端发起请求时原始消息的 Request-URI 用于对认证信息进行认证,这样才能保证认证过程的正确性。CNONCE:如果在服务器端超时后终端才向服务器返回了带有认证响应的新的请求消息,则服务器端需要重新产生 NONCE 重新对用户进行认证。其中 NONCE 中带有新的 NONCE,老的 NONCE 会通过 CNONCE 参数返回给终端。ALGORITHM:用于传递生成 RESPONSE 的算法。举例:Authorization: DIGEST USERNAME=“6540012“, REALM=““, NONCE=“2
47、00361722310491179922“, RESPONSE=“b7c848831dc489f8dc663112b21ad3b6“, URI=“sip:191.169.150.30“(3) 请求消息示例下面是 SIP 请求消息编码的示例:INVITE sip:66500002191.169.1.110 SIP/2.0From: ;tag=1ccb6df3To: CSeq: 1 INVITECall-ID: 20973e49f7c52937fc6be224f9e52543sx3000Via: SIP/2.0/UDP 191.169.1.116:5061;branch=z9hG4bkbc427d
48、ad6Contact: Supported: 100rel,100relMax-Forwards:70Allow:INVITE,ACK,CANCEL,OPTIONS,BYE,REGISTER,PRACK,INFO,UPDATE,SUBSCRIBE,NOTIFY,MESSAGE,REFERContent-Length:230Content-Type: application/sdpv: 0o: HuaweiSoftX3000 1073741831 1073741831 IN IP4 191.169.1.116s: Sip Callc: IN IP4 191.169.1.95t: 0 0m: au
49、dio 30000 RTP/AVP 8 0 4 18a: rtpmap:8 PCMA/8000a: rtpmap 0 PCMU/8000a: rtpmap 4 G723/8000a: rtpmap 18 G729/8000第一行:请求起始行。INVITE 请求消息。请求 URI,即被邀用户的当前地址为“sip:66500002191.169.1.110”。SIP 版本号为 2.0。第二行:From 字段。指明请求发起方的地址为 “”。标记为“1ccb6df3 ”,用于共享同一 SIP 地址的不同用户用相同的 Call-ID 发起呼叫邀请时,对用户进行区分。第三行:To 字段。指明请求接收方的地址为 “”。从 From 和 To 字段,我们可以看出:IP 地址为 191.169.1.116 的 SoftX3000 控制下的终端 44