<?xml version="1.0"?><!DOCTYPE rfc SYSTEM "rfc2629.dtd"><?rfc compact="yes"?><?rfc toc="yes"?><rfc ipr="full3978" docName="draft-ietf-sipping-cc-transfer-10" category="bcp"><front><title abbrev="SIP CC Transfer">Session Initiation Protocol Call Control - Transfer</title><author initials="R." surname="Sparks" fullname="Robert J. Sparks"> <organization>Estacado Systems</organization> <address>  <email>RjS@estacado.net</email>  </address></author><author initials="A." surname="Johnston" fullname="Alan Johnston" role="editor"><organization>Avaya</organization> <address>  <postal>   <city>St. Louis</city><region>MO</region>   </postal>  <email>alan@sipstation.com</email>  </address></author>    <author initials="D." surname="Petrie" fullname="Daniel Petrie">            <organization>SIPez LLC</organization>            <address>                <postal>                    <street>34 Robbins Rd.</street>                    <city>Arlington</city>                    <region>MA</region>                    <code>02476</code>                    <country>US</country>                </postal>                <phone>+1 617 273 4000</phone>                <email>dan.ietf AT SIPez DOT com</email>                <uri>http://www.SIPez.com/</uri>            </address>        </author><date month="September" year="2008"/><workgroup>SIPPING WG</workgroup><abstract> <t>This document describes providing Call Transfer capabilities in the Session Initiation Protocol (SIP).  SIP extensions such as REFER and Replaces are used to provide a number of transfer services including blind transfer, consultative transfer, and attended transfer.  This work is part of the SIP multiparty call control framework.  </t></abstract></front><middle><section title="Overview"> <t>    This document describes providing Call Transfer capabilities and requirements  in SIP <xref target="RFC3261"/>. This work is part of the Multiparty Call   Control Framework <xref target="I-D.ietf-sipping-cc-framework"/>.  </t> <t>    The mechanisms discussed here are most closely related to traditional   basic and consultation hold transfers.  </t> <t>  This document details the use of REFER method <xref target="RFC3515"/> and  Replaces <xref target="RFC3891"/> header field to achieve call transfer.  </t><t>A user agent that fully supports the transfer mechanisms described in this document supports REFER<xref target="RFC3515"/> and Replaces<xref target="RFC3891"/> in addition to RFC 3261 <xref target="RFC3261"/>.  A user agent should use a Contact URI which meets the requirements in Section 8.1.1.8 of RFC 3261.  A compliant user agent supports the Target-Dialog header field <xref target="RFC4538"/>.</t></section><section title="Actors and Roles">   <t>    There are three actors in a given transfer event, each playing one of     the following roles:   <figure><artwork>  Transferee -      the party being transferred to the Transfer                     Target.      Transferor -      the party initiating the transfer       Transfer Target - the new party being introduced into a                    call with the Transferee.   </artwork></figure>  </t>  <t>     The following roles are used to describe transfer requirements and     scenarios:   <figure><artwork>    Originator -  wishes to place a call to the Recipient. This                   actor is the source of the first INVITE in a                  session, to either a Facilitator or a Screener.       Facilitator - receives a call or out-of-band request from the                  Originator, establishes a call to the Recipient                  through the Screener, and connects the                 Originator to the Recipient.  Typically, a Facilitator                 acts on behalf of the Originator.      Screener -    receives a call ultimately intended for the                  Recipient and transfers the calling party to                 the Recipient if appropriate. Typically, a Screener                 acts on behalf of the Recipient.      Recipient -   the party the Originator is ultimately                  connected to.    </artwork></figure>  </t> </section><section title="Terminology"><t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this   document are to be interpreted as described in BCP 14, RFC 2119 <xref target="RFC2119"/>.</t></section> <section title="Requirements">  <t>  <list style="numbers">     <t>Any party in a SIP session MUST be able to transfer any other party in        that session at any point in that session.</t>     <t>The Transferor and the Transferee MUST NOT be removed from a session        as part of a transfer transaction.     <figure><artwork>           At first glance, requirement 2 may seem to indicate           that the user experience in a transfer must be           significantly different from what a current PBX or           Centrex user expects. As the call-flows in this           document show, this is not the case. A client MAY           preserve the current experience. In fact, without           this requirement, some forms of the current           experience (ringback on transfer failure           for instance) will be lost.     </artwork></figure>    </t>       <t>The Transferor MUST know whether or not the transfer was successful.</t>    <t>The Transferee MUST be able to replace an existing dialog with a new       dialog.</t>    <t>The Transferor and Transferee SHOULD indicate their support for the       primitives required to achieve transfer.</t>    <t>The Transferor SHOULD provide the Transfer Target and Transferee with information about the nature and progress of the transfer operation being attempted. </t>    <figure><artwork>           To meet this requirement, the transfer operation can           be modeled as an ad-hoc conference between three          parties, as discussed in Section 8.    </artwork></figure>  </list>  </t> </section> <section title="Using REFER to achieve Call Transfer">  <t>     A REFER <xref target="RFC3515"/> can be issued by the Transferor to cause the Transferee to     issue an INVITE to the Transfer-Target. Note that a successful REFER     transaction does not terminate the session between the Transferor and     the Transferee. If those parties wish to terminate their session, they     must do so with a subsequent BYE request. The media negotiated between     the transferee and the transfer target is not affected by the media     that had been negotiated between the transferor and the transferee. In     particular, the INVITE issued by the Transferee will have the same SDP     body it would have if he Transferee had initiated that INVITE on its     own. Further, the disposition of the media streams between the     Transferor and the Transferee is not altered by the REFER method. </t><t>    Agents may alter a session's media through additional signaling. For     example, they may make use of the SIP hold re-INVITE     <xref target="RFC3261"/> or     conferencing extensions described in the conferencing framework <xref target="RFC4353"/>. </t><t>To perform the transfer, the transferor and transferee could reuse an existing dialog established by an INVITE to send the REFER.  This would result in a single dialog shared by two uses - an invite usage and a subscription usage.  The call flows for this are shown in detail in Section 6.2.  However, the approach described in this document is to avoid dialog reuse.  The issues and difficulties associated with dialog reuse are described in <xref target="I-D.ietf-sipping-dialogusage"/>.</t><t>Motivations for reusing the existing dialog include:</t>  <list style="numbers"> <t>  There was no way to ensure that a REFER on a new dialog would       reach the particular endpoint involved in a transfer.  Many       factors, including details of implementations and changes in       proxy routing between an INVITE and a REFER could cause the REFER       to be sent to the wrong place.  Sending the REFER down the       existing dialog ensured it got to the endpoint we were already       talking to.</t><t>     It was unclear how to associate an existing invite usage with a       REFER arriving on a new dialog, where it was completely obvious       what the association was when the REFER came on the invite       usage's dialog.</t> <t>     There were concerns with authorizing out-of-dialog REFERs.  The       authorization policy for REFER in most implementations piggybacks       on the authorization policy for INVITE (which is, in most cases,       based simply on "I placed or answered this call").</t></list><t>   GRUUs <xref target="I-D.ietf-sip-gruu"/> can be used to address problem 1.  Problem 2 can be addressed using the Target-Dialog header field defined in <xref target="RFC4538"/>.  In the   immediate term, this solution to problem 2 allows the existing REFER   authorization policy to be reused.     </t>   <t>   </t><t>    As a result, if the Transferee supports the target-dialog extension and the Transferor knows the Contact URI is routable outside the dialog, the REFER SHOULD be sent in a new dialog.  If the nature of the Contact URI is not known or if support for the target-dialog extension is not known, the REFER should be sent inside the existing dialog.  A Transferee must be prepared to receive a REFER either inside or outside a dialog.  One way that a Transferor could know that a Contact URI is routable outside a dialog is by validation (e.g. sending an OPTIONS and receiving a response) or if it satisfies the properties described in the GRUU specification <xref target="I-D.ietf-sip-gruu"/>. </t><t>In most of the following examples, the Transferor is in the atlanta.example.com domain, the Transferee is in the biloxi.example.com, and the Transfer Target is in the chicago.example.com domain.</t> </section> <section title="Basic Transfer">  <t>     Basic Transfer consists of the Transferor providing the Transfer     Target's contact to the Transferee. The Transferee attempts to     establish a session using that contact and reports the results of that     attempt to the Transferor. The signaling relationship between the     Transferor and Transferee is not terminated, so the call is       recoverable if the Transfer Target cannot be reached. Note that the     Transfer Target's contact information has been exposed to the     Transferee. The provided contact can be used to make new calls in the     future.   </t>  <t>    The participants in a basic transfer should indicate support for the REFER    and NOTIFY methods in Allow header fields in INVITE, 200 OK to    INVITE, and OPTIONS messages.  Participants should also indicate support for Target-Dialog in the Supported header field.  </t>  <t>     The diagrams below show the first line of each message. The first column of the figure shows the dialog used in that particular message. In these     diagrams, media is managed through re-INVITE holds, but other     mechanisms (mixing multiple media streams at the UA or using the     conferencing extensions for example) are valid.  Selected message details are shown labeled as message F1, F2, etc.  </t>  <t>    Each of the flows below shows the dialog between the Transferor    and the Transferee remaining connected (on hold) during the REFER    process. While this provides the greatest flexibility for recovery    from failure, it is not necessary. If the Transferor's agent does    not wish to participate in the remainder of the REFER process and    has no intention of assisting with recovery from transfer failure,    it could emit a BYE to the Transferee as soon as the REFER    transaction completes. This flow is sometimes known as "unattended     transfer" or "blind transfer".   </t>   <t>   Figure 1 shows transfer when the Transferee utilizes a GRUU and supports the target-dialog extension and indicates this to the Transferor.  As a result, the Transferor sends the REFER outside the INVITE dialog.  The Transferee is able to match this REFER to the existing dialog using the Target-Dialog header field in the refer which references the existing dialog.   </t>   <section title="Successful Transfer">   <t><figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |          INVITE F1 |                    |         dialog1 |<-------------------|                    |                 |          200 OK F2 |                    |         dialog1 |------------------->|                    |                 |            ACK     |                    |         dialog1 |<-------------------|                    |                 |  INVITE (hold)     |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |  ACK               |                    |         dialog1 |------------------->|                    |                 |  REFER F3 (Target-Dialog:1)             |         dialog2 |------------------->|                    |                 |  202 Accepted      |                    |         dialog2 |<-------------------|                    |                 | NOTIFY (100 Trying) F4                  |         dialog2 |<-------------------|                    |                 |            200 OK  |                    |         dialog2 |------------------->|                    |                 |                    |  INVITE F5         |         dialog3 |                    |------------------->|                 |                    |  200 OK            |         dialog3 |                    |<-------------------|                 |                    |  ACK               |         dialog3 |                    |------------------->|                 |  NOTIFY (200 OK) F6|                    |         dialog2 |<-------------------|                    |                 |            200 OK  |                    |         dialog2 |------------------->|                    |                 |  BYE               |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |                    |             BYE    |         dialog3 |                    |<-------------------|                 |                    |             200 OK |         dialog3 |                    |------------------->|     ]]></artwork></figure>   Figure 1. Basic Transfer Call Flow.</t><figure><artwork><![CDATA[F1 INVITE Transferee -> TransferorINVITE sips:transferor@atlanta.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>From: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu, tdialog Contact: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>Content-Type: application/sdpContent-Length: ...F2 200 OK Transferor -> TransfereeSIP/2.0 200 OKVia: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432To: <sips:transferor@atlanta.example.com>;tag=31kdl4i3kFrom: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu, tdialog Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Type: application/sdpContent-Length: ...F3 REFER Transferor -> TransfereeREFER sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKna9Max-Forwards: 70To: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>From: <sips:transferor@atlanta.example.com>;tag=1928301774Call-ID: a84b4c76e66710CSeq: 314159 REFERAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: gruu, replaces, tdialogRequire: tdialog Refer-To: <sips:transfertarget@chicago.example.com>Target-Dialog: 090459243588173445;local-tag=7553452 ;remote-tag=31kdl4i3k Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Length: 0	F4 NOTIFY Transferee -> TransferorNOTIFY sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>;tag=1928301774 From: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha> ;tag=a6c85cf Call-ID: a84b4c76e66710CSeq: 73 NOTIFYAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, tdialog Event: referSubscription-State: active;expires=60 Content-Type: message/sipfrag Content-Length: ...SIP/2.0 100 TryingF5 INVITE Transferee -> Transfer TargetINVITE sips:transfertarget@chicago.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas41234Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferee@biloxi.example.com>;tag=j3kso3iqhqCall-ID: 90422f3sd23m4g56832034CSeq: 521 REFERAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu, tdialog Contact: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>Content-Type: application/sdpContent-Length: ...F6 NOTIFY Transferee -> TransferorNOTIFY sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>;tag=1928301774 From: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha> ;tag=a6c85cf Call-ID: a84b4c76e66710CSeq: 74 NOTIFYAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, tdialogEvent: refer Subscription-State: terminated;reason=noresource Content-Type: message/sipfrag Content-Length: ...SIP/2.0 200 OK]]></artwork></figure>  </section>  <section title="Transfer with Dialog Reuse">   <t>In this scenario, the Transferor does not know the properties of the Transferee's Contact URI or does not know that the Transferee supports the Target-Dialog header field.  As a result, the REFER is sent inside the INVITE dialog.</t><figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |         INVITE F1  |                    |         dialog1 |<-------------------|                    |                 |         200 OK F2  |                    |         dialog1 |------------------->|                    |                 |            ACK     |                    |         dialog1 |<-------------------|                    |                 |  INVITE (hold)     |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |  ACK               |                    |         dialog1 |------------------->|                    |                 |  REFER F3          |                    |         dialog1 |------------------->|                    |                 |  202 Accepted      |                    |         dialog1 |<-------------------|                    |                 | NOTIFY (100 Trying) F4                  |         dialog1 |<-------------------|                    |                 |            200 OK  |                    |         dialog1 |------------------->|                    |                 |                    |  INVITE F5         |         dialog2 |                    |------------------->|                 |                    |  200 OK            |         dialog2 |                    |<-------------------|                 |                    |  ACK               |         dialog2 |                    |------------------->|                 |  NOTIFY (200 OK) F6|                    |         dialog1 |<-------------------|                    |                 |            200 OK  |                    |         dialog1 |------------------->|                    |                 |  BYE               |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |                    |             BYE    |         dialog2 |                    |<-------------------|                 |                    |             200 OK |         dialog2 |                    |------------------->|     ]]></artwork></figure><t>Figure 2. Transfer with Dialog Reuse.</t><figure><artwork><![CDATA[F1 INVITE Transferee -> TransferorINVITE sips:transferor@atlanta.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>From: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transferee@192.0.2.4>Content-Type: application/sdpContent-Length: ...F2 200 OK Transferor -> TransfereeSIP/2.0 200 OKVia: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432To: <sips:transferor@atlanta.example.com>;tag=31kdl4i3kFrom: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: gruu, replaces Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Type: application/sdpContent-Length: ...F3 REFER Transferor -> TransfereeREFER sips:transferee@192.0.2.4 SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKna9Max-Forwards: 70To: <sips:transferee@biloxi.example.com>;tag=7553452From: <sips:transferor@atlanta.example.com>;tag=31kdl4i3k Call-ID: 090459243588173445CSeq: 314159 REFERAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Refer-To: <sips:transfertarget@chicago.example.com>Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Length: 0F4 NOTIFY Transferee -> TransferorNOTIFY sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>;tag=31kdl4i3kFrom: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29888 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Event: referSubscription-State: active;expires=60 Content-Type: message/sipfrag Content-Length: ...SIP/2.0 100 TryingF5 INVITE Transferee -> Transfer TargetINVITE sips:transfertarget@chicago.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas41234Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferee@biloxi.example.com>;tag=j3kso3iqhqCall-ID: 90422f3sd23m4g56832034CSeq: 521 REFERAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transferee@192.0.2.4>Content-Type: application/sdpContent-Length: ...F6 NOTIFY Transferee -> TransferorNOTIFY sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>;tag=31kdl4i3kFrom: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29889 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Event: refer Subscription-State: terminated;reason=noresource Content-Type: message/sipfrag Content-Length: ...SIP/2.0 200 OK]]></artwork></figure>  </section>  <section title="Failed Transfer">  <t>   This section shows examples of failed transfer attempts.  After the transfer   failure occurs, the Transferor takes the Transferee off hold and resumes the   session.  </t>   <section title="Target Busy">   <t><figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |                    |                    |                 |            INVITE  |                    |         dialog1 |<-------------------|                    |                 |            200 OK  |                    |         dialog1 |------------------->|                    |                 |            ACK     |                    |         dialog1 |<-------------------|                    |                 |  INVITE (hold)     |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |  ACK               |                    |         dialog1 |------------------->|                    |                 |  REFER (Target-Dialog:1)                |         dialog2 |------------------->|                    |                 |  202 Accepted      |                    |         dialog2 |<-------------------|                    |                 | NOTIFY (100 Trying)|                    |         dialog2 |<-------------------|                    |                 |            200 OK  |                    |         dialog2 |------------------->|                    |                 |                    |  INVITE            |         dialog3 |                    |------------------->|                 |                    |  486 Busy Here     |         dialog3 |                    |<-------------------|                 |                    |  ACK               |         dialog3 |                    |------------------->|                 | NOTIFY (486 Busy Here)                  |         dialog2 |<-------------------|                    |                 |            200 OK  |                    |         dialog2 |------------------->|                    |                 |  INVITE (unhold)   |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |  ACK               |                    |         dialog1 |------------------->|                    |                 |  BYE               |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |    ]]></artwork></figure>    Figure 3. Failed Transfer - Target Busy</t>   </section>   <section title="Transfer Target does not answer">   <t>    <figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                |            INVITE  |                    |         dialog1 |<-------------------|                    |                 |            200 OK  |                    |         dialog1 |------------------->|                    |                 |            ACK     |                    |         dialog1 |<-------------------|                    |                 |  INVITE (hold)     |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |  ACK               |                    |         dialog1 |------------------->|                    |                 |  REFER             |                    |         dialog2 |------------------->|                    |                 |  202 Accepted      |                    |         dialog2 |<-------------------|                    |                 | NOTIFY (100 Trying)|                    |         dialog2 |<-------------------|                    |                 |            200 OK  |                    |         dialog2 |------------------->|                    |                 |                    |  INVITE            |         dialog3 |                    |------------------->|                 |                    |  180 Ringing       |         dialog3 |                    |<-------------------|                |          (Transferee gets tired of waiting)                |                    |  CANCEL            |         dialog3 |                    |------------------->|                 |                    |  200 OK (CANCEL)   |         dialog3 |                    |<-------------------|                 |                 487 Request Cancelled (INVITE)        dialog3 |                    |<-------------------|                 |                    |  ACK               |        dialog3 |                    |------------------->|                 |    NOTIFY (487 Request Cancelled)       |         dialog2 |<-------------------|                    |                 |            200 OK  |                    |         dialog2 |------------------->|                    |                 |  INVITE (unhold)   |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |                 |  ACK               |                    |         dialog1 |------------------->|                    |                 |  BYE               |                    |         dialog1 |------------------->|                    |                 |  200 OK            |                    |         dialog1 |<-------------------|                    |     ]]></artwork></figure>    Figure 4. Failed Transfer - Target Does Not Answer.</t>   </section>  </section> </section> <section title="Transfer with Consultation Hold">  <t>     Transfer with Consultation Hold involves a session between the     transferor and the transfer target before the transfer actually takes     place. This is implemented with SIP Hold and Transfer as     described above.    </t>  <t>  A nice feature is for the transferor to let the target know that the session relates to an intended transfer.  Since many UAs render the display name in the From header field to the user, a consultation INVITE could contain a string such as "Incoming consultation from Transferor with intent to transfer Transferee", where the display names of the transferor and transferee are included in the string.  </t>    <section title="Exposing transfer target">    <t>     The transferor places the transferee on hold, establishes a call with      the transfer target to alert them to the impending transfer,      terminates the connection with the transfer target, then proceeds with      transfer as above. This variation can be used to provide an      experience similar to that expected by current PBX and Centrex users.    </t><t>     To (hopefully) improve clarity, non-REFER transactions have been      collapsed into one indicator with the arrow showing the direction of      the request.    </t>   <t><figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |                    |                    |         dialog1 | INVITE/200 OK/ACK  |                    |                 |<-------------------|                    |         dialog1 | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |         dialog2 | INVITE/200 OK/ACK  |                    |                 |---------------------------------------->|         dialog2 | BYE/200 OK         |                    |                 |---------------------------------------->|         dialog3 | REFER              |                    |                 |------------------->|                    |         dialog3 | 202 Accepted       |                    |                |<-------------------|                    |         dialog3 | NOTIFY (100 Trying)|                    |                 |<-------------------|                    |         dialog3 |            200 OK  |                    |                 |------------------->|                    |         dialog4 |                    |  INVITE/200 OK/ACK |                |                    |------------------->|         dialog3 | NOTIFY (200 OK)    |                    |                 |<-------------------|                    |         dialog3 |            200 OK  |                    |                 |------------------->|                    |         dialog1 | BYE/200 OK         |                    |                 |------------------->|                    |         dialog4 |                    |         BYE/200 OK |                 |                    |<-------------------|    ]]></artwork></figure>  Figure 5. Transfer with Consultation Hold - Exposing Transfer Target.  </t></section>  <section title="Protecting transfer target">    <t>    The transferor places the transferee on hold, establishes a call with     the transfer target and then reverses their roles, transferring the     original transfer target to the original transferee. This has the     advantage of hiding information about the original transfer target     from the original transferee. On the other hand, the Transferee's     experience is different that in current systems. The Transferee is     effectively "called back" by the Transfer Target.    </t>     <t> One of the problems with this simplest implementation of          a target protecting transfer is that the transferee is         receiving a new call from the transfer-target.         Unless the transferee's agent has a reliable way to associate         this new call with the call it already has with the transferor,         it will have to alert the new call on another appearance. If         this, or some other call-waiting-like UI were not available, the         transferee might be stuck returning a Busy-Here to the transfer         target, effectively preventing the transfer.         There are many ways that that correlation could be provided. The         dialog parameters could be provided directly as header parameters         in the Refer-To: URI for example. The Replaces mechanism         <xref target="RFC3891"/> uses this approach and solves this problem         nicely.     </t>     <t>        For the flow below, dialog1 means dialog identifier 1, and consists        of the parameters of the Replaces header for dialog 1. In         <xref target="RFC3891"/> this is the Call-ID, To-tag and From-tag.     </t>     <t>       Note that the transferee's agent emits a BYE to the transferor's agent       as an immediate consequence of processing the Replaces header.      </t>     <t>     The Transferor knows that both the Transferee and the Transfer Target      support the Replaces header from the Supported: replaces header contained      in the 200 OK responses from both.     </t><t>     In this scenario, the Transferee utilizes a GRUU as a Contact URI for reasons discussed in Section 6.3.</t><t>Note that the conventions used in the <xref target="RFC4475">SIP Torture Test Messages</xref> document are reused, specifically the  &lt;allOneLine&gt; tag.<figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |                    |                    |       dialog1   | INVITE/200 OK/ACK F1 F2                 |                 |<-------------------|                    |       dialog1   | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |       dialog2   | INVITE/200 OK/ACK F3 F4                 |                 |---------------------------------------->|       dialog2   | INVITE (hold)/200 OK/ACK                |                 |---------------------------------------->|       dialog3   | REFER (Target-Dialog:2,                 |                |  Refer-To:sips:Transferee?Replaces=1) F5|                |---------------------------------------->|       dialog3   | 202 Accepted       |                    |                 |<----------------------------------------|       dialog3   | NOTIFY (100 Trying)|                    |                 |<----------------------------------------|      dialog3   |                    |            200 OK  |                |---------------------------------------->|      dialog4   |         INVITE (Replaces:dialog1)/200 OK/ACK F6                 |                    |<-------------------|       dialog1   | BYE/200 OK         |                    |                 |<-------------------|                    |       dialog3   | NOTIFY (200 OK)    |                    |                 |<----------------------------------------|       dialog3   |                    |            200 OK  |                 |---------------------------------------->|       dialog2   | BYE/200 OK         |                    |                 |---------------------------------------->|                 |              (transferee and target converse)      dialog4   |                    |  BYE/200 OK        |                 |                    |------------------->|      ]]></artwork></figure>     Figure 6. Transfer Protecting Transfer Target.</t><figure><artwork><![CDATA[F1 INVITE Transferee -> TransferorINVITE sips:transferor@atlanta.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>From: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu Contact: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>Content-Type: application/sdpContent-Length: ...F2 200 OK Transferor -> TransfereeSIP/2.0 200 OKVia: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432To: <sips:transferor@atlanta.example.com>;tag=31431From: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu, tdialog Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Type: application/sdpContent-Length: ...F3 INVITE Transferor -> Transfer TargetINVITE sips:transfertarget@chicago.example.com SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 592435881734450904CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: gruu, replaces, tdialog Require: replacesContact: <sips:4889445d8kjtk3@atlanta.example.com;gr=384i32lw3>Content-Type: application/sdpContent-Length: ...F4 200 OK Transfer Target -> TransferorSIP/2.0 200 OKVia: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnas432 ;received=192.0.2.1To: <sips:transfertarget@chicago.example.com>;tag=9m2n3wqFrom: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 592435881734450904CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu, tdialog Contact: <sips:482n4z24kdg@chicago.example.com;gr=8594958>Content-Type: application/sdpContent-Length: ...F5 REFER Transferor -> Transfer TargetREFER sips:482n4z24kdg@chicago.example.com;gr=8594958 SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds9Max-Forwards: 70To: <sips:482n4z24kdg@chicago.example.com;gr=8594958>From: <sips:transferor@atlanta.example.com>;tag=1928301774Call-ID: a84b4c76e66710CSeq: 314159 REFERAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: gruu, replaces, tdialogRequire: tdialog<allOneLine>Refer-To: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha?Replaces=090459243588173445%3Bto-tag%3D7553452%3Bfrom-tag%3D31431></allOneLine>Target-Dialog: 592435881734450904;local-tag=9m2n3wq ;remote-tag=763231Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Length: 0F6 INVITE Transfer Target -> TransfereeINVITE sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha SIP/2.0Via: SIP/2.0/TLS client.chicago.example.com;branch=z9hG4bKnaslu84Max-Forwards: 70To: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>From: <sips:transfertarget@chicago.example.com>;tag=341234Call-ID: kmzwdle3dl3d08CSeq: 41 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: gruu, replaces, tdialog Contact: <sips:482n4z24kdg@chicago.example.com;gr=8594958>Replaces: 090459243588173445;to-tag=7553452;from-tag=31431Content-Type: application/sdpContent-Length: ...]]></artwork></figure>  </section>  <section title="Attended Transfer">    <t>     The transferor places the transferee on hold, establishes a call with      the transfer target to alert them to the impending transfer,      places the target on hold, then proceeds with      transfer using an escaped Replaces header field in the Refer-To header.     This is another common service expected by current PBX and Centrex users. </t><t>The Contact URI of the Transfer Target SHOULD be used by the Transferor as the Refer-To URI, unless the URI is suspected or known to not be routable outside the dialog.  Otherwise, the Address of Record (AOR) of the Transfer Target should be used.  That is, the same URI that the Transferor used to establish the session with the Transfer Target should be used.  In case the triggered INVITE is routed to a different User Agent than the Transfer Target, the Require: replaces header field should be used in the triggered INVITE. (This is to prevent an incorrect User Agent which does not support Replaces from ignoring the Replaces and answering the INVITE without a dialog match.)</t><t>It is possible that proxy/service routing may prevent the triggered INVITE from reaching the same User Agent.  If this occurs, the triggered invite will fail with a timout, 403, 404, etc error.  The Transferee MAY then retry the transfer with the Refer-To URI set to the Contact URI.</t><figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |                    |                    |        dialog1  | INVITE/200 OK/ACK F1 F2                 |                 |<-------------------|                    |        dialog1  | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |        dialog2  | INVITE/200 OK/ACK F3 F4                 |                 |---------------------------------------->|        dialog2  | INVITE (hold)/200 OK/ACK                |                 |---------------------------------------->|        dialog3  | REFER (Target-Dialog:1,                 |                |  Refer-To:sips:TransferTarget?Replaces=2) F5                 |------------------->|                    |        dialog3  | 202 Accepted       |                    |                 |<-------------------|                    |        dialog3  | NOTIFY (100 Trying)|                    |                 |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog4  |        INVITE (Replaces:dialog2)/200 OK/ACK F6                |                    |------------------->|        dialog2  | BYE/200 OK         |                    |                 |<----------------------------------------|        dialog3  | NOTIFY (200 OK)    |                    |                |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog1  | BYE/200 OK         |                    |                 |------------------->|                    |        dialog4  |                    |         BYE/200 OK |                 |                    |<-------------------| ]]></artwork></figure><t>  Figure 7. Attended Transfer Call Flow.</t><figure><artwork><![CDATA[F1 INVITE Transferee -> TransferorINVITE sips:transferor@atlanta.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>From: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu, tdialog Contact: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>Content-Type: application/sdpContent-Length: ...F2 200 OK Transferor -> TransfereeSIP/2.0 200 OKVia: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432To: <sips:transferor@atlanta.example.com>;tag=31431From: <sips:transferee@biloxi.example.com>;tag=7553452Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu, tdialog Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Type: application/sdpContent-Length: ...F3 INVITE Transferor -> Transfer TargetINVITE sips:transfertarget@chicago.example.com SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 592435881734450904CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: gruu, replaces, tdialog Require: replacesContact: <sips:4889445d8kjtk3@atlanta.example.com;gr=384i32lw3>Content-Type: application/sdpContent-Length: ...F4 200 OK Transfer Target -> TransferorSIP/2.0 200 OKVia: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnas432 ;received=192.0.2.1To: <sips:transfertarget@chicago.example.com>;tag=9m2n3wqFrom: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 592435881734450904CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces, gruu Contact: <sips:482n4z24kdg@chicago.example.com;gr=8594958>Content-Type: application/sdpContent-Length: ...F5 REFER Transferor -> TransfereeREFER sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds9Max-Forwards: 70To: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>From: <sips:transferor@atlanta.example.com>;tag=1928301774Call-ID: a84b4c76e66710CSeq: 314159 REFERRequire: tdialog<allOneLine>Refer-To: <sips:482n4z24kdg@chicago.example.com;gr=8594958? Replaces=592435881734450904%3Bto-tag%3D9m2n3wq%3Bfrom-tag3D763231></allOneLine>Target-Dialog: 592435881734450904;local-tag=9m2n3wq ;remote-tag=763231Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Length: 0F6 INVITE Transferee -> Transfer TargetINVITE sips:482n4z24kdg@chicago.example.com;gr=8594958 SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnaslu82Max-Forwards: 70To: <sips:482n4z24kdg@chicago.example.com;gr=8594958>From: <sips:transferee@biloxi.example.com>;tag=954Call-ID: kmzwdle3dl3d08CSeq: 41 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: gruu, replaces, tdialog Contact: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>Replaces: 592435881734450904;to-tag=9m2n3wq;from-tag=763231Content-Type: application/sdpContent-Length: ...]]></artwork></figure></section>  <section title="Recovery when one party does not support REFER">   <t>   If protecting or exposing the transfer target is not a concern,   it is possible to complete a transfer with consultation hold when   only the transferor and one other party support REFER.  Note that a 405    Method Not Allowed might be returned instead of the 501 Not Implemented   response.   </t>   <t><figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |                    |                    |        dialog1  | INVITE/200 OK/ACK  |                    |                 |<-------------------|                    |        dialog1  | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |        dialog2  | INVITE/200 OK/ACK  |                    |                 |---------------------------------------->|        dialog2  | INVITE (hold)/200 OK/ACK                |                 |---------------------------------------->|        dialog3  | REFER (Target-Dialog:1,                 |                |    Refer-To:sips:TransferTarget?Replaces=2)                |------------------->|                    |        dialog3  | 501 Not Implemented                     |                |<-------------------|                    |        dialog4  | REFER (Refer-To:sips:Transferee?Replaces=dialog1)                |---------------------------------------->|        dialog4  | 202 Accepted       |                    |                 |<----------------------------------------|        dialog4  | NOTIFY (100 Trying)|                    |                 |<----------------------------------------|        dialog4  |                    |            200 OK  |                 |---------------------------------------->|        dialog5  |             INVITE (Replaces:dialog1)/200 OK/ACK                 |                    |<-------------------|        dialog4  | NOTIFY (200 OK)    |                    |                 |<----------------------------------------|        dialog4  |                    |            200 OK  |                 |---------------------------------------->|        dialog1  | BYE/200 OK         |                    |                 |<-------------------|                    |        dialog2  | BYE/200 OK         |                    |                 |---------------------------------------->|        dialog5  |                    |  BYE/200 OK        |                 |                    |------------------->| ]]></artwork></figure>  Figure 8. Recovery when one party does not support REFER. </t>  </section>  <section title="Attended transfer when Contact URI is not known to route to a unique user agent.">   <t>    It is a requirement of RFC3261 that a Contact URI be globally routable even outside the dialog.  However, due to RFC2543 User Agents and some architectures (NAT/Firewall traversal, screening proxies, ALGs, etc.) this will not always be the case. As a result, the method of Attended Transfer shown in Figures 6, 7, and 8 should only be used if the Contact URI is known to be routable outside the dialog.  </t><t>Figure 9 shows such a scenario where the Transfer Target Contact URI is not routable outside the dialog, so the triggered INVITE is sent to the AOR of the Transfer Target.</t><figure><artwork><![CDATA[    Transferor           Transferee  Screening       Transfer        |                  |           Proxy         Target         |                  |             |             | dialog1 | INVITE/200 OK/ACK|             |             |         |<-----------------|             |             | dialog1 | INVITE (hold)/200 OK/ACK       |             |         |----------------->|             |             | dialog2 | INVITE/200 OK/ACK F1 F2        |             |         |--------------------------------|------------>| dialog2 | INVITE (hold)/200 OK/ACK                     |         |--------------------------------|------------>| dialog1 | REFER (Refer-To:sips:TargetAOR               |        |         ?Replaces=dialog2&Require=replaces) F3        |----------------->|             |             | dialog1 | 202 Accepted     |             |             |        |<-----------------|             |             |dialog1 | NOTIFY (100 Trying)            |             |        |<-----------------|             |             |dialog1 |          200 OK  |             |             |        |----------------->|             |             |dialog4 |INVITE (Replaces:dialog2,Require:replaces)/200 OK/ACK F6        |                  |------------>|------------>|dialog2 | BYE/200 OK       |             |             |        |<-------------------------------|<------------|dialog1 | NOTIFY (200 OK) F7             |             |        |<-----------------|             |             |dialog1 |          200 OK  |             |             |        |----------------->|             |             |dialog1 | BYE/200 OK       |             |             |        |----------------->|             |             |dialog3 |                  |             |  BYE/200 OK |        |                  |<------------|-------------|]]></artwork></figure><t>  Figure 9. Attended Transfer Call Flow with a Contact URI not known to be Globally Routable</t> <figure><artwork><![CDATA[F1 INVITE Transferor -> Transfer TargetINVITE sips:transfertarget@chicago.example.com SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bK76Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transferor@pc33.atlanta.example.com>Content-Type: application/sdpContent-Length: ...F2 200 OK Transfer Target -> TransfereeSIP/2.0 200 OKVia: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnas432 ;received=192.0.2.1To: <sips:transfertarget@chicago.example.com>;tag=9m2n3wqFrom: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transfertarget@client.chicago.example.com>Content-Type: application/sdpContent-Length: ...F3 REFER Transferor -> TransfereeREFER sips:transferee@192.0.2.4 SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds9Max-Forwards: 70To: <sips:transferee@biloxi.example.com>;tag=a6c85cfFrom: <sips:transferor@atlanta.example.com>;tag=1928301774Call-ID: a84b4c76e66710CSeq: 314160 REFER<allOneLine>Refer-To: <sips:transfertarget@chicago.example.com?Replaces=090459243588173445%3Bto-tag%3D9m2n3wq%3Bfrom-tag%3D763231&Require=replaces><allOneLine>Contact: <sips:transferor@pc33.atlanta.example.com>Content-Length: 0F4 INVITE Transferee -> Transfer TargetINVITE sips:transfertarget@chicago.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnaslu82Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferee@biloxi.example.com>;tag=954Call-ID: 20482817324945934422930CSeq: 42 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transferee@192.0.2.4>Replaces: 090459243588173445;to-tag=9m2n3wq;from-tag=763231Require: replacesContent-Type: application/sdpContent-Length: ...F5 NOTIFY Transferee -> TransferorNOTIFY sips:transferor@pc33.atlanta.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>;tag=1928301774From: <sips:transferee@biloxi.example.com>;tag=a6c85cfCall-ID: a84b4c76e66710CSeq: 76 NOTIFYAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Event: refer;id=98873867 Subscription-State: terminated;reason=noresource Content-Type: message/sipfrag Content-Length: ...SIP/2.0 200 OK]]></artwork></figure><t>Figure 10 shows a failure case in which the AOR URI fails to reach the transfer Target.  As a result, the transfer is retried with the Contact URI which succeeds.</t><t>Note that there is still no guarantee that the correct endpoint will be reached, and the result of this second REFER may also be a failure.  In that case, the Transferor could fall back to unattended transfer or give up on the transfer entirely.  Since two REFERs are sent within the dialog creating two distinct subscriptions, the Transferee uses the 'id' parameter in the Event header field to distinguish notifications for the two subscriptions.</t><figure><artwork><![CDATA[    Transferor           Transferee  Screening      Transfer        |                  |           Proxy         Target         |                  |             |             | dialog1 | INVITE/200 OK/ACK|             |             |         |<-----------------|             |             | dialog1 | INVITE (hold)/200 OK/ACK       |             |         |----------------->|             |             | dialog2 | INVITE/200 OK/ACK F1 F2        |             |         |--------------------------------|------------>| dialog2 | INVITE (hold)/200 OK/ACK                     |         |--------------------------------|------------>| dialog1 | REFER (Refer-To:sips:TargetAOR?              |        |       Replaces=dialog2&Require=replaces) F3  |        |----------------->|             |             | dialog1 | 202 Accepted     |             |             |        |<-----------------|             |             |dialog1 | NOTIFY (100 Trying)            |             |        |<-----------------|             |             |dialog1 |          200 OK  |             |             |        |----------------->|             |             |dialog3 |                  |INVITE (Replaces:dialog2,  |        |                  | Require:replaces)/403/ACK |        |                  |------------>|             |dialog1 | NOTIFY (403 Forbidden) F4      |             |        |<-----------------|             |             |dialog1 |          200 OK  |             |             |        |----------------->|             |             |dialog1 |REFER(Refer-To:sips:TargetContact?Replaces=dialog2) F5        |----------------->|             |             |dialog1 | 202 Accepted     |             |             |        |<-----------------|             |             |dialog1 | NOTIFY (100 Trying)            |             |        |<-----------------|             |             |dialog1 |          200 OK  |             |             |        |----------------->|             |             |dialog4 |                INVITE (Replaces:dialog2)/200 OK/ACK F6        |                  |------------>|------------>|dialog2 | BYE/200 OK       |             |             |        |<-------------------------------|<------------|dialog1 | NOTIFY (200 OK) F7             |             |        |<-----------------|             |             |dialog1 |          200 OK  |             |             |        |----------------->|             |             |dialog1 | BYE/200 OK       |             |             |        |----------------->|             |             |dialog3 |                  |             |  BYE/200 OK |        |                  |<------------|-------------|]]></artwork></figure><t>  Figure 10. Attended Transfer Call Flow with non-routable Contact URI and AOR Failure   </t> <figure><artwork><![CDATA[F1 INVITE Transferor -> Transfer TargetINVITE sips:transfertarget@chicago.example.com SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bK76Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transferor@pc33.atlanta.example.com>Content-Type: application/sdpContent-Length: ...F2 200 OK Transfer Target -> TransfereeSIP/2.0 200 OKVia: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnas432 ;received=192.0.2.1To: <sips:transfertarget@chicago.example.com>;tag=9m2n3wqFrom: <sips:transferor@atlanta.example.com>;tag=763231Call-ID: 090459243588173445CSeq: 29887 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transfertarget@client.chicago.example.com>Content-Type: application/sdpContent-Length: ...F3 REFER Transferor -> TransfereeREFER sips:transferee@192.0.2.4 SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds9Max-Forwards: 70To: <sips:transferee@biloxi.example.com>;tag=a6c85cfFrom: <sips:transferor@atlanta.example.com>;tag=1928301774Call-ID: a84b4c76e66710CSeq: 314159 REFER<allOneLine>Refer-To: <sips:transfertarget@chicago.example.com?Replaces=090459243588173445%3Bto-tag%3D9m2n3wq%3Bfrom-tag%3D763231&Require=replaces></allOneLine>Contact: <sips:transferor@pc33.atlanta.example.com>Content-Length: 0F4 NOTIFY Transferee -> TransferorNOTIFY sips:transferor@pc33.atlanta.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>;tag=1928301774From: <sips:transferee@biloxi.example.com>;tag=a6c85cfCall-ID: a84b4c76e66710CSeq: 74 NOTIFYAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Event: refer;id=314159 Subscription-State: terminated;reason=noresource Content-Type: message/sipfrag Content-Length: ...SIP/2.0 403 ForbiddenF5 REFER Transferor -> TransfereeREFER sips:transferee@192.0.2.4 SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bKnashds9Max-Forwards: 70To: <sips:transferee@biloxi.example.com>;tag=a6c85cfFrom: <sips:transferor@atlanta.example.com>;tag=1928301774Call-ID: a84b4c76e66710CSeq: 314160 REFER<allOneLine>Refer-To: <sips:transfertarget@client.chicago.example.com?Replaces=090459243588173445%3Bto-tag%3D9m2n3wq%3Bfrom-tag%3D763231></allOneLine>Contact: <sips:transferor@pc33.atlanta.example.com>Content-Length: 0F6 INVITE Transferee -> Transfer TargetINVITE sips:transfertarget@client.chicago.example.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnaslu82Max-Forwards: 70To: <sips:transfertarget@chicago.example.com>From: <sips:transferee@biloxi.example.com>;tag=954Call-ID: 20482817324945934422930CSeq: 42 INVITEAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Contact: <sips:transferee@192.0.2.4>Replaces: 090459243588173445;to-tag=9m2n3wq;from-tag=763231Content-Type: application/sdpContent-Length: ...F7 NOTIFY Transferee -> TransferorNOTIFY sips:transferor@pc33.atlanta.com SIP/2.0Via: SIP/2.0/TLS 192.0.2.4;branch=z9hG4bKnas432Max-Forwards: 70To: <sips:transferor@atlanta.example.com>;tag=1928301774From: <sips:transferee@biloxi.example.com>;tag=a6c85cfCall-ID: a84b4c76e66710CSeq: 76 NOTIFYAllow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY Supported: replaces Event: refer;id=314160 Subscription-State: terminated;reason=noresource Content-Type: message/sipfrag Content-Length: ...SIP/2.0 200 OK]]></artwork></figure><t>To prevent this scenario from happening, the Transfer Target should use a Contact URI which is routable outside the dialog, which will result in the call flow of Figure 7.</t></section>  <section title="Semi-Attended Transfer">   <t>    In any of the consultation hold flows above, the Transferor may decide    to terminate its attempt to contact the Transfer target before that     session is established. Most frequently, that will be the end of the    scenario, but in some circumstances, the transferor may wish to proceed    with the transfer action. For example, the Transferor may wish to complete the transfer    knowing that the transferee will end up eventually talking to the     transfer-target's voice-mail service.  Some PBX systems support this feature, sometimes called "semi-attended transfer", that is effectively a hybrid between a fully attended transfer and an unattended transfer.  A call flow is shown in Figure 11.  In this flow, the Transferor's User Agent continues the transfer as an attended transfer even after the Transferor hangs up.  Note that media must be played to the Transfer Target upon answer - otherwise, the Target may hang up and the resulting transfer operation will fail.</t><figure><artwork><![CDATA[           Transferor           Transferee            Transfer                 |                    |                 Target                 |                    |                    |        dialog1  | INVITE/200 OK/ACK F1 F2                 |                 |<-------------------|                    |        dialog1  | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |        dialog2  | INVITE             |                    |                 |---------------------------------------->|       dialog2  |                    |       180 Ringing  |                 |<----------------------------------------|             Transferor hangs up but wants transfer to continue                |                    |                    |                 | User Agent continues transfer operation |                 |                    |                    |        dialog2  |                    |           200 OK   |                 |<----------------------------------------|       dialog2  | ACK                |                    |                 |---------------------------------------->|       dialog2  | Media Played to keep Target from hanging up                |========================================>|        dialog3  | REFER (Target-Dialog:1,                 |                |  Refer-To:sips:TransferTarget?Replaces=2)                 |------------------->|                    |        dialog3  | 202 Accepted       |                    |                 |<-------------------|                    |        dialog3  | NOTIFY (100 Trying)|                    |                 |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog4  |             INVITE (Replaces:dialog2)/200 OK/ACK                 |                    |------------------->|        dialog2  | BYE/200 OK         |                    |                 |<----------------------------------------|        dialog3  | NOTIFY (200 OK)    |                    |                |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog1  | BYE/200 OK         |                    |                 |------------------->|                    |        dialog4  |                    |         BYE/200 OK |                 |                    |<-------------------| ]]></artwork></figure><t>  Figure 11. Recommended Semi-Attended Transfer Call Flow.</t><t>Two other possible semi-attended transfer call flows are shown in Figures 12 and 13.  However, these call flows are NOT RECOMMENDED due to a race conditions.  In both of these flows, when the Transferor hangs up, the Transferor attempts to revert to unattended transfer by sending a CANCEL to the Target.  This can result in two race conditions.  One is that the Target answers despite the CANCEL and the resulting unattended transfer fails.  This race condition can be eliminated by the Transferor waiting to send the REFER until the 487 response from the Target is returned.   Instead of a 487, a 200 OK may return indicating that the Target has answered the consultation call.  In this, case the call flow in Figure 13 must be followed.  In this flow, the Transferor must play some kind of media to the Target to prevent the Target from hanging up, or the Transfer will fail.  That is, the human at the Transfer Target will hear silence from when they answer (message F1) until the transfer completes (F3 and they are talking to the Transferee unless some media is played (F2).</t><t>The second race condition occurs in Figure 12 if the Transfer Target goes "off hook" after the CANCEL is received and the 487 returned.  This may result in a 486 Busy Here response to the unattended transfer.</t><t>The recommended call flow of Figure 11 does not utilize a CANCEL and does not suffer from these race conditions.</t><figure><artwork><![CDATA[           Transferor           Transferee            Transfer                 |                    |                 Target                 |                    |                    |        dialog1  | INVITE/200 OK/ACK  |                    |                 |<-------------------|                    |        dialog1  | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |        dialog2  | INVITE                                  |                 |---------------------------------------->|        dialog2  | 180 Ringing                             |                 |<----------------------------------------|                 |                                         |                 |  Transferor gives up waiting            |                |                                         |       dialog2  | CANCEL                                  |                 |---------------------------------------->|        dialog2  | 200 OK                                  |                 |<----------------------------------------|        dialog2  | 487 Request Terminated                  |                 |<----------------------------------------|        dialog2  | ACK                                     |                 |---------------------------------------->|        dialog3  | REFER (Target-Dialog:1) F3              |                |------------------->|                    |        dialog3  | 202 Accepted       |                    |                 |<-------------------|                    |        dialog3  | NOTIFY (100 Trying)|                    |                 |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog4  |                INVITE/200 OK/ACK        |                |                    |------------------->|        dialog3  | NOTIFY (200 OK)    |                    |                |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog1  | BYE/200 OK         |                    |                 |------------------->|                    |        dialog4  |                    |         BYE/200 OK |                 |                    |<-------------------| ]]></artwork></figure><t>  Figure 12. Semi-Attended Transfer as Blind Transfer Call Flow. (Not Recommended)</t><figure><artwork><![CDATA[           Transferor           Transferee            Transfer                 |                    |                 Target                 |                    |                    |        dialog1  | INVITE/200 OK/ACK  |                    |                 |<-------------------|                    |        dialog1  | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |        dialog2  | INVITE                                  |                 |---------------------------------------->|        dialog2  | 180 Ringing                             |                 |<----------------------------------------|                 |                                         |                 |Transferor gives up waiting but Target answers                |                                         |        dialog2  | CANCEL                                  |                 |---------------------------------------->|        dialog2  | 200 OK (CANCEL)                         |                 |<----------------------------------------|        dialog2  | 200 OK (INVITE) F1                      |                 |<----------------------------------------|        dialog2  | ACK                                     |                 |---------------------------------------->|        dialog2  | INVITE (hold)/200 OK/ACK                |                 |---------------------------------------->|                 |  Tones or media played avoid silence F2 |                |========================================>|        dialog1  |REFER (Refer-To:sips:TransferTarget      |                |                      ?Replaces=dialog2) |                |------------------->|                    |        dialog1  | 202 Accepted       |                    |                 |<-------------------|                    |        dialog1  | NOTIFY (100 Trying)|                    |                 |<-------------------|                    |        dialog1  |            200 OK  |                    |                 |------------------->|                    |        dialog3  |         INVITE (Replaces:dialog2)/200 OK/ACK F3                |                    |------------------->|        dialog2  | BYE/200 OK         |                    |                 |<----------------------------------------|        dialog1  | NOTIFY (200 OK)    |                    |                |<-------------------|                    |        dialog1  |            200 OK  |                    |                 |------------------->|                    |        dialog1  | BYE/200 OK         |                    |                 |------------------->|                    |        dialog3  |                    |         BYE/200 OK |                 |                    |<-------------------| ]]></artwork></figure>  <t>Figure 13. Semi-Attended Transfer as Attended Transfer Call Flow. (Not Recommended)</t>  </section>  <section title="Attended Transfer Fallback to Basic Transfer">    <t>In this flow, an attempted attended transfer fails so the transferor falls back to basic transfer. </t><t>The call flow in Figure 14 shows the use of Require: replaces in the INVITE sent by the Transferor to the Transfer Target in which the Transferor's intention at the time of sending the INVITE to the Transfer Target was known to be to complete an attended transfer.  Since the Target does not support Replaces, the INVITE is rejected with a 420 Bad Extension response, and the Transferor switches from attended transfer to basic transfer immediately.</t><figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |                    |                    |        dialog1  | INVITE/200 OK/ACK  |                    |                 |<-------------------|                    |        dialog1  |   OPTIONS/200 OK   |                    |                 |------------------->|                    |        dialog1  | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |        dialog2  | INVITE (Require:replaces)               |                 |---------------------------------------->|        dialog2  |                     420 Bad Extension   |                 |<----------------------------------------|        dialog2  |    ACK                                  |                 |---------------------------------------->|        dialog1  | REFER (Refer-To:sips:TransferTarget)    |                 |------------------->|                    |        dialog1  |    202 Accepted    |                    |                 |<-------------------|                    |        dialog1  | NOTIFY (100 Trying)|                    |                 |<-------------------|                    |        dialog1  |            200 OK  |                    |                 |------------------->|                    |        dialog3  |                    |  INVITE/200 OK/ACK |                |                    |------------------->|        dialog1  | NOTIFY (200 OK)    |                    |                 |<-------------------|                    |        dialog1  |            200 OK  |                    |                 |------------------->|                    |        dialog1  | BYE/200 OK         |                    |                 |------------------->|                    |        dialog3  |                    |         BYE/200 OK |                 |                    |<-------------------| ]]></artwork></figure><t>  Figure 14. Attended Transfer Fallback to Basic Transfer using Require:replaces.</t><t> Figure 15 shows the use of OPTIONS when the Transferee and Transfer Target do not explicitly indicate support for the REFER method and Replaces header fields in Allow and Supported header fields and the Transferor did not have the intention of performing an attended transfer when the INVITE to the Target was sent.  In dialog1, the Transferor determines using OPTIONS that the Transferee does support REFER and Replaces.  As a result, the Transferor begins the attended transfer by placing the Transferee on hold and calling the Transfer Target.  Using an OPTIONS in dialog2, the Transferor determines that the Target does not support either REFER or Replaces, making attended transfer impossible.  The Transferor then ends dialog2 by sending a BYE then sends a REFER to the Transferee using the AOR URI of the Transfer Target.<figure><artwork><![CDATA[           Transferor           Transferee             Transfer                 |                    |                  Target                 |                    |                    |        dialog1  | INVITE/200 OK/ACK  |                    |                 |<-------------------|                    |        dialog1  |   OPTIONS/200 OK   |                    |                 |------------------->|                    |        dialog1  | INVITE (hold)/200 OK/ACK                |                 |------------------->|                    |        dialog2  | INVITE/200 OK/ACK  |                    |                 |---------------------------------------->|        dialog2  | OPTIONS/200 OK     |                    |                 |---------------------------------------->|        dialog2  |    BYE/200 OK      |                    |                 |---------------------------------------->|        dialog3  |REFER (Target-Dialog:1,                  |                |          Refer-To:sips:TransferTarget)  |                |------------------->|                    |        dialog3  |    202 Accepted    |                    |                 |<-------------------|                    |        dialog3  | NOTIFY (100 Trying)|                    |                 |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog4  |                    |  INVITE/200 OK/ACK |                |                    |------------------->|        dialog3  | NOTIFY (200 OK)    |                    |                 |<-------------------|                    |        dialog3  |            200 OK  |                    |                 |------------------->|                    |        dialog1  | BYE/200 OK         |                    |                 |------------------->|                    |        dialog4  |                    |         BYE/200 OK |                 |                    |<-------------------| ]]></artwork></figure>  Figure 15. Attended Transfer Fallback to Basic Transfer.</t></section>  </section><section title="Transfer with Referred-By">   <t>In the previous examples, the Transfer Target does not have definitive information about what party initiated the transfer, or, in some cases, even that transfer is taking place.  The <xref target="RFC3892">Referred-By mechanism</xref> provides a way for the Transferor to provide the Transferee with a way to let the Transfer Target know what party initiated the transfer.</t><t>The simplest and least secure approach just involves the inclusion of the Referred-By header field in the REFER which is then copied into the triggered INVITE.  However, a more secure mechanism involving the Referred-By security token which is generated and signed by the Transferor and passed in a message body to the Transferee then to the Transfer Target. </t><t>The call flow would be identical to Figure 7.  However, the REFER and triggered INVITE messages for this flow showing the Referred-By mechanism are shown below.  </t><t>Note that the conventions used in the <xref target="RFC4475">SIP Torture Test Messages</xref> document are reused, specifically the &lt;hex&gt; and &lt;allOneLine&gt; tags.</t> <figure><artwork><![CDATA[F5 REFER Transferor -> TransfereeREFER sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha SIP/2.0Via: SIP/2.0/TLS pc33.atlanta.example.com;branch=z9hG4bK392039842Max-Forwards: 70To: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>From: <sips:transferor@atlanta.example.com>;tag=1928301774Call-ID: a84b4c76e66710CSeq: 314160 REFER<allOneLine>Refer-To: <sips:482n4z24kdg@chicago.example.com;gr=8594958?Replaces=090459243588173445%3Bto-tag%3D9m2n3wq%3Bfrom-tag%3D763231&Require=replaces></allOneLine>Supported: gruu, replaces, tdialogRequire: tdialogReferred-By: <sips:transferor@atlanta.example.com>  ;cid="20398823.2UWQFN309shb3@atlanta.example.com"Target-Dialog: 592435881734450904;local-tag=9m2n3wq;remote-tag=763231Contact: <sips:4889445d8kjtk3@atlanta.example.com;gr=723jd2d>Content-Type: multipart/mixed; boundary=unique-boundary-1Content-Length: 3267--unique-boundary-1Content-ID: <20398823.2UWQFN309shb3@atlanta.example.com>Content-Length: 2961Content-Type: multipart/signed;              protocol="application/pkcs-7-signature";              micalg=sha1;              boundary="----590F24D439B31E08745DEF0CD9397189"------590F24D439B31E08745DEF0CD9397189Content-Type: message/sipfragDate: Thu, 18 Sep 2003 13:07:43 GMT<allOneLine>Refer-To: <sips:482n4z24kdg@chicago.example.com;gr=8594958?Replaces=090459243588173445%3Bto-tag%3D9m2n3wq%3Bfrom-tag%3D763231&Require=replaces></allOneLine>Referred-By: <sips:transferor@atlanta.example.com>  ;cid="20398823.2UWQFN309shb3@atlanta.example.com"------590F24D439B31E08745DEF0CD9397189Content-Type: application/pkcs-7-signature; name="smime.p7s"Content-Transfer-Encoding: binaryContent-Disposition: attachment; filename="smime.p7s"<hex>3082088806092A864886F70D010702A082087930820875020101310B300906052B0E03021A0500300B06092A864886F70D010701A082067A30820339308202A2A00302010202080090008902240001300D06092A864886F70D01010505003070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479301E170D3033313032313134343332355A170D3133313031383134343332355A3062310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A13057369706974311B30190603550403141273656E646572406578616D706C652E6F726730819F300D06092A864886F70D010101050003818D0030818902818100CB8302060F12C8FA2D1786922CA173DCEB80BF1B1B8AF74A310C6975A556A7630FB6E044D9E994DCD49AFF7976C462D7A8E74ECBF98723AEBF2796EDDD6263577C6C2B77DC7C300B533DEDB5FB8EB3827FD6FC9B37B9A0DE829F1B1081D632A8AD9FB00A860928E88F87E0B979BA65294AC7D6D2D18A78C86B4FA733874E230203010001A381E93081E6301D0603551D1104163014811273656E646572406578616D706C652E6F726730090603551D1304023000301D0603551D0E0416041440FF1C0C1BB8684CA917839D70E97DF8DD5B60D130819A0603551D2304819230818F80146B461714EA94762580546E1354DAA1E35414A1B6A174A4723070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479820100300D06092A864886F70D0101050500038181006FFE1A3B5CE807C3DD2CFDF6E9787F491C84DBF7DCD11DB2D6A8887D2FE3F22E9C6894994282E50AA0DFFE1CBD4EC2C20217831FC2AD360FF1C0DE1DE1E870102CFA99EE504C7DC0D8752A63294AC748DDDEFADE55C6D051F1CD54CFE7C153278962A53CEF61B875C1FD3C74E972242CBA0131B3B8C607BF95B378212CA9A75E30820339308202A2A00302010202080090008902240001300D06092A864886F70D01010505003070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479301E170D3033313032313134343332355A170D3133313031383134343332355A3062310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A13057369706974311B30190603550403141273656E646572406578616D706C652E6F726730819F300D06092A864886F70D010101050003818D0030818902818100CB8302060F12C8FA2D1786922CA173DCEB80BF1B1B8AF74A310C6975A556A7630FB6E044D9E994DCD49AFF7976C462D7A8E74ECBF98723AEBF2796EDDD6263577C6C2B77DC7C300B533DEDB5FB8EB3827FD6FC9B37B9A0DE829F1B1081D632A8AD9FB00A860928E88F87E0B979BA65294AC7D6D2D18A78C86B4FA733874E230203010001A381E93081E6301D0603551D1104163014811273656E646572406578616D706C652E6F726730090603551D1304023000301D0603551D0E0416041440FF1C0C1BB8684CA917839D70E97DF8DD5B60D130819A0603551D2304819230818F80146B461714EA94762580546E1354DAA1E35414A1B6A174A4723070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479820100300D06092A864886F70D0101050500038181006FFE1A3B5CE807C3DD2CFDF6E9787F491C84DBF7DCD11DB2D6A8887D2FE3F22E9C6894994282E50AA0DFFE1CBD4EC2C20217831FC2AD360FF1C0DE1DE1E870102CFA99EE504C7DC0D8752A63294AC748DDDEFADE55C6D051F1CD54CFE7C153278962A53CEF61B875C1FD3C74E972242CBA0131B3B8C607BF95B378212CA9A75E318201D6308201D2020101307C3070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F7269747902080090008902240001300906052B0E03021A0500A081B1301806092A864886F70D010903310B06092A864886F70D010701301C06092A864886F70D010905310F170D3034303132363139313831345A302306092A864886F70D01090431160414408CCA5772916A968204FD24CC24EDAEAD394395305206092A864886F70D01090F31453043300A06082A864886F70D0307300E06082A864886F70D030202020080300D06082A864886F70D0302020140300706052B0E030207300D06082A864886F70D0302020128300D06092A864886F70D01010105000481807795329BB23B8BB9F72526AB9CC22D93B9A37A2E69A0171D3CC417DD394F0A5FD4F8B082733CD9F2E26F6991031F7FF2EAD31640718502FB4C822771211E6228C793DA4DBBA2159227C221030FE9088CD659578EB8625680878E63D306487A740A197A3970594CF47DD385643B1DC49FF767A3D2B42838896679089AAD95767F</hex>------590F24D439B31E08745DEF0CD9397189----unique_boundary-1F6 INVITE Transferee -> Transfer TargetINVITE sips:482n4z24kdg@chicago.example.com;gr=8594958 SIP/2.0Via: SIP/2.0/TLS referee.example;branch=z9hG4bKffe209934aacTo: <sips:482n4z24kdg@chicago.example.com;gr=8594958>From: <sips:transferee@biloxi.example.com>;tag=2909034023Call-ID: fe9023940-a3465@referee.exampleCSeq: 889823409 INVITEMax-Forwards: 70Contact: <sips:3ld812adkjw@biloxi.example.com;gr=3413kj2ha>Referred-By: <sips:transferor@atlanta.example.com>    ;cid="20398823.2UWQFN309shb3@atlanta.example.com"Replaces:090459243588173445;to-tag=9m2n3wq;from-  tag=76323Require: replacesSupported: gruu, replaces, tdialogContent-Type: multipart/mixed; boundary=my-boundary-9Content-Length: 3432--my-boundary-9Content-Type: application/sdpContent-Length: 156v=0o=referee 2890844526 2890844526 IN IP4 referee.examples=Session SDPc=IN IP4 referee.examplet=0 0m=audio 49172 RTP/AVP 0a=rtpmap:0 PCMU/8000--my-boundary-9Content-Length: 2961Content-Type: multipart/signed;              protocol="application/pkcs-7-signature";              micalg=sha1;              boundary="----590F24D439B31E08745DEF0CD9397189"------590F24D439B31E08745DEF0CD9397189Content-Type: message/sipfragDate: Thu, 18 Sep 2003 13:07:43 GMT<allOneLine>Refer-To: <sips:transfertarget@chicago.example.com;Replaces=090459243588173445%3Bto-tag%3D9m2n3wq%3Bfrom-tag%3D763231&Require=replaces></allOneLine>Referred-By: <sips:transferor@atlanta.example.com>  ;cid="20398823.2UWQFN309shb3@atlanta.example.com"------590F24D439B31E08745DEF0CD9397189Content-Type: application/pkcs-7-signature; name="smime.p7s"Content-Transfer-Encoding: binaryContent-Disposition: attachment; filename="smime.p7s"<hex>3082088806092A864886F70D010702A082087930820875020101310B300906052B0E03021A0500300B06092A864886F70D010701A082067A30820339308202A2A00302010202080090008902240001300D06092A864886F70D01010505003070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479301E170D3033313032313134343332355A170D3133313031383134343332355A3062310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A13057369706974311B30190603550403141273656E646572406578616D706C652E6F726730819F300D06092A864886F70D010101050003818D0030818902818100CB8302060F12C8FA2D1786922CA173DCEB80BF1B1B8AF74A310C6975A556A7630FB6E044D9E994DCD49AFF7976C462D7A8E74ECBF98723AEBF2796EDDD6263577C6C2B77DC7C300B533DEDB5FB8EB3827FD6FC9B37B9A0DE829F1B1081D632A8AD9FB00A860928E88F87E0B979BA65294AC7D6D2D18A78C86B4FA733874E230203010001A381E93081E6301D0603551D1104163014811273656E646572406578616D706C652E6F726730090603551D1304023000301D0603551D0E0416041440FF1C0C1BB8684CA917839D70E97DF8DD5B60D130819A0603551D2304819230818F80146B461714EA94762580546E1354DAA1E35414A1B6A174A4723070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479820100300D06092A864886F70D0101050500038181006FFE1A3B5CE807C3DD2CFDF6E9787F491C84DBF7DCD11DB2D6A8887D2FE3F22E9C6894994282E50AA0DFFE1CBD4EC2C20217831FC2AD360FF1C0DE1DE1E870102CFA99EE504C7DC0D8752A63294AC748DDDEFADE55C6D051F1CD54CFE7C153278962A53CEF61B875C1FD3C74E972242CBA0131B3B8C607BF95B378212CA9A75E30820339308202A2A00302010202080090008902240001300D06092A864886F70D01010505003070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479301E170D3033313032313134343332355A170D3133313031383134343332355A3062310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A13057369706974311B30190603550403141273656E646572406578616D706C652E6F726730819F300D06092A864886F70D010101050003818D0030818902818100CB8302060F12C8FA2D1786922CA173DCEB80BF1B1B8AF74A310C6975A556A7630FB6E044D9E994DCD49AFF7976C462D7A8E74ECBF98723AEBF2796EDDD6263577C6C2B77DC7C300B533DEDB5FB8EB3827FD6FC9B37B9A0DE829F1B1081D632A8AD9FB00A860928E88F87E0B979BA65294AC7D6D2D18A78C86B4FA733874E230203010001A381E93081E6301D0603551D1104163014811273656E646572406578616D706C652E6F726730090603551D1304023000301D0603551D0E0416041440FF1C0C1BB8684CA917839D70E97DF8DD5B60D130819A0603551D2304819230818F80146B461714EA94762580546E1354DAA1E35414A1B6A174A4723070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F72697479820100300D06092A864886F70D0101050500038181006FFE1A3B5CE807C3DD2CFDF6E9787F491C84DBF7DCD11DB2D6A8887D2FE3F22E9C6894994282E50AA0DFFE1CBD4EC2C20217831FC2AD360FF1C0DE1DE1E870102CFA99EE504C7DC0D8752A63294AC748DDDEFADE55C6D051F1CD54CFE7C153278962A53CEF61B875C1FD3C74E972242CBA0131B3B8C607BF95B378212CA9A75E318201D6308201D2020101307C3070310B3009060355040613025553311330110603550408130A43616C69666F726E69613111300F0603550407130853616E4A6F7365310E300C060355040A1305736970697431293027060355040B135369706974546573744365727469666963617465417574686F7269747902080090008902240001300906052B0E03021A0500A081B1301806092A864886F70D010903310B06092A864886F70D010701301C06092A864886F70D010905310F170D3034303132363139313831345A302306092A864886F70D01090431160414408CCA5772916A968204FD24CC24EDAEAD394395305206092A864886F70D01090F31453043300A06082A864886F70D0307300E06082A864886F70D030202020080300D06082A864886F70D0302020140300706052B0E030207300D06082A864886F70D0302020128300D06092A864886F70D01010105000481807795329BB23B8BB9F72526AB9CC22D93B9A37A2E69A0171D3CC417DD394F0A5FD4F8B082733CD9F2E26F6991031F7FF2EAD31640718502FB4C822771211E6228C793DA4DBBA2159227C221030FE9088CD659578EB8625680878E63D306487A740A197A3970594CF47DD385643B1DC49FF767A3D2B42838896679089AAD95767F</hex>------590F24D439B31E08745DEF0CD9397189----my-boundary-9--]]></artwork></figure></section><section title="Transfer as an Ad-Hoc Conference"><t>In this flow, shown in Figure 16, Bob does an attended transfer of Alice to Carol.  In order to keep both Alice and Carol fully informed of the nature and state of the transfer operation, Bob acts as a focus<xref target="RFC4579" />  and hosts an ad-hoc conference involving Alice, Bob, and Carol.  Alice and Carol subscribe to the conference package<xref target="RFC4575"/>  of Bob's focus, which allows them to know the exact status of the operation.  After the transfer operation is complete, Bob deletes the conference.</t><t>This call flow meets requirement 6 of Section 3.  NOTIFY messages related to the refer package are indicated as NOTIFY (refer), while NOTIFYs related to the Conference Info package are indicated as NOTIFY (Conf-Info).</t><t>Note that any type of semi-attended transfer in which media mixing or relaying could be implemented using this model.  In addition to simply mixing, the focus could introduce additional media signals such as simulated ring tone or on hold announcements to improve the user experience.</t><figure><artwork><![CDATA[ Alice                  Bob                 Carol    |                    |                    |    | INVITE             |                    |    |------------------->|                    |    |   180 Ringing      |                    |    |<-------------------|                    |    |     200 OK         |                    |    |<-------------------|                    |    |        ACK         |                    |    |------------------->|                    |    |        RTP         |                    |    |<==================>|                    |    |                    |                    | Bob places Alice on hold and begins acting like a focus    |                    |                    |    | INVITE (hold) Contact:Conf-ID;isfocus   |    |<-------------------|                    |    |    200 OK          |                    |    |------------------->|                    |                        |        ACK         |                    |                        |<-------------------|                    |                        |                    |                    |                        | Alice subscribes to the conference package                        |                    |                    |                        | SUBSCRIBE sip:Conf-ID                   |                        |------------------->|                    |                          |     200 OK         |                    |                        |<-------------------|                    |                        | NOTIFY (Conf-Info) |                    |                        |<-------------------|                    |                        |     200 OK         |                    |                        |------------------->|                    |                        |                    |                    |                        |       Bob begins consultation operation |                        |                    |                    |                        |INVITE Require:replaces Contact:Conf-ID;isfocus         |                    |------------------->|    |                    |   180 Ringing      |    |                    |<-------------------|    |                    |     200 OK         |     |                    |<-------------------|    |                    |       ACK          |    |                    |------------------->|    |                    |        RTP         |            |                    |<==================>|    |                    |                    |     |Carol subscribes to the conference package      |                - learns Bob is on hold  |    |                    |                    |                        |                    |SUBSCRIBE sip:Conf-ID              |                    |<-------------------|    |                    |      200 OK        |    |                    |------------------->|    |                    | NOTIFY (Conf-Info) |       |                    |------------------->|    |                    |      200 OK        |    |                    |<-------------------|    |                    |                    |                        | Alice learns that Bob is talking to Carol                                            |                    |                    |                 | NOTIFY (Conf-Info) |                    |                        |<-------------------|                    |                        |     200 OK         |                    |                        |------------------->|                    |                        |                    |  INVITE (hold)     |            |                    |------------------->|    |                    |      200 OK        |     |                    |<-------------------|    |                    |      ACK           |    |                    |------------------->|    |                    |                    |                        | Alice learns that Carol is now on hold  |                                            |                    |                    |                 | NOTIFY (Conf-Info) |                    |                        |<-------------------|                    |                        |     200 OK         |                    |                        |------------------->|                    |                        |                    |                    |                        |           Bob begins transfer operation |                        |                    |                    |                        |     REFER Refer-To: Carol               |      |<-------------------|                    |    |     202 Accepted   |                    |    |------------------->|                    |    | NOTIFY (Refer)     |                    |                        |------------------->|                    |                        |     200 OK         |                    |                        |<-------------------|                    |                        |  INVITE Replaces:B-C Contact:Alice      |    |---------------------------------------->|    |                 200 OK                  |     |<----------------------------------------|    |                   ACK                   |    |---------------------------------------->|    |                    RTP                  |    |<=======================================>|      |                    |       BYE          |    |                    |<-------------------|    |                    |      200 OK        |    |                    |------------------->|    | NOTIFY (Refer)     |                    |                        |------------------->|                    |                        |     200 OK         |                    |                        |<-------------------|                    |                        |                    |                    |                        | Bob terminates the ad-hoc conference    |                                            |                    |                    |                        |       BYE          |                    |                        |<-------------------|                    |                        |     200 OK         |                    |                        |------------------->|                    |                        |                    | NOTIFY (Conf-Info) |          |                    |------------------->|    |                    |      200 OK        |    |                    |<-------------------|    | NOTIFY (Conf-Info) |                    |                        |<-------------------|                    |                        |     200 OK         |                    |                        |------------------->|                    |                    Figure 16. Attended Transfer as an Ad-Hoc Conference.]]></artwork></figure><figure><artwork><![CDATA[]]></artwork></figure></section> <section title="Transfer with multiple parties">   <t>   In this example shown in Figure 17, the Originator places call to the Facilitator who    reaches the Recipient through the Screener. The Recipient's contact    information is exposed to the Facilitator and the Originator. This    example is provided for clarification of the semantics of the REFER    method only and should not be used as the design of an      implementation.   </t><figure><artwork><![CDATA[     Originator   Facilitator   Screener   Recipient     |            |            |          |  1  |INVITE/200 OK/ACK        |          |"Get Fred for me!"     |----------->|            |          |     "Right away!"  2  |INVITE (hold)/200 OK/ACK |          |     |<-----------|            |          |  2  |            |INVITE/200 OK/ACK      |"I have a call     |            |----------->|          |from Mary for Fred"  2  |            |INVITE (hold)/200 OK/ACK   "Hold please"     |            |<-----------|          |  3  |            |            |INVITE/200 OK/ACK     |            |            |--------->|"You have a call     |            |            |          |from Mary"     |            |            |          |  "Put her through"  3  |            |            |INVITE (hold)/200 OK/ACK     |            |            |--------->|  4  |            |REFER       |          |     |            |<-----------|          |  4  |            |202 Accepted|          |     |            |----------->|          |  4  |            |NOTIFY (100 Trying)    |      |            |----------->|          |              4  |            |200 OK      |          |     |            |<-----------|          |  5  |            |INVITE/200 OK/ACK      |     |            |---------------------->|"This is Fred"  4  |            |NOTIFY (200 OK)        |  "Please hold for     |            |----------->|          |              Mary"  4  |            |200 OK      |          |     |            |<-----------|          |  2  |            |BYE/200 OK  |          |     |            |<-----------|          |  3  |            |            |BYE/200 OK|     |            |            |--------->|  5  |            |INVITE (hold)/200 OK/ACK     |            |---------------------->|  6  |REFER       |            |          |     |<-----------|            |          |  6  |202 Accepted|            |          |     |----------->|            |          |  6  |NOTIFY (100 Trying)      |          |        |----------->|            |          |  6  |200 OK      |            |          |     |<-----------|            |          | 7  |INVITE/200 OK/ACK        |          |     |----------------------------------->| "Hey Fred"  6  |NOTIFY (200 OK)          |          |    "Hello Mary"     |----------->|            |          |  6  |200 OK      |            |          |     |<-----------|            |          | 1  |BYE/200 OK  |            |          |     |<-----------|            |          |  5  |            |BYE/200 OK  |          |     |            |---------------------->|  7  |BYE/200 OK  |            |          |     |<-----------------------------------| "See you later" ]]></artwork></figure><t> Figure 17. Transfer with Multiple Parties Example.</t> </section><section title="Gateway Transfer Issues">   <t>   A gateway in SIP acts as a User Agent.  As a result, the entire preceding   discussion and call flows apply equally well to gateways as native SIP    endpoints.  However, there are some gateway specific issues that are    documented in this section. While this discussion focuses on the common cases    involving PSTN gateways, similar situations exist for other gateways, such as    H.323/SIP gateways.</t><section title="Coerce Gateway Hairpins to the Same Gateway"><t>   To illustrate how a hairpin situation can occur in transfer, consider   this example.  The original call dialog is setup with the transferee   residing on the PSTN side of a SIP gateway.  The transferor is a SIP   phone purely in the IP space.  The transfer target is on the PSTN side   of a SIP gateway as well.  After completing the transfer, (regardless   of consultative or blind) the transferee is in a call with the   transfer target (both on the PSTN side of a gateway).  It is often   desirable to remove the gateway(s) out of the loop.  This is likely   to only be possible if both legs of the target call are on the same   gateway.  With both legs on the same gateway, it may be able to   invoke the analogous transfer on the PSTN side.  Then the target call   would not involve the gateway.</t><t>   So the problem is how to give the proxy enough information so that it   knows to route the call to the same gateway.  With a simple single   call that hairpins, the incoming and outgoing leg have the same   dialog.  The proxy should have enough information to optimize the   routing.</t><t>   In the consultative transfer scenario, it is desirable to coerce the   consultative INVITE out the same gateway as the original call to be   transferred.  However there is no way to relate the consultation with   the original call.  In the consultative case the target call INVITE   includes the Replaces header which contains dialog information that   can be used to relate it to the consultation.  However there is no   information that relates the target call to the original.</t><t>   In the blind transfer scenario, it is desirable to coerce the target   call onto the same gateway as the original call.  However the same   problem exists in that the target dialog cannot be related to the   original dialog.</t><t>   In either transfer scenario, it may be desirable to push the transfer   operation onto the non-SIP side of the gateway.  Presumably this is   not possible unless all of the legs go out the same gateway.  If the   gateway supports more than one truck group, it might also be   necessary to get all of the legs on the same trunk group in order to   perform the transfer on the non-SIP side of the gateway.</t><t>   Solutions to these gateway specific issues may involve new extensions   to SIP in the future.</t></section><section title="Consultative Turned Blind Gateway Glare"><t>   In the consultative transfer case turned blind, there is a glare-like   problem.  The transferor initiates the consultation INVITE, the transferor   gets impatient and hangs up, transitioning this to a blind transfer.   The transfer target on the gateway (connected through a PSTN switch to   a single line or dumb analog phone) rings.  The user answers the   phone just after the CANCEL is received by the transfer target.  The   REFER and INVITE for the target call are sent.  The transferee   attempts to setup the call on the PSTN side, but gets either a busy or   lands in the users voicemail as the user has the handset in hand and   off hook.</t><t>   This is another example of a race condition that this call flow can cause.   The recommended behavior is to use the approach described in Section 6.6.</t></section></section><section title="IANA Considerations"><t>None.</t></section><section title="Security Considerations"><t>The call transfer flows shown in this document are implemented using the REFER and Replaces call control primitives in SIP.  As such, the security considerations detailed in the REFER <xref target="RFC3515"/>  and Replaces <xref target="RFC3891"/> documents MUST be followed, which are briefly summarized in the following paragraphs.  This document addresses the issue of protecting the Address of Record URI of a transfer target in Sections 7.1 and 7.2.</t><t>Any REFER request must be appropriately authenticated and authorized using standard SIP mechanisms or calls may be hijacked.  A user agent may use local policy or human intervention in deciding whether or not to accept a REFER.  In generating NOTIFY responses based on the outcome of the triggered request, care should be taken in constructing the message/sipfrag body to ensure that no private information is leaked.</t><t>An INVITE containing a Replaces header field should only be accepted if it has been properly authenticated and authorized using standard SIP mechanisms, and the requestor is authorized to perform dialog replacement.  </t></section><section title="Acknowledgments">  <t>  This draft is a collaborative product of the SIP working group. Thanks  to Rohan Mahy for his input on the use of Replaces in transfer.   </t></section></middle><back><references title="Normative References"><?rfc include="reference.RFC.2119" ?><?rfc include="reference.RFC.3261" ?><?rfc include="reference.RFC.3515" ?><?rfc include="reference.RFC.3891" ?><?rfc include="reference.RFC.3892" ?><?rfc include="reference.RFC.4538" ?></references><references title="Informative References"><?rfc include="reference.I-D.ietf-sipping-cc-framework" ?><?rfc include="reference.I-D.ietf-sip-gruu" ?><?rfc include="reference.RFC.4475" ?><?rfc include="reference.RFC.4353" ?><?rfc include="reference.RFC.4579" ?><?rfc include="reference.RFC.4575" ?><?rfc include="reference.I-D.ietf-sipping-dialogusage" ?></references></back></rfc>