IP电话机、视频可视电话通信产品及组网方案

SIP呼叫类型之代理呼叫

时间:2019-11-01 11:23 作者:admin 分享到:
       代理服务器是用户代理客户端和远端的用户代理服务器之间的中间桥梁,代理服 务器接受来自客户端的请求并转发给用户代理服务器。代理服务器分为有状态和无状 态两类。有状态代理服务器记忆入请求和出请求,无状态代理服务器不记忆任何请求 信息。另外,根据是否具有并行分发请求的能力,可将代理服务器分为叉分和非叉分 两类。叉分服务器应有状态记忆功能。接受TCP连接的代理服务器必须是有状态服 务器。
       有状态代理服务器的行为相当于一个虚拟UAS/UAC。接收入请求时执行服务器 状态机,发送出请求时执行客户状态机。唯一不同之处是,当收到关于INVITE的200 应答时,总是往七叫方向(上行方向)前转,而不生成ACK。相应地,收到关于200应答的 ACK时,总是向下行方向前转。这时,相当于一个无状态服务器。
       无状态代理服务器不能视为虚拟UAC/UAS,它只是简单地将每个收到的请求向下 行方向前转,将每个收到的应答向上行方向前转。为了防止环路,服务器收到请求时必须 校核自己的地址是否已在该请求的Via字段中。To、From、Call-ID和Contact字段从入 请求复制到出请求,Request-URL可能改变,同时服务器将自身地址作为新的Via字段 加入出请求中。对于收到的应答,服务器需校核顶端Via字段是否和自身地址相匹配。 如不匹配,必须丢弃。
        假定Boss(在家中)通过一个代理服务器呼叫Collins(在工作单位),完成该呼叫的 消息序列如下图所示。

       (1) 客户向代理服务器发送INVITE请求消息;在请求行的Request-URL中是代理 服务器的地址,客户机将自己当前的地址插入Via头部字段,在To头部字段中填上被叫 的地址Sip: collins @ work, com,在From头部字段中填上主叫地址Sip: Boss @ home, net。该消息中的Subject头部字段和实体头部字段和消息体的内容被省略了。该消息的 格式为:
             C--------S: INVITE Sip: collins@server. work, com SIP/2. 0
                             Via: SIP/2.0/UDP stationl.home.net
                             From: Boss <CSip: Boss @ horae.net >
                            To: Collins <CSip:
                            Collins @ work.com >
                            Call-ID: 3298420299@stationl. home, net
                            CSeq: 1 INVITE
          (2) 代理服务器收到INVITE请求后,向客户机发送一个代码为100(正在尝试)的 临时应答消息,说明正在尝试完成该呼叫。该消息的格式为:
             S---------C: SIP/2. 0 100 Trying
                              Via: SIP/2.0/UDP stationl.home.net
                              From: Boss <CSip: Boss @ horae.net >
                             To: Collins <CSip: Collins @ work.com >
                            Call-ID: 3298420299@stationl. home, net
                            CSeq: 1 INVITE
         同时,代理服务器根据被叫的当前地址转发该请求消息。为实现这个目的,代理服务器需要更改消息中的Request-URL。在应用代理服务器的情况下最重要的是Via头部字段,这个字段指出了一个请求所经过的路径。当请求生成时,起始客户端把自己的地址 插入Via头部字段中,所经过的每个代理服务器也会把自己的地址插入个新的Via头 部字段(置于任何当前存在的Via头部前面)。因此,Via头部字段的集合给II丨了请求消 息穿过网络的路径图。
       当某个代理服务器收到个请求时,它首先会检査自己的地址在Via头部字段中是 否已经存在。如果存在,说明这个请求已经到达过这里,此时出现循环的情况.当出现循 环时,代理服务器将响应这个请求以一个状态代码为482(检测到循环)的应答;否则,它 把自己的地址插入Via头部字段中,然后将这个请求向前发送。
        在该例中,代理服务器将INVITE消息转发给被叫。INVITE消息的格式为:
            S------------S: INVITE sip: collins@ work.com SIP/2. 0
                               Via: SIP/2.0/UDP server.work.com Via: SIP/2.0/UDP stationl.home.net Record-route:<CSip: Collins@ server, work, com >
                                From: Boss <CSip: Boss @ horae.net >
                                To: Collins <CSip: Collins @ work.com >
                                Call-ID: 3298420299@stationl. home, net
                                CSeq: 1 INVITE
         (3) 用户代理服务器回送应答消息。用户代理服务器收到INVITE消息后提示用 户,在用户应答后向代理服务器返回一个成功的指示,在该消息的Contact字段中说明被 叫的当前地址。该消息的格式为:
           S—----S: SIP/2. 0 200 OK
                   Via: SIP/2.0/UDP server.work.com
                   Via: SIP/2.0/UDP stationl.home.net
                  Record-route:<CSip: Collins@ server, work, com >
                  From: Boss <Sip: Boss @ home.net〉
                   To: Collins <CSip: Collins @ work.com >
                Contact: Sip:Collins @ work.com
                Call-ID: 3298420299@stationl. home, net CSeq: 1 INVITE
        应答消息也会包括Via头部字段,它将使用请求消息所使用的路径(当然是相反的) 通过网络往回发送。当服务器应答一个请求时,应答消息中包含与所接收到的请求消息 的Via头部字段相同的Via头部列表。当代理服务器收到一个应答时,第一个Via头部 字段应该指向它自己,如果不是,则说明出现错误,这个消息会被丢弃。如果第个Via 头部字段正好指向它自己,那么代理服务器将把这个头部移走并检査是否存在第二个 Via头部字段。如果不存在,则说明这个消息的目的地就是代理服务器自己;如果存在, 代理服务器则把此应答传递到这个字段所表示的地址上。通过这种方法,应答消息会沿 着原始请求所经过的路径返回到请求的起始者。
       (4)代理服务器向客户机返回应答消息。代理服务器收到被叫端代理服务器发 来的应答消息后,检査第一个Via头部的地址,如果第一个Via头部字段正好指向它自己,那么代理服务器将把这个头部移走并检査是否存在第一个Via头部字段,根据 第:个Via头部字段标识的地址向前转发。在该例中,第二个Via头部字段标识的 地址是客户机的地址,代理服务器就将应答消息转发给客户机。该消息的格式为:
             S—------C: SIP/2. 0 200 OK
                             Via: SIP/2.0/UDP stationl.home.net Record-route:<CSip: Collins@ server, work, com >
                             From: Boss <Sip: Boss @ home.net〉
                            To: Collins <CSip:
                           Collins @ work.com >
                           Contact: Sip:Collins@ work.com
                          Call-ID: 3298420299@stationl. home, net
                          CSeq: 1 INVITE
        (5)客户机发送ACK消息。客户机收到最终的应答消息后.向代理服务器发送ACK消息。该消息的格式为:
             C------------S: ACK Sip: collins@ server.work.com SIP/2.0
                                Via: SIP/2.0/UDP stationl.home.net
                                Route:<CSip: Col1ins@.work, com >
                                From: Boss <CSip: Boss @ home.net >
                                To: Collins <CSip: Collins @ work.com >
                               Call-ID: 3298420299@stationl. home, net
                               CSeq: 1 INVITE
        在该消息中还冇个重要的头部——Route头部。发送INVITE请求的客户端接收 到200应答时,包括在Record-Route头部里的信息被用在随后的请求信息里(如ACK或 BYE)。客户端取出在Record-Route头部里的信息,并把它逆序后置入Route头部屮,这 样Route头部就包含一个从呼叫方客户端到被叫服务器的一个代理服务器列表。在列表 末端,客户端把任一个接收自被叫服务器的Contact头部内容添加上。最后.它把列表的 第个代理服务器条目去除,并把下…个消息(比如ACK消息)发送到这个代理服务器 上。从呼叫方到被叫方的路径上的每一个代理服务器,在转发这个消息之前会将Route 头部中第一项移除,不管它是代理服务器还是最终的被叫方服务器。
这些动作的净作用就是Route头部的第-个条目总是沿着从呼叫方到被叫方路径的 下一跳地址,因此,每一个代理服务器都会自动知道请求该往哪里发送。
        在该例中,客户机取出接收到的应答消息Record-Route字段中的地址C〇llinS@ server, work, com作为ACK消息的请求行中的Request-URL,将接收到的应答消息中的 Contact头部内容加到Route头部中。
        (6)代理服务器转发ACK消息。代理服务器收到客户机发来的ACK消息后,根据 Route头部中的地址向被叫端的代理服务器转发ACK消息。该消息的格式为:
          C—-------S: ACK sip: collins@.work.com SIP/2.0
                           Via: SIP/2.0/UDP server.work.com
                           Via: SIP/2.0/UDP stationl.home.net
                           From: Boss <Sip: Boss @ honie.net >
                          To: Collins <Sip: Collins @ work.com〉
                          Call-ID: 3298420299@stationl. home, net
                          CSeq: 1 INVITE

版权所有:IP电话:http://www.g3voip.com 转载请注明出处

热销IP电话产品hot products