一、SIP业务基本知识
1、业务介绍
会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始、管理和终止网络中的语音和视频会话,具体地说就是用来生成、修改和终结一个或多个参与者之间的会话。SIP的业务模式是一个点对点协议,其中有两个要素——SIP用户代理和SIP网络服务器。
用户代理(UA)是呼叫的终端系统元素,而SIP服务器是处理与多个呼叫相关联信令的网络设备。用户代理本身具有一客户机元素(用户代理客户机UAC)和一服务器元素(用户代理服务器UAS)。客户机元素初始呼叫而服务器元素应答呼叫。这允许点到点的呼叫通过客户机-服务器协议来完成。下图是SIP业务的网络结构和各个参与者的关系。
SIP业务的核心特点集中在SIP的设计目标之一是提供类似公用交换电话网(PSTN)中呼叫处理功能的扩展集。在这个扩展集中,实现类似日常电话的操作:拨号,振铃,回铃音或者忙音,只是实现方式和术语有所不同。SIP也实现了许多信令系统7(SS7)中更高级的呼叫处理功能,尽管这两个协议相差很远。SS7是一个高度集中处理的协议,其特点表现为高复杂度的中心网络结构和无智能的哑终端(传统的电话机)。SIP则是一个点对点协议,所以它只需要一个相对简单的(因此也高度可扩展的)核心网络,而将处理工作下放给连接在网络边缘的智能端点(装有硬件或软件的终端设备)。SIP的许多功能在端点中实现,这与传统的SS7将其在网络核心设备实现的作法大异其趣。而协议的其他特点还有它是一个文本协议,所以易于调测,结构灵活;而且它是一个中性的底层传输协议,可用TCP或UDP(推荐UDP);同时呼叫和媒体信息同时传送:媒体信息的传送由SDP传送。
SIP是互联网工程任务组(IETF)多媒体数据和控制体系结构的一个组成部分,因此它与IETF的许多其他协议都有联系,例如RTP(实时传输协议)和SDP协议。SIP与许多其它的协议协同工作,仅仅涉及通信会话的信令部分(control message)。
SIP报文内容传送会话描述协议(SDP),SDP协议描述了会话所使用流媒体细节,如:使用哪个IP端口,采用哪种编解码器等等。SIP的一个典型用途是:SIP“会话”传输一些简单的经过封包的实时传输协议流。RTP本身才是语音或视频的载体。
2、业务过程和协议流程
a、注册流程:
(1)用户首次试呼时,终端代理A 向代理服务器发送REGISTER 注册请求;
(2)代理服务器通过后端认证/计费中心获知用户信息不在数据库中,便向终端代理回送401Unauthorized 质询信息,其中包含安全认证所需的令牌;
(3)终端代理提示用户输入其标识和密码后,根据安全认证令牌将其加密后,再次用REGISTER 消息报告给代理服务器;
(4)代理服务器将REGISTER 消息中的用户信息解密,通过认证/计费中心验证其合法后,将该用户信息登记到数据库中,并向终端代理A 返回成功响应消息200 OK。
b、注销流程
(1)终端向代理服务器发送register消息注销,其头中expire字段设置为0。
(2)代理服务器在收到后送回200OK响应,并将数据库中的用户有关消息注销。
c、 基本呼叫建立过程:
(1)用户摘机发起一路呼叫,终端代理A向该区域的代理服务器发起Invite请求;
(2)代理服务器通过认证/计费中心确认用户认证已通过后,检查请求消息中的Via头域中是否已包含其地址。若已包含,说明发生环回,返回指示错误的应答;若没有问题,代理服务器在请求消息的Via头域插入自身地址,并向Invite消息的To域所指示的被叫终端代理B传送Invite请求。
(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。
(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。
(5)终端代理B指示被叫用户振铃,用户振铃后向代理服务器发送180Ringing振铃信息。
(6)代理服务器向终端代理A转发被叫用户振铃信息。
(7)被叫用户摘机,终端代理B向代理服务器返回表示连接成功的应答(200OK)
(8)代理服务器向终端代理A转发该成功指示(200OK)
(9)终端代理A收到信息后,向代理服务器发ACK信息进行确认
(10)代理服务器将ACK确认消息转发给终端代理B。
(11)主被叫用户之间建立通信连接,开始通话。
d、正常呼叫释放过程:
(1) 正常呼叫
(2) 用户通话结束后,被叫用户挂机,终端代理B向代理服务器发送Bye消息。
(3) 代理服务器转发Bye消息至终端代理A,同时向认证、计费中心发送用户通话的详细信息,请求计费。
(4) 主叫用户挂机后,终端代理A向代理服务器发送确认挂断响应信息200OK。
(5) 代理服务器转发响应信息200OK。
e、 会话更改流程:
(1)用户代理服务端和代理客户端正常通话。
(2)用户代理服务端向用户代理客户端发送Invite信息,带有新的SDP协商信息。
(3)用户处理客户端回复200OK,并将协商后的SDP信息带回。
(4)用户代理服务端发送ACK给用户代理客户端进行确认。
f、 被叫忙呼叫释放:
(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;
(2)代理服务器向被叫终端代理B传送Invite请求。
(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。
(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。
(5)呼叫请求送到被叫终端代理B后,被叫忙,终端代理B向代理服务器送486被叫忙响应。
(6)代理服务器向终端代理A转发该响应消息。
(7)终端代理A向代理服务器回送ACK确认消息。
(8)代理服务器向终端代理B送ACK确认信息。
g、被叫无应答流程一:
(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;
(2)代理服务器向被叫终端代理B传送Invite请求。
(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。
(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。
(5)被叫用户振铃,终端代理B向代理服务器送180Ring响应。
(6)代理服务器向终端代理A转发该响应信息。
(7)被叫久振铃无应答,终端代理A判断超时后向代理服务器送Cancel消息放弃该呼叫。
(8)代理服务器收到Cancel消息后,向终端代理A回送200OK响应。
(9)代理服务器将Cancel消息转发给终端代理B。
(10)终端代理B向代理服务器回送200OK响应。
(11)终端代理B向代理服务器送487请求已撤销的响应信息。
(12)代理服务器收到后回送ACK确认。
(13)代理服务器向终端代理A送487请求已撤销消息。
(14)终端代理A向代理服务器回送ACK确认。
注:以上步骤中的(10)到(12)无严格顺序关系。
h、被叫无应答流程二:
(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;
(2)代理服务器向被叫终端代理B传送Invite请求。
(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。
(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。
(5)被叫用户振铃,终端代理B向代理服务器送180Ring响应。
(6)代理服务器向终端代理A转发该响应信息。
(7)被叫久振铃无应答,终端代理B判断超时后向代理服务器送408Requesttimeout消息放弃该呼叫。
(8)代理服务器收到408Requesttimeout消息后,转发该消息给终端代理A。
(9)代理服务器回送ACK确认给终端代理B。
(10)终端代理A向代理服务器回送ACK确认。
注:以上步骤中的(9)到(10)无严格顺序关系。
i、遇忙呼叫前转:
(1)用户摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;
(2)代理服务器向被叫终端代理B传送Invite请求。
(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。
(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。
(5)终端代理B忙线中,B向代理服务器发送486Busy Here响应。
(6)代理服务器向终端代理B发送ACK确认消息。
(7)代理服务器对此呼叫进行前转,向代理服务器C发送Invite请求消息。
(8)代理终端C收到后指示用户振铃,同时向代理服务器发送180Ringing响应。
(9)代理服务器向A转发收到的180Ringing响应。
(10)被叫用户C摘机接听电话,终端代理C向代理服务器返回表示连接成功的应答(200OK)
(11)代理服务器向终端代理A转发该成功指示(200OK)
(12)终端代理A收到信息后,向代理服务器发ACK信息进行确认
(13)代理服务器将ACK确认消息转发给终端代理B。
建立通信连接,开始通话。
(14)主叫用户挂机,终端代理A向代理服务器发送Bye消息,请求挂机。
(15)代理服务器转发Bye消息至终端代理C,指示C挂机。
(16)终端代理C向代理服务器发送确认挂断响应信息200OK。
(17)代理服务器转发响应信息200OK至A。
j、无应答呼叫前转流程:
(1)用户A摘机发起一路呼叫,终端代理A向该区域代理服务器发起Invite请求;
(2)代理服务器向被叫终端代理B传送Invite请求。
(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。
(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。
(5)被叫用户振铃,终端代理B向代理服务器送180Ring响应。
(6)代理服务器向终端代理A转发该响应信息。
(7)被叫久振铃无应答,代理服务器判断超时后向代理终端B送Cancel消息放弃该呼叫。
(8)代理终端B收到Cancel消息后,向代理服务器回送200OK响应。
(9)终端代理B向代理服务器送487请求已撤销的响应信息。
(10)代理服务器向终端代理B回送200OK响应。
(11)代理服务器对此呼叫进行前转,向代理服务器C发送Invite请求消息。
(12)代理终端C收到后指示用户振铃,同时向代理服务器发送180Ringing响应。
(13)代理服务器向A转发收到的180Ringing响应。
(14)被叫用户C摘机接听电话,终端代理C向代理服务器返回表示连接成功的应答(200OK)
(15)代理服务器向终端代理A转发该成功指示(200OK)
(16)终端代理A收到信息后,向代理服务器发ACK信息进行确认
(17)代理服务器将ACK确认消息转发给终端代理C。
建立通信连接,开始通话。
(18)主叫用户挂机,终端代理A向代理服务器发送Bye消息,请求挂机。
(19)代理服务器转发Bye消息至终端代理C,指示C挂机。
(20)终端代理C向代理服务器发送确认挂断响应信息200OK。
(21)代理服务器转发响应信息200OK至A。
k、 呼叫保持:
(1)用户摘机发起一路呼叫,终端代理A向该区域的代理服务器发起Invite请求;
(2)代理服务器通过认证/计费中心确认用户认证已通过后,检查请求消息中的Via头域中是否已包含其地址。若已包含,说明发生环回,返回指示错误的应答;若没有问题,代理服务器在请求消息的Via头域插入自身地址,并向Invite消息的To域所指示的被叫终端代理B传送Invite请求。
(3)代理服务器向终端代理A发送呼叫处理中的应答信息:100Trying。
(4)终端代理B向代理服务器送呼叫处理中的应答信息:100Trying。
(5)终端代理B指示被叫用户振铃,用户振铃后向代理服务器发送180Ringing振铃信息。
(6)代理服务器向终端代理A转发被叫用户振铃信息。
(7)被叫用户摘机,终端代理B向代理服务器返回表示连接成功的应答(200OK)
(8)代理服务器向终端代理A转发该成功指示(200OK)
(9)终端代理A收到信息后,向代理服务器发ACK信息进行确认
(10)代理服务器将ACK确认消息转发给终端代理B。
(11)主被叫用户之间建立通信连接,开始通话。
(12)代理终端B向代理服务器发送Reinvite消息,SDP的c域等于0,0,0,0。
(13)代理服务器转发此信息给代理终端A。
(14)代理终端A收到Reinvite后回应200OK响应。表示接受会话更改,同事根据协商结果修改会话方式。
(15)代理服务器转发200OK给代理终端B。
(16)代理终端B收到消息后向代理服务器发送ACK消息进行确认。
(17)代理服务器将ACK确认消息转发到代理终端A。
l、呼叫等待:
(1)AB正常通话。
(2)在AB通话的阶段,用户C向A发起呼叫,终端代理C发送Invite消息给代理服务器。
(3)代理服务器向终端C回送100Trying响应,表示呼叫已在处理中。
(4)代理服务器把Invite消息转发给A。
(5)用户A振铃,并且终端A向代理服务器发送180Ring响应。
(6)代理服务器向终端C转发该响应信息。
(7)用户A按下呼叫保持键,代理终端A向代理服务器发送Invite消息,请求与代理终端C呼叫保持。
(8)代理服务器转发此消息给终端代理B。
(9)代理服务器向终端A回送100Trying响应,表示呼叫已在处理中。
(10)终端B收到呼叫保持请求后,发送200OK给代理服务器,表示接受呼叫保持。
(11)代理服务器转发200OK响应给终端代理A。
(12)代理终端A收到消息后向代理服务器发送ACK消息进行确认。
(13)代理服务器将ACK确认消息转发到代理终端B。
(14)终端代理A发送200OK给代理服务器,表示接受C的呼叫。
(15)代理服务器转发200OK给终端代理C。
(16)终端代理C向代理服务器回送ACK确认。
(17)代理服务器向代理终端A转发收到的ACK确认。
A、C之间开始通话。
(18)用户A挂机,终端代理A向代理服务器发送Bye请求消息。
(19)代理服务器转发Bye消息给终端代理B。
(20)终端代理C发送200OK给代理服务器,表示接受请求。
(21)代理服务器转发200OK响应给终端代理A。
(22)终端代理C重新发送Invite请求给代理服务器,请求和终端代理B恢复通话。
(23)代理服务器向代理终端B转发收到的Invite请求。
二、SIP通信过程报文抓取实例分析
l SIP代理服务器IP:59.64.135.22 SIP电话号码:825002(59.64.135.22)
l SIP代理终端IP:59.64.135.67
l 软终端:X-lite
l 抓包分析工具:WireShark
注:由于过程太多,以下仅仅抓取“成功注册”,“呼叫--通话” ,“挂断”“注销”四种情况做典型包的分析。
Ø 注册流程:
以上是REGISTER包。
我们可以看到在注册的时候,终端会向代理服务器59.64.135.22发送REGISTER请求注册。
以上是REGISTEROK包。服务器返回200 OK,表示注册成功。
Ø 基本呼叫建立过程:
以上是INVITE包。我们可以看到在发起呼叫初期,终端向825002发出Invite的呼叫请求。
以上是Trying包,说明终端825003正在试着连通服务器,进一步转接到825002.
由于设置了自动接听,所以此次通话没有振铃的包。
这是ACK包,代表确认信号。
Ø 正常呼叫释放过程:
以上是BYE包。这是825002挂断后服务器向825003发送的释放呼叫信号。
Ø 注销流程:
以上是825003注销的包,我们注意到expires=0这说明是注销。
3.总结
SIP协议凭借其简单、易于扩展、便于实现等诸多优点越来越得到业界的青睐,它正逐步成为NGN(下一代网络)和3G多媒体子系统域中的重要协议,并且市场上出现越来越多的支持SIP的客户端软件和智能多媒体终端,以及用SIP协议实现的服务器和软交换设备。
一、SIP消息
SIP消息是SIP客户终端和服务器之间通信的的基本信息单元。SIP消息基于文本,采用UTF-8编码(RFC 2279)中的ISO 10646字符集。SIP协议借鉴了HTTP协议(RFC 2068)的设计思想,有很多消息格式与之相同。SIP协议支持UDP传输协议
SIP消息消息分两类:请求消息 和 响应消息
请求消息(Request):客户端为了激活特定操作而发给服务器的SIP消息,包括INVITE,ACK,OPTIONS,BYE,CANCEL和REGISTER消息。UAC到UAS。
响应消息(Response):服务器向客户端反馈对应请求的处理结果的SIP消息,包括1xx,2xx,3xx,4xx,5xx,6xx响应消息,UAS到UAC
二、SIP消息格式与结构:
SIP消息由三个部分组成:标识消息类型和目的地址的起始行,携带消息参数的头部以及承载任意附加信息的消息体。消息体中传送的最重要的信息就是由SDP(Session Description Protocol)协议描述的媒体控制信息,供终端协商并建立媒体信道。
SIP消息格式:由一个起始行(Start-line)、一个或多个字段(header fields)组成的消息头、一个标志消息头结束的空行(CRLF)以及作为可选项的消息体(Message body)组成,其中描述的头称为实体头(Entityheader)。
generic-message = start-line
*message-header
CRLF
[ message-body ]
1.起始行
起始行分请求行(Request-Line)和状态行(Status-Line)两种。
1.1.请求行(Request-Line)
请求消息的起始行,由请求消息类型,请求目的发送地址Request-URI,SIP协议的版本号,之间用空格隔开。
请求行的6种Request Method:
INVITE:用于发起呼叫请求。INVITE消息包括消息头和数据区两部分。INVITE 消息头包含主、被呼叫的地址,呼叫主题和呼叫优先级等信息。数据区则是关于会话媒体的信息,可由会话描述协议SDP 来实现。
BYE:当一个用户决定中止会话时,可以使用BYE 来结束会话。
OPTIONS:用于询问被叫端的能力信息,但OPTIONS 本身并不能发起呼叫。
ACK:对已收到的消息进行确认应答。
REGISTER:用于用户向SIP服务器传送位置信息或地址信息。
CANCEL:取消当前的请求,但它并不能中止已经建立的连接。
1.2.状态行(Status-Line)
响应消息的起始行,SIP应答消息的Status-Line由SIP-Version开始,接着是一个数字编码的状态码Status-Code,最后是一个与状态码相关的描述性短语Reason-Phrase,然后由一个CRLF行结束符结束Status-Line。
SIP应答消息的六类应答状态编码
1xx:临时消息:表示表示请求消息已经收到,后面将继续处理该请求。
2xx:成功消息:表示请求已经被成功的理解、接受或执行。
3xx:重定向消息:表示为了完成请求还需采取更进一步的动作。
4xx:客户机错误:表示该请求含有语法错误或在这个服务器上不能被满足。
5xx:服务器错误:表示该服务器不能处理一个明显有效的请求。
6xx:全局性故障:表示该请求在任何服务器上都不能被实现。
2.消息头:
消息头的作用是进一步提供有关消息的其他信息,使代理服务器或客户代理服务器更好地对消息进行处理。消息头分四类:通用头(general-header )、请求头(request-header )、响应头( response-header )和实体头( entityheader)
四大类
general-header
描述消息基本属性的通用头域,可用于请求消息和应答消息;
消息头有:Call-ID,From,To,Via,Contact,CSeq,Encryption,Expires,Record-Route,Timestamp,Date,Accept,Accept-Encoding,Accept-Language
request-header
请求头域,只可用于请求消息,它被用来传递有关应答的附加信息,对请求进行补充说明;
Subject,User-Agent,Organization,Contact,Authorization,Proxy-Authorization,Proxy-Require,Response-Key,Require,Priority,Hide,Route,Max-Forwards。
response-header
应答头域,只可用于应答消息,它被用来传递有关应答的附加信息,对应答进行补充说明。
Proxy-Authenticate,WWW-Authenticate,Retry-After,Server,Warning,Allow,Unsupported。
entity-header
消息体头域,用于描述消息体内容的长度、格式和编码类型等属性,可用于请求消息或应答消息。
Content-Encoding,Content-Length,Content-Type
消息头格式
每个消息头都是一个“句子”,以CRLF行结束符表示一个头域的结束。它们都由字段名(field-name)和域值(field-value)两部分组成,中间以“:”相隔。
常见消息头说明:
TO:格式:TO:显示名<接收者URI>;tag=n;显示名和tag可选。接收者URI是SIP网络种唯一标识接收终端的标识符。例:TO:DENNY
FROM: 消息头FROM给出标识会话发起者的URI。比如:FROM:sip:caller@work.com;tag=hyh8。tag是必需的。
CALL-ID: 用于全局唯一标识正在建立的会话的标识符。 随机数加UAC标识信息。
CSeq: 用于标识同一会话中不同事务的序号,通常由一个用作序号的整型数和消息类型组成。整个会话操作过程由不同的事务组成,每一事务所涉及的消息的CSeq序号必须相同。
Via:为响应消息提供传输路径,当请求消息经过每一跳节点时,每一跳节点都把自身的IP地址信息放入顶层Via中。响应消息则沿着请求消息记录下的传输路径反向传输,首先移走指明自身IP地址信息的顶层消息头
三、报文格式 SIP 请求消息的过程
1、 请求应答的一个过程
1004@192.168.0.107---->1001@192.168.0.112
1 INVITE ---->SIP SERVER(192.168.0.129)
2 407 Proxy Authentication Required-->1004
3 1004 ack--->SIP SERVER
4 1004 INVITE-->SIP SERVER
5 SIP-SERVER 100 Giving --->1004
6 SIP SERVER INVITE-->1001
7 1001 100 Trying--->SIP SERVER
8 1001 180 Ringing---->SIP SERVER
9 SIP SERVER 180 Ringing ---->1004
10 1001 200 OK--->SIP SERVER
11 SIP SERVER 200OK---->1004
12 1004 ACK--->SIP SERVER
13 SIP SERVER ACK ----> 1001
下面深入了解SIP报文:
SIP是基于一个类似HTTP协议的请求应答的通讯模式。每一个通讯都包含对某个功能的请求,并且起码需要一个应答。在这个应答中,Alice的软电话发送一个含有Bbo的SIP URI抵制的INVITE通讯请求。INVITE是一个SIP请求的例子,表示请求方(Alice)希望服务方(Bob)应答。INVTE请求包含一系列的包头域(Header fields)。包头中包含很多属性并且包含了传输消息的附加信息。在INVITE中有如下的字段:呼叫的唯一标志,目的抵制,Alice的地址,Alice和Bob建立会话的类型。INVITE请求(图1中的F1)可能看起来像这样的:
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob
From: Alice
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact:
Content-Type: application/sdp
Content-Length: 142
(Alice’s SDP not shown)
在文本消息的第一行,包含了请求的类型(INVITE)。在这行之后的是这个请求的头域。这个例子中包含了最少需要的头域集合。简单介绍一下:
VIA域
包含了Alice接收发送请求的服务器地址(pc33.atlanta.com)。同样这个包含了一个分支参数来标志Alice和这个服务器的会话事务。
TO域
包含了显示姓名(Bob)和一个SIP或者SIPS URI(sip:bob@biloxi.com)请求将首先传输到这个URI中。显示姓名(Display names)在RFC 2822中描述。
From域
也同样包含一个显示姓名(Alice)和一个SIP或者SIPS URI(sip:alice@atlanta.com)这个URI用来标志请求的原始发起者。这个域也包含了一个TAG参数,这个TAG参数是一个随机字串(1928301774),是软电话(softphone)在URI上增加的一个随机串。用来做标志用途的
Call_ID
包含一个全局的唯一标志,用来唯一标志这个呼叫,通过随机字串和softphone的自己名字或者IP抵制混和产生的。通过TO TAG, FROM TAG和CALL-ID完整定义了Alice和Bob之间的端到端的SIP关系,并且表示这个是一个对话性质的关系。
CSEQ或者Command Sequence
包含了一个整数和一个请求名字。这个Cseq数字是顺序递增的。每当对话中发起一个新的请求都会引起这个数字的顺序递增。
Contact域
包含一个SIP或者SIPS URI用来表示访问Alice的直接方式,通常由用户名和一个主机的全名(Fully Qualified Domain Name FQDN)组成。当FQDN作为首选的时候,许多终端用户由于不会由名字登记(而导致不能访问Alice的主机),所以IP地址是可选的。
VIA域告诉大家本请求发送到哪里并且应答到哪里,Contract域告诉大家将来的请求将发送到哪里(奇怪…不是Alice发起的么,将来的请求应该是Bob才对啊)。
Max-Forwards:
最大转发数量限制了通讯中转发的数量。它是由一个整数组成,每转发一次,整数减一。
Content-type
包含了消息正文的描述(消息正文在本范例中没有列出)
Content-length
包含消息正文的长度(字节数)
完整的SIP包头域的定义在20节。会话的细节,比如媒体的类型,codec,或者采样速率,没有通过SIP来描述。这个可以通过SIP的消息正文来描述,可以通过其他定义的协议在正文中进行描述。有一种是会话描述协议(Session Descripotion Protocol SDP)(RFC2327[1])。这个SDP消息(没有在例子中列出)通过SIP的消息中传送,就像通过附件发送EMAIL一样,或者说通过HTTP传输的网页一样。
由于softphone并不知道bob或者bob的sip服务器biloxi.com在哪里,所以softphone发送INVITE请求到Alice的sip服务器,atlanta.com。这个atlanta.com SIP服务器应该已经在Alice的softphone中配置了,或者可以通过DHCP获得。atlanta.com SIP服务器是一台代理服务器。代理服务器接收SIP请求并且根据请求转发。在这个例子中,代理服务器接收到INVITE请求,并且回送一个100(Trying)应答给Alice的softphone。100(Trying)应答表示INVITE请求已经收到,并且代理服务器正在转发INVITE请求。SIP的应答是通过一个三位数的数字表示的。SIP应答同样包含TO、FROM、Call-ID,CSEQ和在VIA中的分支参数,这个参数使得Alice的softphone可以把请求和应答关联起来。atlanta.com代理服务器收到INVITE请求之后,就去找biloxi.com可能通过DNS服务来找提供这个biloxi.com的SIP服务器。这在[4]中有描述。最后,转发INVITE请求到biloxi.com或者能到达biloxi.com的代理服务器。在转发请求之前,atlanta.com代理服务器会在via头上增加一个一段包含自己抵制的值(INVITE已经包含了Alice的的地址VIA域)。biloxi.com代理服务器收到这个INVITE请求并且返回一个100(Trying)应答给atlanta.com代理服务器标志这它已经收到这个请求并且正在处理这个请求。这个代理服务器通过查询数据库,通常叫做地址服务,这个服务中包含了bob的当前ip地址。(我们在下一节可以看到这个数据库是怎么回事)biloxi.com代理服务增加另一段包含自己地址的VIA头域并且发送它到bob的sip 电话。
Bob的SIP电话接收到INVITE请求并且提醒bob有一个从Alice的呼入,这样bob可以决定是否响应这个呼入。这个意思就是:bob的电话响了。bob的sip电话发送一个180(Ringing)回应,这个回应将通过两个代理服务器原路返回给Alice。每一个代理服务器通过via头域决定该把这个应答发送给哪里,并且在发送之前把自己的地址从头上拿走。虽然DNS和定位服务在路由最初的INVITE请求,180(ringing)响应可以简单返回给发起者而不需要查找发起者在哪里,并且不需要在代理服务器保留状态,同时,每一个转发INVITE的代理也可以得到INVITE的每一个应答,这样的特性也非常有用。
当Alice的softphone收到180(Ringing)应答的时候,它提示Alice,可能是通过一个回铃音,或者屏幕上的一个消息提示。
在这个例子中,Bob决定响应这个呼叫。当他拿起电话,他的SIP电话发送200(OK)回应给发送者,表示这个电话已经接起来了。这个200(OK)包含了一个消息体,这个消息体包含SDP媒体描述,这个媒体描述包含Bob希望和Alice建立何种媒体连接。同样,SDP消息也是两段交换:Alice发送一个给Bob,Bob发送一个回给Alice。这个两段的交换提供基本的兼容性协商,并且基于简单的SDP提出/应答交换模型。如果Bob不想响应这个呼叫或者正在响应别的呼叫,一个错误的响应会代替正常的200(OK)回送出去,这样,就不会有连接建立。SIP完整的返回代码在21节有介绍。Bob发出的200(OK)(图一的F9消息)可能长得像这样的:
SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com
;branch=z9hG4bKnashds8;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com
;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com
;branch=z9hG4bK776asdhds ;received=192.0.2.1
To: Bob
From: Alice
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact:
Content-Type: application/sdp
Content-Length: 131
(Bob’s SDP not shown)
应答的第一行包含了应答代码(200)和原因(ok)。剩下的行包含了包头域。VIA,TO,FROM,CALL-ID,Cseq包头域是从INVITE请求包中直接拷贝过来的。(有三个VIA域值-一个是Alice SIP电话增加的,一个是atlanta.com代理加的,一个是biloxi.com代理加的)。Bob的SIP电话增加了一个TAG参数。这个TAG参数会被参与对话的各方所使用,并且在以后的对话中被使用。Contract域包含了一个能直接联系到Bob的URI。Content-type和Content_Length域包含了消息体(没有在例子中体现),这个消息体里边是Bob的SDP媒体信息。
除了DNS和位置服务之外,代理服务器可以自主决定路由,也就是说自己决定应该向哪里转发请求。比如,如果Bob的SIP电话返回一个486(电话正忙)信号,biloxi.com这个代理服务器可以转发这个INVITE请求到Bob的语音邮箱服务器。一个代理服务器可以同时向N个地方发送INVITE请求。这种并发寻找就是传说中的分流(forking)。
在这个例子中,200(OK)应答通过两个代理并且发送到Alice的softphone上,Alice的softphone收到这个应答,停止振铃,并且标志电话Bob已经接听。最后,Alice的电话发送一个确认消息,ACK,到Bob的SIP电话来确认接收到了这个最后的200(o’k)应答。在这个例子中,ACK信号是直接由Alice的softphone发送到Bob的SIP phone上,跨过了两个代理服务器。这是因为两个端点(Alice和Bob)通过INVITE/200(OK)的请求应答包中的Contact包头域都知道互相之间的地址了,这个地址是最开始发起INVITE请求的时候所不知道的。所以,不需要两个代理服务器再查找对方的地址了,所以代理服务器不参与接下来的通话流了。这就完成了一个完整的使用INVITE/200/ACK 三方握手来建立SIP会话的过程。
现在,Alice和Bob的媒体会话开始了,他们通过发送刚才建立会话所交换的SDP包中约定的互相明白的媒体包来进行会话。一般情况下,端到端的媒体包和SIP信号控制包通过不同的通讯路径来发送。
在会话中,Alice或者Bob都可以改变他们自己的媒体会话属性。这个可以通过发送一个包含新媒体属性描述的re-INVITE请求来完成。这个re-INVITE是捆绑在一个现有的会话的,这样参与会话的对方可以明白这是要改变现有的会话属性而不是新建立一个会话。对方收到这个re-INVITE请求后,会发送一个200(OK)应答表示接受这个改变。请求方通过一个ACK来表示接受了对方的这个200(OK)应答。如果对方不同意这个媒体属性变化,他会发送一个错误的应答比如488(暂时不能进行),这个也会收到发起者的一个ACK响应。不管怎样,就是是re-INVITE的失败也不会影响到现有的会话-原有的会话还可以用上次的媒体会话属性继续。
在通话结束的时候,Bob首先断开(挂机hangs up),并且发送一个BYE的消息。这个BYE的消息将直接送到Alice的softphone,同样是跳过代理的。Alice通过发送200(OK)应答来确认收到了这个BYE消息,这个消息终止了会话并且应答了BYE的请求。ACK在这里不需要发送-一个ACK信号只在响应一个INVITE的响应的时候被发送。我们稍晚一点会讨论这个INVITE的特别处理,但是基于SIP的可靠性的机制,一个通话的时间可以认为包含电话振铃和挂机的时间(but relate to the reliability mechanisms in SIP, the length of time it can take for a ringing phone to be answered, and forking.)基于这样的原因,SIP请求的处理通常根据是否INVITE请求进行分类,INVITE类和非INVITE类请求分开处理。