RFC 5359

Session Initiation Protocol Service Examples

๐Ÿ“… published October 2008, from ietf

RFC 5359: Session Initiation Protocol Service Examples ๐Ÿ’–

Okay bestie, let's get the title block sorted first ๐ŸŽ€

  • Number: RFC 5359, which is also BCP 144 ๐ŸŒธ
  • Stream: Network Working Group
  • Category: Best Current Practice
  • Date: October 2008 ๐Ÿ“…
  • Authors: A. Johnston (Ed.) from Avaya, R. Sparks from Tekelec, C. Cunningham and S. Donovan from Cisco Systems, and K. Summers from Sonus โœจ
  • Obsoletes / Updates: The title block doesn't have either field, so this doc doesn't list anything it obsoletes or updates ๐Ÿคทโ€โ™€๏ธ

Status of This Memo

This document is a Best Current Practice for the Internet Community, and it's asking for discussion and suggestions to make it better ๐Ÿซถ Distribution of this memo is unlimited, so share away!

Abstract ๐Ÿฆ‹

Okay so this doc is full of examples of Session Initiation Protocol (SIP) services, which is giving "how phones talk to each other on the internet" energy ๐Ÿ“ž It covers most of the features you'd find in so-called IP Centrex offerings from local exchange carriers, plus PBX (Private Branch Exchange) features ๐Ÿข

Most of the services here are built into the SIP user agents, though some need help from a SIP proxy ๐Ÿ’… A few also need extensions to SIP, like the REFER, SUBSCRIBE, and NOTIFY methods, plus the Replaces and Join header fields. These features are NOT meant to be a complete list though! They're more like a showcase of common features you'd probably see on SIP IP telephones in a business environment ๐Ÿ’ผโœจ

Table of Contents ๐Ÿ“–

   1. Overview ........................................................3
      1.1. Legend for Message Flows ...................................4
   2. Service Examples ................................................6
      2.1. Call Hold ..................................................6
      2.2. Consultation Hold .........................................19
      2.3. Music on Hold .............................................38
      2.4. Transfer - Unattended .....................................50
      2.5. Transfer - Attended .......................................58
      2.6. Transfer - Instant Messaging ..............................71
      2.7. Call Forwarding Unconditional .............................77
      2.8. Call Forwarding - Busy ....................................84
      2.9. Call Forwarding - No Answer ...............................92
      2.10. 3-Way Conference - Third Party Is Added .................101
      2.11. 3-Way Conference - Third Party Joins ....................107
      2.12. Find-Me .................................................113
      2.13. Call Management (Incoming Call Screening) ...............125
      2.14. Call Management (Outgoing Call Screening) ...............132
      2.15. Call Park ...............................................135
      2.16. Call Pickup .............................................147
      2.17. Automatic Redial ........................................154
      2.18. Click to Dial ...........................................163
   3. Security Considerations .......................................166
   4. Acknowledgements ..............................................166
   5. References ....................................................167
      5.1. Normative References .....................................167
      5.2. Informative References ...................................168

1. Overview โœจ

This doc shows example call flows for a SIP implementation of these traditional telephony services ๐Ÿ“ฑ

        Call Hold                        3-Way Conference
        Consultation Hold                Find-Me
        Music on Hold                    Incoming Call Screening
        Unattended Transfer              Outgoing Call Screening
        Attended Transfer                Call Park
        Instant Messaging Transfer       Call Pickup
        Unconditional Call Forwarding    Automatic Redial
        Call Forwarding on Busy          Click to Dial
        Call Forwarding on No Answer

Heads up: the Single Line Extension call flow got cut from this doc and will be covered in a separate document ๐Ÿ™ˆ

The call flows here were developed while designing a SIP IP communications network ๐ŸŒ They're an example set of so-called IP Centrex services or PBX services, so you can see how it all fits together ๐Ÿงฉ

The authors hope this doc is useful for SIP implementers, designers, and protocol researchers alike ๐Ÿงš It's meant to help push forward a standard implementation of RFC 3261 [RFC3261] and some of its extensions ๐Ÿ’œ

These flows are carefully checked, working group reviewed scenarios of SIP service examples. They're a companion to the specs, not a replacement ๐ŸŽ€

These call flows are based on the current version 2.0 of SIP in RFC 3261 [RFC3261], with Session Description Protocol (SDP) usage described in RFC 3264 [RFC3264]. Other RFCs also form part of the SIP standard and get used and referenced in these flows too ๐Ÿ“š

Real talk: the SIP spec and the other referenced docs are the definitive source on protocol issues ๐Ÿ‘‘ These flows also aren't the only way to build these services. Other approaches exist, like 3pcc (Third Party Call Control) [RFC3725] or Back-to-Back User Agents (B2BUAs), and this spec doesn't rule those out ๐Ÿฆ‹ The peer-to-peer design and principles behind these service examples are described in the Multiparty Framework document [FRAMEWORK] ๐ŸŒˆ

These flows assume the functionality described in the SIP Call Flow Examples document [RFC3665], which explores basic SIP behavior ๐Ÿ” Some scenarios here use the SIP method extension REFER [RFC3515], the SIP header extension Replaces [RFC3891], and the SIP header extension Join [RFC3911] ๐Ÿ’… The SIP Events document [RFC3265] describes how SUBSCRIBE and NOTIFY work, and the SIP Dialog Event Package document [RFC4235] describes the dialog event package ๐Ÿ“ฌ A few examples also use the GRUU (Globally Routable User Agent URI) extension [GRUU] ๐ŸŒธ

These flows assume a network of proxies, registrars, and other SIP servers ๐Ÿ–ฅ๏ธ Secure SIP URIs (sips) show up all over the place, which implies TLS transport on each hop with assumed certificate validation. Other security approaches can be used too ๐Ÿ” Some examples show Digest authentication as well ๐Ÿ™ˆ

The big focus here is the SIP signaling exchange ๐Ÿ“ก So only very simple SDP offer/answer exchanges are shown, with audio media. These flows work just as well for other media and multimedia sessions ๐ŸŽถ If you want more advanced SDP offer/answer examples, check out [RFC4317] ๐Ÿซถ

Each call flow comes with a textual description of the scenario, a message flow diagram showing the messages exchanged between separate network elements, and the detailed contents of each message in that diagram โœจ

For simplicity when reading and editing, some examples differ from actual SIP messages. For instance, the HTTP Digest responses are NOT actual MD5 encodings ๐Ÿ™ƒ Call-IDs get repeated a lot, and CSeq counts often start at 1. Header fields are usually shown in the same order, and usually only the minimum required header field set is shown. Message body content lengths often aren't calculated and show up as ... where the real octet count would go ๐Ÿงฎ

1.1. Legend for Message Flows ๐Ÿ—๏ธ

Dashed lines (---) represent control messages that are mandatory to the call scenario. These control messages can be SIP signaling ๐Ÿ“จ

Double dashed lines (===) represent media paths between network elements ๐ŸŽง

Messages with parentheses around the name are optional control messages ๐Ÿ™‹โ€โ™€๏ธ

Messages are labeled F1, F2, and so on in the figures. Those labels point to the message details in the table that follows each figure ๐Ÿ“‹

Lines longer than 72 characters use the <allOneLine> convention defined in Section 2.1 of RFC 4475 [RFC4475] ๐Ÿ“

Comments in the message details look like this:

/* Comments. */

2. Service Examples ๐ŸŽ€

2.1. Call Hold ๐Ÿ’–

            Alice           Proxy            Bob
             |    INVITE F1   |              |
             |--------------->|              |
             |                |   INVITE F2  |
             |(100 Trying) F3 |------------->|
             |<---------------|              |
             |                |180 Ringing F4|
             | 180 Ringing F5 |<-------------|
             |<---------------|              |
             |                |  200 OK F6   |
             |    200 OK F7   |<-------------|
             |<---------------|              |
             |     ACK F8     |              |
             |--------------->|    ACK F9    |
             |                |------------->|
             |    Both way RTP Established   |
             |<=============================>|
             |                |INVITE(hold) F10
             |INVITE(hold) F11|<-------------|
             |<---------------|              |
             |    200 OK F12  |              |
             |--------------->|   200 OK F13 |
             |                |------------->|
             |                |     ACK F14  |
             |     ACK F15    |<-------------|
             |<---------------|              |
             |           No RTP Sent!        |
             |                |  INVITE F16  |
             |   INVITE F17   |<-------------|
             |<---------------|              |
             |   200 OK F18   |              |
             |--------------->|  200 OK F19  |
             |                |------------->|
             |                |    ACK F20   |
             |     ACK F21    |<-------------|
             |<---------------|              |
             |    Both way RTP Established   |
             |<=============================>|
             |     BYE F22    |              |
             |--------------->|   BYE F23    |
             |                |------------->|
             |                |   200 OK F24 |
             |    200 OK F25  |<-------------|
             |<---------------|              |

Okay so in this scenario, Alice calls Bob, then Bob puts the call on hold ๐Ÿ“ž Bob then takes it off hold, and then Alice hangs up ๐Ÿ‘‹ Hold is unidirectional in nature, lowkey tricky to wrap your head around ๐Ÿคฏ But a UA that puts the other party on hold will generally also stop sending media, so there's no media exchange between the UAs at all ๐Ÿ™…โ€โ™€๏ธ Older UAs might set the connection address to 0.0.0.0 when starting hold. That behavior has been deprecated, though ๐Ÿ’€ Now you use the a=inactive SDP attribute if no media is sent, or the a=sendonly attribute if media is still being sent โœจ

Also, the rendering feature tag from RFC 4235 [RFC4235] shows up in F10 and F11. It tells you Bob's UA is no longer rendering media to Bob, i.e., that Bob placed the call on hold ๐Ÿซ 

Message Details ๐Ÿ“

   F1 INVITE Alice -> Proxy 1

Okay bestie, the first message here is Alice's INVITE going to the proxy, and it's giving full call-setup energy ๐Ÿ“žโœจ

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 INVITE Proxy 1 -> Bob ๐Ÿ’Œ

Proxy 1 is basically the bouncer ๐Ÿ’… It takes Alice's invite, adds its own Via on top, and passes it along to Bob. Notice how the Max-Forwards goes from 70 down to 69, that's the proxy just counting its hops, iconic ๐Ÿงฎ

INVITE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061

 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F3 (100 Trying) Proxy 1 -> Alice ๐Ÿ™Œ

Proxy 1 says "hold on, I got this" and sends a 100 Trying back so Alice knows her call isn't just vibing into the void ๐Ÿซถ

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F4 180 Ringing Bob -> Proxy 1 ๐Ÿ””

Bob's phone is ringing ๐Ÿ“ฑ and he sends back a 180 with his own tag, 314159, which is basically his name tag at the party ๐ŸŽ€

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content Length:0

F5 180 Ringing Proxy 1 -> Alice ๐ŸŽถ

The proxy passes the ringing news back to Alice, with the Via header that's left after it peels its own off ๐Ÿงƒ

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content Length: 0

F6 200 OK Bob -> Proxy 1 ๐Ÿฅณ

Bob picks up! ๐Ÿ“ž The 200 OK carries his SDP, which describes his audio, so both sides know where to send the media ๐Ÿ’–

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F7 200 OK Proxy 1 -> Alice ๐Ÿ’ซ

The proxy forwards Bob's 200 OK to Alice, and the call is officially connected, literally the moment โœจ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F8 ACK Alice -> Proxy 1 ๐Ÿค

Alice sends the ACK to confirm she got the 200 OK. Notice she uses the Route header now, which is the proxy doing its job ๐Ÿฆ‹

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf92
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F9 ACK Proxy 1 -> Bob ๐ŸŒธ

The proxy forwards the ACK to Bob, and now the call is fully set up and everyone is in the loop ๐Ÿ”ฅ

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837492.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061

 ;branch=z9hG4bK74bf92
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

Now for the hold drama ๐Ÿ™ˆ Bob is putting Alice on hold, and watch the version number in the o= field go up, that's how everyone knows the session changed.

/* Bob places Alice on hold.  Note that the version is
   incremented in the o= field of the SDP. */

F10 INVITE Bob -> Proxy 1 โธ๏ธ

Bob sends a fresh INVITE with a=sendonly in the SDP and his +sip.rendering="no" tag, so the hold is officially on ๐Ÿ“ด

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F11 INVITE Proxy 1 -> Alice ๐Ÿ“จ

The proxy passes the hold invite along to Alice, same story, new Via on top ๐Ÿ’…

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061

 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F12 200 OK Alice -> Proxy 1 ๐Ÿซก

Alice says "yup, hold it is" with a 200 OK. Her SDP flips to a=recvonly, so the two sides match up ๐ŸŽ€

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844527 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F13 200 OK Proxy 1 -> Bob ๐Ÿ’Œ

The proxy forwards Alice's 200 OK to Bob, and the hold is acknowledged ๐Ÿงš

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844527 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F14 ACK Bob -> Proxy 1 ๐Ÿค

Bob ACKs the hold, and the proxy hands the ACK on to Alice ๐ŸŒˆ

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds72
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F15 ACK Proxy 1 -> Alice ๐Ÿฆ‹

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds72
 ;received=192.0.2.105
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

Hold is over, Bob is back ๐ŸŽ‰ Watch the CSeq jump to 2 and the o= version go up again, that's how the update gets tracked.

/* Bob takes the call off hold. */

F16 INVITE Bob -> Proxy 1 ๐Ÿ™Œ

Bob sends a new INVITE with CSeq 2 and no sendonly line, so Alice gets the call back ๐Ÿ“ž๐Ÿ’–

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds73
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 2 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844529 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F17 INVITE Proxy 1 -> Alice ๐Ÿ‘‘

The proxy passes the un-hold invite on to Alice, and the call is back on, bestie! ๐ŸŒˆ

2.2. Consultation Hold โœจ

Okay, this one is a whole drama ๐Ÿฟ Alice calls Bob, and Bob puts her on hold ๐Ÿซถ Then Bob calls Carol, hangs up with Carol, and takes Alice back off hold. The call only ends when Alice hangs up. ๐Ÿ’€

     Alice            Proxy           Bob                Carol
       |                |              |                   |
       |    INVITE F1   |              |                   |
       |--------------->|   INVITE F2  |                   |
       |                |------------->|                   |
       |(100 Trying) F3 |              |                   |
       |<---------------|180 Ringing F4|                   |
       |                |<-------------|                   |
       | 180 Ringing F5 |              |                   |
       |<---------------|  200 OK F6   |                   |
       |                |<-------------|                   |
       |    200 OK F7   |              |                   |
       |<---------------|              |                   |
       |     ACK F8     |              |                   |
       |--------------->|     ACK F9   |                   |
       |                |------------->|                   |
       |     Both way RTP Established  |                   |
       |<=============================>|                   |
       |                |INVITE(hold) F10                  |
       |INVITE(hold) F11|<-------------|                   |
       |<---------------|              |                   |
       |    200 OK F12  |              |                   |
       |--------------->|   200 OK F13 |                   |
       |                |------------->|                   |
       |                |     ACK F14  |                   |
       |                |<-------------|                   |
       |    ACK F15     |              |                   |
       |<---------------|              |                   |
       |         No RTP Sent!          |                   |
       |                |   INVITE F16 |                   |
       |                |<-------------|                   |
       |                |              |    INVITE F17     |
       |                |--------------------------------->|
       |                |(100 Trying) F18                  |
       |                |------------->|                   |
       |                |              | 180 Ringing F19   |
       |                |<---------------------------------|
       |                | 180 Ringing F20                  |
       |                |------------->|                   |
       |                |              |    200 OK F21     |
       |                |<---------------------------------|
       |                |   200 OK F22 |                   |
       |                |------------->|                   |
       |                |    ACK F23   |                   |
       |                |<-------------|                   |
       |                |              |      ACK F24      |
       |                |--------------------------------->|
       |                |         Both way RTP Established |
       |                |              |<=================>|
       |                |   BYE F25    |                   |
       |                |<-------------|                   |
       |                |              |       BYE F26     |
       |                |--------------------------------->|
       |                |              |    200 OK F27     |
       |                |<---------------------------------|
       |                |   200 OK F28 |                   |
       |                |------------->|                   |
       |                |   INVITE F29 |                   |
       |    INVITE F30  |<-------------|                   |
       |<---------------|              |                   |
       |    200 OK F31  |              |                   |
       |--------------->|   200 OK F32 |                   |
       |                |------------->|                   |
       |                |     ACK F33  |                   |
       |                |<-------------|                   |
       |    ACK F34     |              |                   |
       |<---------------|              |                   |
       |     Both way RTP Established  |                   |
       |<=============================>|                   |
       |    BYE F35     |              |                   |
       |--------------->|    BYE F36   |                   |
       |                |------------->|                   |
       |                |   200 OK F37 |                   |
       |                |<-------------|                   |
       |  200 OK F38    |              |                   |
       |<---------------|              |                   |
       |                |              |                   |

Here's the vibe: Alice calls Bob, Bob puts her on hold, Bob calls Carol, Bob drops Carol, and then Bob takes Alice off hold. Alice is the last one to hang up. โœจ

Also, peep the rendering feature tag from RFC 4235 [RFC4235] in F10. It's how Bob's UA says "nope, I'm not rendering media to Bob anymore," which means Bob has put the call on hold ๐Ÿ™ˆ

Message Details ๐Ÿ’–

F1 INVITE Alice -> Proxy 1

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 INVITE Proxy 1 -> Bob ๐ŸŽ€

INVITE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F3 (100 Trying) Proxy 1 -> Alice โœจ

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F4 180 Ringing Bob -> Proxy 1 ๐Ÿ””

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content Length:0

F5 180 Ringing Proxy 1 -> Alice ๐Ÿ’–

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content Length: 0

F6 200 OK Bob -> Proxy 1 ๐Ÿฅณ

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F7 200 OK Proxy 1 -> Alice ๐ŸŒธ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F8 ACK Alice -> Proxy 1 ๐Ÿซถ

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf45
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F9 ACK Proxy 1 -> Bob ๐Ÿฆ‹

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837494.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf45
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

Okay, the call is officially connected, bestie ๐ŸŽ‰ Now Bob puts Alice on hold, and it's giving drama ๐Ÿ™ˆ

/* Bob places Alice on hold. */

F10 INVITE Bob -> Proxy 1 ๐Ÿ’œ

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F11 INVITE Proxy 1 -> Alice ๐Ÿ“

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837497.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F12 200 OK Alice -> Proxy 1 ๐Ÿ’…

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837497.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844527 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F13 200 OK Proxy 1 -> Bob ๐Ÿ‘‘

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844527 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F14 ACK Bob -> Proxy 1 โœจ

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashdsg
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F15 ACK Proxy 1 -> Alice ๐Ÿงš

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK8374.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashdsg
 ;received=192.0.2.105
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F16 INVITE Bob -> Proxy 1 ๐ŸŒˆ

INVITE sips:carol@chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds22
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844834 2890844834 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 50170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F17 INVITE Proxy 1 -> Carol ๐Ÿ’ซ

INVITE sips:carol@client.chicago.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749a.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds22
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844834 2890844834 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 50170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F18 (100 Trying) Proxy 1 -> Bob ๐Ÿฆ‹

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds22
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 INVITE
Content-Length: 0

Okay bestie, so Carol's phone starts ringing ๐Ÿ“žโœจ and the 180 Ringing messages come rolling back through the proxies like little notifications ๐Ÿ’Œ. Let's see how it all lines up ๐Ÿฆ‹

F19 180 Ringing Carol -> Proxy 1

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749a.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds22
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:carol@client.chicago.example.com>
Content Length:0

F20 180 Ringing Proxy 1 -> Bob

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds22
 ;received=client.chicago.example.com
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 INVITE
Contact: <sips:carol@client.chicago.example.com>
Content Length: 0

F21 200 OK Carol -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749a.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds22
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 INVITE
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890844922 2890844922 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

Carol picks up, so she sends the 200 OK with her SDP offer and answer details ๐ŸŽ€

F22 200 OK Proxy 1 -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds22
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 INVITE
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890844922 2890844922 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F23 ACK Bob -> Proxy 1

ACK sips:carol@client.chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds24
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F24 ACK Proxy 1 -> Carol

ACK sips:carol@client.chicago.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749b.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds24
 ;received=192.0.2.105
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

And now the call is officially connected, so the ACKs are the little "we're good" high-fives ๐Ÿ™Œ๐Ÿ’–

Next up, Bob hangs up, and the BYE goes through the proxy ๐Ÿ’…

F25 BYE Bob -> Proxy 1

BYE sips:carol@client.chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7j
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 2 BYE
Content-Length: 0

F26 BYE Proxy 1 -> Carol

BYE sips:carol@client.chicago.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749k.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7j
 ;received=192.0.2.105
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 2 BYE
Content-Length: 0

F27 200 OK Carol -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749k.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7j
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 2 BYE
Content-Length: 0

F28 200 OK Proxy 1 -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7j
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=456654
Call-ID: 9876543210@biloxi.example.com
CSeq: 2 BYE
Content-Length: 0

Bob's call with Carol is wrapped up ๐ŸŒธ Now he's back on with Alice, so the next messages are for taking the call off hold ๐Ÿฆ‹

/* Bob takes the call off hold. */

F29 INVITE Bob -> Proxy 1

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7b
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844529 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F30 INVITE Proxy 1 -> Alice

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749q.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7b
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844529 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F31 200 OK Alice -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749q.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7b
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844528 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F32 200 OK Proxy 1 -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7b
 ;received=192.0.2.105
Record-Route: <sips:ss1.example.com;lr>
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844528 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F33 ACK Bob -> Proxy 1

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7d7
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F34 ACK Proxy 1 -> Alice

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK8374.1
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7d7
 ;received=192.0.2.105
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

Bob and Alice are back in the same call, and the flow closes out with Alice hanging up ๐Ÿ’œ

F35 BYE Alice -> Proxy 1

BYE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf10
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F36 BYE Proxy 1 -> Bob

BYE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK8379.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf10
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F37 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK8379.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf10
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F38 200 OK Proxy 1 -> Alice

      SIP/2.0 200 OK
      Via: SIP/2.0/TLS client.atlanta.example.com:5061
       ;branch=z9hG4bK74bf10
       ;received=192.0.2.103
      From: Alice <sips:alice@atlanta.example.com>;tag=1234567
      To: Bob <sips:bob@biloxi.example.com>;tag=314159
      Call-ID: 12345600@atlanta.example.com
      CSeq: 2 BYE
      Content-Length: 0

2.3. Music on Hold ๐ŸŽ€

           Alice             Bob       Music Server
             |                |              |
             |    INVITE F1   |              |
             |--------------->|              |
             | 180 Ringing F2 |              |
             |<---------------|              |
             |    200 OK F3   |              |
             |<---------------|              |
             |     ACK F4     |              |
             |--------------->|              |
             |       RTP      |              |
             |<==============>|              |
             |                |              |
             |   Bob places Alice on hold    |
             |                |              |
             | INVITE (hold) F5              |
             |<---------------|              |
             |    200 OK F6   |              |
             |--------------->|              |
             |     ACK F7     |              |
             |<---------------|              |
             |    no RTP      |              |
             |                |              |
             |  Bob initiates music on hold  |
             |                |              |
             |                |   REFER Refer-To: A F8
             |                |------------->|
             |                |    202 F9    |
             |                |<-------------|
             |                |   NOTIFY F10 |
             |                |<-------------|
             |                |    200 F11   |
             |                |------------->|
             |  INVITE F12 Replaces: B       |
             |<------------------------------|
             |          200 OK F13           |
             |------------------------------>|
             |           ACK F14             |
             |<------------------------------|
             |           RTP Music           |
             |<==============================|
             |     BYE F15    |              |
             |--------------->|  NOTIFY F17  |
             |  200 OK F16    |<-------------|
             |<---------------|  200 OK F18  |
             |                |------------->|
             |                |              |
             | The music on hold is complete |
             |                |              |
             |    Bob takes Alice off hold   |
             |                |              |
             |  INVITE Replaces: M F19       |
             |<---------------|              |
             |    200 OK F20  |              |
             |--------------->|              |
             |     ACK F21    |              |
             |<---------------|              |
             |       RTP      |              |
             |<==============>|              |
             |            BYE F22            |
             |------------------------------>|
             |          200 OK F23           |
             |<------------------------------|

Okay so in this flow, Bob puts Alice on hold with music ๐ŸŽถ Bob sends a REFER to a Music Server, and that server sends an INVITE with Replaces over to Alice. Then the Music Server streams RTP music to Alice, and when Bob is ready to pick her back up, he sends an INVITE with Replaces to Alice. The whole vibe is very "I'll be right back" but make it aesthetic ๐ŸŒธ

Note the rendering feature tag from [RFC4235] that shows up in F5. It tells everyone that Bob's UA is no longer rendering media to Bob, which is just a fancy way of saying he's placed the call on hold ๐Ÿซถ Feature tags also show up in F12, where the automaton feature tag (from [RFC3840]) and the byeless feature tags (from [RFC4235]) describe what the Music Server can do. Iconic behaviour from the feature tags, honestly ๐Ÿ’…

If Alice doesn't want music on hold, her UA can refuse F12. She'll stay on hold with Bob, just in silence ๐Ÿคซ

Message Details โœจ

F1 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 180 Ringing Bob -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F3 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 ACK Alice -> Bob

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfd
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

/* Bob places Alice on hold. */

F5 INVITE Bob -> Alice

INVITE sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK874bk
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
From: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 712 INVITE
Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F6 200 OK Alice -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK874bk
 ;received=192.0.2.105
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
From: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 712 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844527 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F7 ACK Bob -> Alice

ACK sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKq874b
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
From: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 712 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

/* Bob REFERs Music Server to establish session with Alice which replaces the established session between Alice and Bob. */

F8 REFER Bob -> Music Server

REFER sips:music@server.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds9

Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=02134
To: Music Server <sips:music@server.example.com>
Call-ID: 4802029847@biloxi.example.com
CSeq: 1 REFER
<allOneLine>
  Refer-To: <sips:a8342043f@atlanta.example.com;gr?Replaces=
  12345600%40atlanta.example.com%3Bfrom-tag%3D23431
  %3Bto-tag%3D1234567&Require=replaces>
</allOneLine>
Referred-By: <sips:bob@biloxi.example.com>
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F9 202 Accepted Music Server -> Bob

SIP/2.0 202 Accepted
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds9
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=02134
To: Music Server <sips:music@server.example.com>;tag=56323
Call-ID: 4802029847@biloxi.example.com
Contact: <sips:music@server.example.com>
CSeq: 1 REFER
Content-Length: 0

F10 NOTIFY Music Server -> Bob

NOTIFY sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK74bT6
To: Bob <sips:bob@biloxi.example.com>;tag=02134
Max-Forwards: 70
From: Music Server <sips:music@server.example.com>;tag=56323
Call-ID: 4802029847@biloxi.example.com
CSeq: 1 NOTIFY
Event: refer
Subscription-State: active;expires=60
Contact: <sips:music@server.example.com>
Content-Type: message/sipfrag
Content-Length: ...

SIP/2.0 100 Trying

F11 200 OK Bob -> Music Server

SIP/2.0 200 OK
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK74bT6
 ;received=192.0.2.103
To: Bob <sips:bob@biloxi.example.com>;tag=02134
From: Music Server <sips:music@server.example.com>;tag=56323
Call-ID: 4802029847@biloxi.example.com
CSeq: 1 NOTIFY
Content-Length: 0

/* Music Server places call to Alice to replace session between Alice and Bob. */

F12 INVITE Music Server -> Alice

INVITE sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK74rf
Max-Forwards: 70
From: <sips:music@server.example.com>;tag=0111
To: <sips:a8342043f@atlanta.example.com;gr>
Call-ID: a5-75-34-12-76@server.example.com
CSeq: 1 INVITE
Referred-By: <sips:bob@biloxi.example.com>
Contact: <sips:music@server.example.com>;automaton
 ;+sip.byeless;+sip.rendering="no"
Require: replaces
Replaces: 12345600@atlanta.example.com
 ;from-tag=23431;to-tag=1234567
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=MusicServer 2890844576 2890844576 IN IP4 server.example.com
s=
c=IN IP4 server.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F13 200 OK Alice -> Music Server

2.4. Transfer - Unattended โœจ

SIP/2.0 200 OK
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK74rf
 ;received=192.0.2.103
From: <sips:music@server.example.com>;tag=0111
To: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
Call-ID: a5-75-34-12-76@server.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F14 ACK Music Server -> Alice

ACK sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK7rfF
Max-Forwards: 70
From: <sips:music@server.example.com>;tag=0111
To: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
Call-ID: a5-75-34-12-76@server.example.com
CSeq: 1 ACK
Content-Length: 0

F15 BYE Alice -> Bob

BYE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F16 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0


/* Music Server reports success back to Bob by returning
   a 200 OK response.  Bob obtains the dialog identifiers
   from the headers included in the response. */

F17 NOTIFY Music Server -> Bob

NOTIFY sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK74bf9
To: Bob <sips:bob@biloxi.example.com>;tag=02134
Max-Forwards: 70
From: Music Server <sips:music@server.example.com>;tag=56323
Call-ID: 4802029847@biloxi.example.com
CSeq: 2 NOTIFY
Event: refer
Subscription-State: terminated;reason=noresource
Contact: <sips:music@server.example.com>
Content-Type: message/sipfrag
Content-Length: ...

SIP/2.0 200 OK
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK74rf
 ;received=192.0.2.103
From: <sips:music@server.example.com>;tag=0111
To: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
Call-ID: a5-75-34-12-76@server.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>

F18 200 OK Bob -> Music Server

SIP/2.0 200 OK
Via: SIP/2.0/TLS server.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
To: Bob <sips:bob@biloxi.example.com>;tag=02134
From: Music Server <sips:music@server.example.com>;tag=56323
Call-ID: 4802029847@biloxi.example.com
CSeq: 2 NOTIFY
Content-Length: 0


/* Alice is now parked at the Music Server. */

/* Bob picks up the call by sending an INVITE to Alice, who
   replaces the existing session with the Music Server. */

F19 INVITE Bob -> Alice

INVITE sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK74bf9
From: Bob <sips:bob@biloxi.example.com>;tag=4i323pr
To: Alice <sips:a8342043f@atlanta.example.com;gr>
Call-ID: uioewrjk2k2were
CSeq: 42121 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER,
 SUBSCRIBE, NOTIFY
Replaces: a5-75-34-12-76@server.example.com
 ;to-tag=098594;from-tag=0111
Contact: <sips:bob@client.biloxi.example.com>
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844631 2890844631 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3458 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendrecv

F20 200 OK Alice -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=4i323pr
To: Alice <sips:a8342043f@atlanta.example.com;gr>;tag=6654323
Call-ID: uioewrjk2k2were
CSeq: 42121 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER,
 SUBSCRIBE, NOTIFY
Contact: <sips:alice@client.atlanta.example.com>
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844576 2890844576 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendrecv

F21 200 ACK Bob -> Alice

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKj974bf9
From: Bob <sips:bob@biloxi.example.com>;tag=4i323pr
To: Alice <sips:a8342043f@atlanta.example.com;gr>;tag=6654323
Call-ID: uioewrjk2k2were
CSeq: 42121 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER,
 SUBSCRIBE, NOTIFY
Supported: replaces
Content-Length: 0

F22 BYE Alice -> Music Server

BYE sips:music@server.example.com SIP/2.0
Max-Forwards: 70
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74rf

To: <sips:music@server.example.com>;tag=0111
From: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
Call-ID: a5-75-34-12-76@server.example.com
CSeq: 15 BYE
Content-Length: 0

F23 200 OK Music Server -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74rf
 ;received=192.0.2.103
To: <sips:music@server.example.com>;tag=0111
From: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
Call-ID: a5-75-34-12-76@server.example.com
CSeq: 15 BYE
Content-Length: 0


/* Normal media session between Alice and Bob is resumed. */

Okay, so here's the unattended transfer, bestie ๐Ÿ“žโœจ. Bob calls Alice first, then Alice transfers Bob over to Carol, and then Alice hangs up on Bob. Bob sets up the session with Carol and reports the win back to Alice in the NOTIFY in F15 ๐ŸŽ‰. And if the transfer flops? No stress ๐Ÿ’…. Bob can just send a fresh INVITE back to Alice to get the session going again ๐Ÿ”.

Even though Alice sends that BYE in F9, the dialog between Alice and Bob is still hanging around until the subscription from the REFER finishes up ๐Ÿงš. That happens either when a NOTIFY carries the Subscription-State: terminated;reason=noresource header field (like F15) or when a 481 response comes back to a NOTIFY ๐Ÿ’€. Iconic, right? ๐Ÿฆ‹

For more tea on call transfer, check out the transfer document [TRANSFER] ๐ŸŒธ.

          Alice                 Bob                 Carol
            |      INVITE F1     |                    |
            |<-------------------|                    |
            |   180 Ringing F2   |                    |
            |------------------->|                    |
            |      200 OK F3     |                    |
            |------------------->|                    |
            |        ACK F4      |                    |
            |<-------------------|                    |
            |        RTP         |                    |
            |<==================>|                    |
            |                    |                    |
            |  Alice performs unattended transfer     |
            |                    |                    |
            | REFER Refer-To:C F5|                    |
            |------------------->|                    |
            |  202 Accepted F6   |                    |
            |<-------------------|                    |
            |      NOTIFY F7     |                    |
            |<-------------------|                    |
            |      200 OK F8     |                    |
            |------------------->|                    |
            |       BYE F9       |                    |
            |------------------->|                    |
            |     200 OK F10     |                    |
            |<-------------------|                    |
            |   No RTP Session   | INVITE Referred-By: A F11
            |                    |------------------->|
            |                    |   180 Ringing F12  |
            |                    |<-------------------|
            |                    |     200 OK F13     |
            |                    |<-------------------|
            |                    |       ACK F14      |
            |                    |------------------->|
            |                    |        RTP         |
            |                    |<==================>|
            |      NOTIFY F15    |                    |
            |<-------------------|                    |
            |      200 OK F16    |                    |
            |------------------->|                    |
            |                    |                    |

Message Details ๐Ÿ’Œ

F1 INVITE Bob -> Alice

INVITE sips:alice@atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 180 Ringing Alice -> Bob

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Content-Length: 0

F3 200 OK Alice -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 ACK Bob -> Alice

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds2
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0


/* Session is established between Alice and Bob. */
/* Alice performs unattended transfer of Bob to Carol. */

F5 REFER Alice -> Bob ๐ŸŽ€

REFER sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds8
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 101 REFER
Refer-To: <sips:carol@chicago.example.com>
Referred-By: <alice@atlanta.example.com>
Contact: <sips:alice@client.atlanta.example.com>
Content-Length: 0

F6 202 Accepted Bob -> Alice โœจ

SIP/2.0 202 Accepted
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds8
 ;received=192.0.2.105
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
Contact: <sips:bob@client.biloxi.example.com>
CSeq: 101 REFER
Content-Length: 0

F7 NOTIFY Bob -> Alice ๐Ÿฆ‹

NOTIFY sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds32
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 2 NOTIFY
Event: refer
Subscription-State: active;expires=60
Contact: <sips:bob@client.biloxi.example.com>
Content-Type: message/sipfrag
Content-Length: ...

SIP/2.0 100 Trying

F8 200 OK Alice -> Bob ๐ŸŒธ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds32
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 2 NOTIFY
Content-Length: 0


/* Alice now disconnects with Bob. */

F9 BYE Alice -> Bob ๐Ÿ’…

BYE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds43
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 102 BYE
Content-Length: 0

F10 200 OK Bob -> Alice ๐Ÿซถ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds43
 ;received=192.0.2.105
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 102 BYE
Content-Length: 0

/* Bob attempts the transfer to Carol. */

F11 INVITE Bob -> Carol ๐Ÿงš

INVITE sips:carol@chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds1
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>
Call-ID: 7436222@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Referred-By: <alice@atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844539 2890844539 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3458 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F12 180 Ringing Carol -> Bob ๐Ÿ“

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds1
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=928287
Call-ID: 7436222@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:carol@client.chicago.example.com>
Content-Length: 0

F13 200 OK Carol -> Bob ๐Ÿ‘‘

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds1
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=928287
Call-ID: 7436222@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890944542 2890844542 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F14 ACK Bob -> Carol ๐ŸŒˆ

ACK sips:carol@client.chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds9
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=928287
Call-ID: 7436222@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0


/* Bob and Carol now have established a session.  Bob reports
   success to Alice, which Alice probably ignores. */

F15 NOTIFY Bob -> Alice ๐Ÿ’–

NOTIFY sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds67
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 3 NOTIFY
Event: refer
Subscription-State: terminated;reason=noresource
Contact: <sips:bob@client.biloxi.example.com>
Content-Type: message/sipfrag
Content-Length: ...

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds1
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=928287
Call-ID: 7436222@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:carol@client.chicago.example.com>
Content-Type: application/sdp
Content-Length: ...

F16 200 OK Alice -> Bob โญ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds6
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=314159
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345601@atlanta.example.com
CSeq: 3 NOTIFY
Content-Length: 0

2.5. Transfer - Attended ๐Ÿฆ‹โœจ

     Alice             Bob          Carol
       |                |              |
       |    INVITE F1   |              |
       |--------------->|              |
       | 180 Ringing F2 |              |
       |<---------------|              |
       |    200 OK F3   |              |
       |<---------------|              |
       |     ACK F4     |              |
       |--------------->|              |
       |       RTP      |              |
       |<==============>|              |
       |INVITE (hold) F5|              |
       |<---------------|              |
       |    200 OK F6   |              |
       |--------------->|              |
       |     ACK F7     |              |
       |<---------------|              |
       |     No RTP     |              |
       |                |  INVITE F8   |
       |                |------------->|
       |                | 180 Ringing F9
       |                |<-------------|
       |                |  200 OK F10  |
       |                |<-------------|
       |                |    ACK F11   |
       |                |------------->|
       |                |     RTP      |
       |                |<============>|
       |                |INVITE (hold) F12
       |                |------------->|
       |                | 200 OK F13   |
       |                |<-------------|
       |                |    ACK F14   |
       |                |------------->|
       |                |     No RTP   |
       | REFER Refer-To: C F15         |
       |<---------------|              |
       |202 Accepted F16|              |
       |--------------->|              |
       |   NOTIFY F17   |              |
       |--------------->|              |
       |   200 OK F18   |              |
       |<---------------|              |
       |     INVITE Replaces: B F19    |
       |------------------------------>|
       |            200 OK F20         |
       |<------------------------------|
       |             ACK F21          |
       |------------------------------>|
       |               RTP             |
       |<=============================>|
       |                |    BYE F22   |
       |                |<-------------|
       |                |  200 OK F23  |
       |                |------------->|
       |   NOTIFY F24   |              |
       |--------------->|              |
       |   200 OK F25   |              |
       |<---------------|              |
       |    BYE F26     |              |
       |<---------------|              |
       |   200 OK F27   |              |
       |--------------->|              |

Okay so in this scenario, Alice calls Bob ๐Ÿ“ž Bob puts Alice on hold, then calls Carol to announce the transfer, and then puts Carol on hold too ๐Ÿซฃ Next, Bob transfers Alice to Carol, and that replaces the session between Bob and Carol ๐Ÿ’… Carol then disconnects her session with Bob. Alice reports the transfer as a success to Bob, and Bob hangs up with Alice. Bob is the one who slips the Replaces header field [RFC3891] into the Refer-To URI here, and the Refer-To URI is the Contact URI Carol gave back in the 200 OK response F10. That makes sure only the correct instance of Carol gets reached, which is so important ๐Ÿ™ˆ

The gr URI parameter in the Contact URI in message F10 tells you the Contact URI is a GRUU [GRUU] and is globally routable outside of the dialog โœจ But if you don't know the Contact URI is a gruu, Bob has to be prepared for the triggered INVITE to fail. If it does, he should retry the REFER with a Refer-To URI that's the URI he used to reach Carol, but with a Require: replaces header escaped in the Refer-To header field, as the transfer document [TRANSFER] explains ๐Ÿง ๐Ÿ’œ

Message Details ๐ŸŽ€

F1 INVITE Alice -> Bob ๐ŸŒธ

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 180 Ringing Bob -> Alice ๐Ÿ”ฅ

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F3 200 OK Bob -> Alice ๐Ÿ’– Bob's line finally picks up, and this one is giving full "yes, I'm here" energy โœจ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 ACK Alice -> Bob ๐Ÿซถ Alice confirms, and now they're officially locked in ๐Ÿ”ฅ

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0
/* Alice and Bob have established a session.
   Bob puts Alice on hold. */

F5 INVITE Bob -> Alice ๐Ÿ™ˆ okay so Bob is putting Alice on hold, and the vibes are a little dramatic ๐Ÿ’…

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 INVITE
Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
Content-Type: application/sdp
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F6 200 OK Alice -> Bob ๐ŸŒธ Alice says yes to the hold request ๐Ÿงš

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844527 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F7 ACK Bob -> Alice ๐Ÿฆ‹ Bob acknowledges, and the hold is locked in

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds3
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 ACK
Content-Length: 0
/* Bob calls Carol. */

F8 INVITE Bob -> Carol ๐Ÿ“ Bob has a second call going, so he's multitasking like a boss ๐Ÿ‘‘

INVITE sips:carol@chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 28908445834 2890844834 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3458 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F9 180 Ringing Carol -> Bob ๐ŸŽ€ Carol's phone is ringing, so it's giving "pick up, babe" ๐Ÿ“ž

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 INVITE
Contact: <sips:39itp34klkd@chicago.example.com>
Content-Length: 0

F10 200 OK Carol -> Bob โญ Carol picks up, and Bob and Carol are connected

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 INVITE
Contact: <sips:39itp34klkd@chicago.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890844922 2890844922 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 ACK Bob -> Carol ๐Ÿ’… Bob confirms the connection with Carol

ACK sips:39itp34klkd@chicago.example.com;gr SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashd5
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 ACK
Content-Length: 0
/* Bob puts Carol on hold. */

F12 INVITE Bob -> Carol ๐Ÿฅบ and now Bob puts Carol on hold too, lowkey a lot of holding going on ๐Ÿ™ˆ

INVITE sips:39itp34klkd@chicago.example.com;gr SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds0
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 43 INVITE
Contact: <sips:bob@client.biloxi.example.com>;+sip.rendering="no"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 289084834 2890844835 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3458 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=sendonly

F13 200 OK Carol -> Bob ๐ŸŒˆ Carol says yes to being put on hold

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds0
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 43 INVITE
Contact: <sips:39itp34klkd@chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890844922 2890844923 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=recvonly

F14 ACK Bob -> Carol ๐Ÿงš Bob acknowledges, and Carol is officially on hold

ACK sips:39itp34klkd@chicago.example.com;gr SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash334
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 43 ACK
Content-Length: 0
/* Bob transfers Alice to Carol. */

F15 REFER Bob -> Alice ๐Ÿ‘‘ Main character move: Bob transfers Alice over to Carol ๐Ÿฆ‹

REFER sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds2g
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1025 REFER
<allOneLine>
  Refer-To: <sips:39itp34klkd@chicago.example.com?Replaces=
  sdjfdjfskdf%40biloxi.example.com%3Bto-tag%3D5f35a3
  %3Bfrom-tag%3D8675309&Require=replaces>
</allOneLine>
Referred-By: <sips:bob@biloxi.example.com>
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F16 202 Accepted Alice -> Bob ๐Ÿ’œ Alice accepts the referral request

SIP/2.0 202 Accepted
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds2g
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
Contact: <sips:alice@client.atlanta.example.com>
CSeq: 1025 REFER
Content-Length: 0

F17 NOTIFY Alice -> Bob ๐Ÿ”ฅ Alice keeps Bob posted on how the transfer is going

NOTIFY sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfK
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 2 NOTIFY
Contact: <sips:alice@client.atlanta.example.com>
Event: refer
Subscription-State: active;expires=60
Content-Type: message/sipfrag
Content-Length: ...

SIP/2.0 100 Trying

F18 200 OK Bob -> Alice โœ… Bob confirms the NOTIFY

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfK
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 2 NOTIFY
Content-Length: 0
/* Alice establishes session with Carol, which replaces the
   session between Bob and Carol. */

F19 INVITE Alice -> Carol ๐ŸŽ€ Alice calls Carol, and this new session swaps out the Bob-and-Carol one ๐Ÿฆ‹

INVITE sips:39itp34klkd@chicago.example.com;gr SIP/2.0
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKadfe4ko
To: Carol <sips:39itp34klkd@chicago.example.com>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=3461
Call-ID: 9435674543@atlanta.example.com
CSeq: 1 INVITE
Require: replaces
Referred-By: <sips:bob@biloxi.example.com>
Replaces: sdjfdjfskdf@biloxi.example.com
 ;to-tag=5f35a3;from-tag=8675309
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844989 2890844989 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 3458 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F20 200 OK Carol -> Alice ๐Ÿซถ Carol says yes, and Alice and Carol are connected, iykyk ๐ŸŒธ

SIP/2.0 200 OK
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKadfe4ko
 ;received=192.0.2.103
To: Carol <sips:39itp34klkd@chicago.example.com>;tag=ff3a
From: Alice <sips:alice@atlanta.example.com>;tag=3461
Call-ID: 9435674543@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:39itp34klkd@chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

okay so the SDP bit is the last of the media details ๐ŸŽ€ Here's the rest of the transfer, and it's giving drama ๐Ÿ’…

v=0
o=carol 2890844221 2890844221 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F21 ACK Alice -> Carol โœจ

ACK sips:39itp34klkd@chicago.example.com;gr SIP/2.0
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKadfe4kU3
To: Carol <sips:39itp34klkd@chicago.example.com>;tag=ff3a
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=3461
Call-ID: 9435674543@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

Next up, Carol is literally leaving the call with Bob. ๐Ÿ™ˆ

/* Carol then disconnects from Bob. */

F22 BYE Carol -> Bob ๐Ÿ‘‹

BYE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfE
To: Bob <sips:bob@biloxi.example.com>;tag=8675309
Max-Forwards: 70
From: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 1 BYE
Content-Length: 0

F23 200 OK Bob -> Carol ๐Ÿฆ‹

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfE
 ;received=192.0.2.123
To: Bob <sips:bob@biloxi.example.com>;tag=8675309
From: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 1 BYE
Content-Length: 0

Now Alice tells Bob the transfer worked. Main character energy ๐Ÿ‘‘

/* Alice tells Bob that the call has been
   successfully transferred. */

F24 NOTIFY Alice -> Bob ๐Ÿ”ฅ

NOTIFY sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf2N
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 3 NOTIFY
Event: refer
Subscription-State: terminated;reason=noresource
Contact: <sips:alice@client.atlanta.example.com>
Content-Type: message/sipfrag
Content-Length: ...

SIP/2.0 200 OK
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKadfe4ko
 ;received=192.0.2.103
To: Carol <sips:39itp34klkd@chicago.example.com>;tag=ff3a
From: Alice <sips:alice@atlanta.example.com>;tag=3461
Call-ID: 9435674543@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:39itp34klkd@chicago.example.com>

F25 200 OK Bob -> Alice ๐Ÿ’–

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 3 NOTIFY
Content-Length: 0

and then it's bye bye for Bob and Alice too ๐Ÿฅฒ

/* Bob disconnects with Alice. */

F26 BYE Bob -> Alice ๐Ÿงš

BYE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7P
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1026 BYE
Content-Length: 0

F27 200 OK Alice -> Bob ๐ŸŒˆ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7P
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1026 BYE
Content-Length: 0

2.6. Transfer - Instant Messaging โœจ

okay so this one is giving group chat drama ๐Ÿ’… Alice and Bob are on a call, and Bob wants Carol to take it over. So he slides into Carol's DMs with an Instant Message ๐Ÿ’Œ containing Alice's URI and an embedded Replaces header field. If Carol clicks the URI, her SIP UA sends an INVITE to Alice, and that INVITE replaces the session with Bob. iconic behaviour, no notes ๐Ÿ‘‘

This scenario uses the SIP MESSAGE [RFC3428] method to pass the URI around. ngl, any other IM protocol or method could have done that job just as well ๐Ÿฆ‹

            Alice          Bob                Carol
             |              |                   |
             |   INVITE F1  |                   |
             |------------->|                   |
             | 180 Ringing F2                   |
             |<-------------|                   |
             |  200 OK F3   |                   |
             |<-------------|                   |
             |    ACK F4    |                   |
             |------------->|                   |
             |  Both way RTP Established        |
             |<============>|                   |
             |              |     MESSAGE F5    |
             |              |------------------>|
             |              |     200 OK F6     |
             |              |<------------------|
             |              |                   |
             |       INVITE Replaces:A-B F7     |
             |<---------------------------------|
             |            200 OK F8             |
             |--------------------------------->|
             |               ACK F9             |
             |<---------------------------------|
             |   Both way RTP Established       |
             |<================================>|
             |    BYE F10   |                   |
             |------------->|                   |
             |  200 OK F11  |                   |
             |<-------------|                   |
             |                                  |

Message Details ๐ŸŽ€

Here's every message, step by step, so you can see exactly how the handoff happens ๐Ÿงš

F1 INVITE Alice -> Bob
INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
F2 180 Ringing Bob -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0
F3 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
Contact: <sips:bob@client.biloxi.example.com>
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
F4 ACK Alice -> Bob

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74r
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
CSeq: 1 ACK
Content-Length: 0

/* Bob IMs Carol. */
F5 MESSAGE Bob -> Carol

MESSAGE sips:carol@chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 MESSAGE
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE
Supported: replaces
Content-Type: text/html
Content-Length: ...

<HTML>Do you want to take this call from
<allOneLine>
  <A HREF="sips:a8342043f@atlanta.example.com;gr?Replaces=
  12345600@atlanta.example.com%3Bto-tag%3D3145678
  %3Bfrom-tag%3D1234567&Require=replaces">
  Alice</A>?
</allOneLine>
   </HTML>
F6 200 OK Carol -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=5f35a3
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 MESSAGE
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE
Supported: replaces
Content-Length: 0

/* Carol takes the call from Bob. */
F7 INVITE  Carol -> Alice

INVITE sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS pc.biloxi.example.com:5061
 ;branch=z9hG4bK74HH
Max-Forwards: 70
From: Carol <sips:carol@chicago.example.com>;tag=8675310
To: Alice <sips:a8342043f@atlanta.example.com;gr>
Call-ID: 563456212@b2.chicago.example.com
CSeq: 1 INVITE
Require: replaces
Replaces: 12345600@atlanta.example.com
 ;to-tag=3145678;from-tag=1234567
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890843122 2890843122 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 5342 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* Alice matches the dialog information in the
   Replaces header and accepts the INVITE. */
F8 200 OK Alice -> Carol

SIP/2.0 200 OK
Via: SIP/2.0/TLS pc.biloxi.example.com:5061
 ;branch=z9hG4bK74HH
 ;received=192.0.2.114
From: Carol <sips:carol@chicago.example.com>;tag=8675310
To: Alice <sips:a8342043f@atlanta.example.com;gr>;tag=131256
Call-ID: 563456212@b2.chicago.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 289084543 289084543 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
F9 ACK  Carol -> Alice

ACK sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS b2.biloxi.example.com:5061
 ;branch=z9hG4bK7435
Max-Forwards: 70
From: Carol <sips:carol@chicago.example.com>;tag=8675310
To: Alice <sips:a8342043f@atlanta.example.com;gr>;tag=131256
Call-ID: 563456212@b2.chicago.example.com
CSeq: 1 ACK
Content-Length: 0

/* RTP streams are established between Alice and Carol.
   Alice hangs up with Bob due to the Replaces header field. */
F10 BYE Alice -> Bob

BYE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0
F11 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq:  2 BYE
Content-Length: 0

2.7. Call Forwarding Unconditional โœจ

            Alice           Proxy          Gateway
             |                |              |
             |    INVITE F1   |              |
             |--------------->|              |
             |(100 Trying) F2 |              |
             |<---------------|              |
             | (181 Call Is Being Forwarded) F3
             |<---------------|   INVITE F4  |
             |                |------------->|
             |                |180 Ringing F5|
             | 180 Ringing F6 |<-------------|
             |<---------------|  200 OK F7   |
             |    200 OK F8   |<-------------|
             |<---------------|              |
             |     ACK F9     |              |
             |--------------->|    ACK F10   |
             |                |------------->|
             |    Both way RTP Established   |
             |<=============================>|
             |     BYE F11    |              |
             |--------------->|   BYE F12    |
             |                |------------->|
             |                |   200 OK F13 |
             |    200 OK F14  |<-------------|
             |<---------------|              |
             |                |              |

Okay so ๐Ÿซถ Bob wants every call forwarded to the PSTN (the regular phone network!), and the proxy server just sees that as another URI ๐Ÿ’…. Alice calls Bob. The proxy server rewrites the Request URI and forwards the INVITE to a Gateway. The messages behind the Gateway aren't shown here, so we're just focusing on the main flow ๐Ÿฆ‹

Note that the 181 Call is Being Forwarded response is shown as sent by the proxy. Technically, the proxy is acting like a user agent in this case, because a proxy can't generate non-100 provisional responses ๐Ÿค“

Also, forwarding could be done with a redirect (302 Moved Temporarily response) instead ๐Ÿงš

Message Details ๐ŸŽ€

F1 INVITE Alice -> Proxy

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 (100 Trying) Proxy -> Alice

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F3 (181 Call is Being Forwarded) Proxy -> Alice

SIP/2.0 181 Call is Being Forwarded
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=9214d
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0
/* Proxy forwards call by rewriting Request-URI. */

F4 INVITE Proxy -> Gateway

INVITE sips:+19727293660@gw1.example.com;user=phone SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F5 180 Ringing Gateway -> Proxy

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:+19727293660@gw1.example.com;user=phone>
Content Length:0

F6 180 Ringing Proxy -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:+19727293660@gw1.example.com;user=phone>
Content Length: 0

F7 200 OK Gateway -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:+19727293660@gw1.example.com;user=phone>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=GATEWAY1 2890844527 2890844527 IN IP4 gatewayone.example.com
s=
c=IN IP4 gatewayone.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F8 200 OK Proxy -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:+19727293660@gw1.example.com;user=phone>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=GATEWAY1 2890844527 2890844527 IN IP4 gatewayone.example.com
s=
c=IN IP4 gatewayone.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F9 ACK Alice -> Proxy

ACK sips:+19727293660@gw1.example.com;user=phone SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf31
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F10 ACK Proxy -> Gateway

ACK sips:+19727293660@gw1.example.com;user=phone SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749ws.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf31
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F11 BYE Alice -> Proxy

BYE sips:+19727293660@gw1.example.com;user=phone SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfJe
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F12 BYE Proxy -> Gateway

BYE sips:+19727293660@gw1.example.com;user=phone SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749G1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfJe
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F13 200 OK Gateway -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749G1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfJe
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F14 200 OK Proxy -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfJe
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345600@atlanta.example.com
CSeq:  2 BYE
Content-Length: 0

2.8. Call Forwarding - Busy

           Alice            Proxy          User B1             User B2
             |                |              |                   |
             |    INVITE F1   |              |                   |
             |--------------->|   INVITE F2  |                   |
             |                |------------->|                   |
             |(100 Trying) F3 |              |                   |
             |<---------------|  486 Busy F4 |                   |
             |                |<-------------|                   |
             |                |     ACK F5   |                   |
             |                |------------->|                   |
             |(181 Call is Being Forwarded) F6                   |
             |<---------------|              |    INVITE F7      |
             |                |--------------------------------->|
             |                |              | 180 Ringing F8    |
             |                |<---------------------------------|
             | 180 Ringing F9 |              |                   |
             |<---------------|              |      200 OK F10   |
             |                |<---------------------------------|
             |    200 OK F11  |              |                   |
             |<---------------|              |                   |
             |     ACK F12    |              |                   |
             |--------------->|              |     ACK F13       |
             |                |--------------------------------->|
             |               Both way RTP Established            |
             |<=================================================>|
             |    BYE F14     |              |                   |
             |--------------->|              |      BYE F15      |
             |                |--------------------------------->|
             |                |              |    200 OK F16     |
             |  200 OK F17    |<---------------------------------|
             |<---------------|              |                   |
             |                |              |                   |

Okay so picture this ๐Ÿ’…๐ŸŽ€ Bob wants his calls to B1 forwarded over to B2 whenever B1 is busy, and the proxy already knows this (it's giving very organised, no cap ๐Ÿงš). So Alice calls B1, B1 is busy, and the proxy server quietly places the call to B2 instead โœจ๐Ÿ’–

Message Details โœจ

F1 INVITE Alice -> Proxy

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 INVITE Proxy -> B1

INVITE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F3 (100 Trying) Proxy -> Alice

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F4 486 Busy Here B1 -> Proxy

SIP/2.0 486 Busy Here
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 ACK Proxy -> B1

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F6 (181 Call is Being Forwarded) Proxy -> Alice

SIP/2.0 181 Call is Being Forwarded
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103

From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=9214d
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

/* The proxy now forwards the call to B2. */

F7 INVITE Proxy -> B2

INVITE sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F8 180 Ringing B2 -> Proxy

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Content-Length: 0

F9 180 Ringing Proxy -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Content-Length: 0

F10 200 OK B2 -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client2.biloxi.example.com
s=
c=IN IP4 client2.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 200 OK Proxy -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client2.biloxi.example.com
s=
c=IN IP4 client2.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F12 ACK Alice -> Proxy

ACK sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfX
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F13 ACK Proxy -> B2

ACK sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83731
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfX
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

/* RTP streams are established between Alice and B2. */

/* Alice eventually hangs up with User B2. */

F14 BYE Alice -> Proxy

BYE sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bW4
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F15 BYE Proxy -> B2

BYE sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837493
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bW4
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F16 200 OK B2 -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837493
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061

 ;branch=z9hG4bK74bW4
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F17 200 OK Proxy -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bW4
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq:  2 BYE
Content-Length: 0

2.9. Call Forwarding - No Answer ๐Ÿ“žโœจ

okay bestie, this one is giving "the proxy has a backup plan and it's flawless" ๐Ÿ’…๐ŸŒธ. Bob wants calls to B1 forwarded to B2 if B1 doesn't pick up. The proxy already knows this, so it's not a secret ๐Ÿ™ˆ. Alice calls B1, nobody answers, and then the proxy quietly dials B2 instead. Iconic behaviour, honestly ๐Ÿ‘‘.

     Alice            Proxy         User B1             User B2
       |                |              |                   |
       |    INVITE F1   |              |                   |
       |--------------->|   INVITE F2  |                   |
       |(100 Trying) F3 |------------->|                   |
       |<---------------|180 Ringing F4|                   |
       | 180 Ringing F5 |<-------------|                   |
       |<---------------|              |                   |
       |                 Request Timeout                   |
       |                |              |                   |
       |                |   CANCEL F6  |                   |
       |                |------------->|                   |
       |                |   200 OK F7  |                   |
       |                |<-------------|                   |
       |                |     487 F8   |                   |
       |                |<-------------|                   |
       |                |     ACK F9   |                   |
       |                |------------->|                   |
       |(181 Call is Being Forwarded) F10                  |
       |<---------------|              |    INVITE F11     |
       |                |--------------------------------->|
       |                |              | 180 Ringing F12   |
       | 180 Ringing F13|<---------------------------------|
       |<---------------|              |      200 OK F14   |
       |                |<---------------------------------|
       |   200 OK F15   |              |                   |
       |<---------------|              |                   |
       |     ACK F16    |              |                   |
       |--------------->|              |     ACK F17       |
       |                |--------------------------------->|
       |               Both way RTP Established            |
       |<=================================================>|
       |    BYE F18     |              |                   |
       |--------------->|              |      BYE F19      |
       |                |--------------------------------->|
       |                |              |    200 OK F20     |
       |  200 OK F21    |<---------------------------------|
       |<---------------|              |                   |
       |                |              |                   |

Message Details

F1 INVITE Alice -> Proxy

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 INVITE Proxy -> B1

INVITE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F3 (100 Trying) Proxy -> Alice

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F4 180 Ringing B1 -> Proxy

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F5 180 Ringing Proxy -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

/* B1 rings until a configurable timer expires in the proxy.  The
   proxy sends Cancel and proceeds down the list of routes. */

F6 CANCEL Proxy -> B1

CANCEL sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 CANCEL
Content-Length: 0

F7 200 OK B1 -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=329d823
Call-ID: 12345600@atlanta.example.com
CSeq: 1 CANCEL
Content-Length: 0

F8 487 Request Terminated B1 -> Proxy

SIP/2.0 487 Request Terminated
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F9 ACK Proxy -> B1

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F10 (181 Call is Being Forwarded) Proxy -> Alice

SIP/2.0 181 Call is Being Forwarded
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=9214d
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F11 INVITE Proxy -> B2

INVITE sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F12 180 Ringing B2 -> Proxy

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Content-Length: 0

F13 180 Proxy -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Content-Length: 0

F14 200 OK B2 -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103

Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client2.biloxi.example.com
s=
c=IN IP4 client2.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F15 200 OK Proxy -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client2.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...
      v=0
      o=bob 2890844527 2890844527 IN IP4 client2.biloxi.example.com
      s=
      c=IN IP4 client2.biloxi.example.com
      t=0 0
      m=audio 3456 RTP/AVP 0
      a=rtpmap:0 PCMU/8000

F16 ACK Alice -> Proxy

ACK sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061

 ;branch=z9hG4bK74bf3
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F17 ACK Proxy -> B2

ACK sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK8374.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf3
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

/* RTP streams are established between Alice and B2.
   Alice hangs up with User B2. */

F18 BYE Alice -> Proxy

BYE sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b3f
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F19 BYE Proxy -> B2

BYE sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837.1

Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b3f
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F20 200 OK B2 -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK837.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b3f
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 2 BYE
Content-Length: 0

F21 200 OK Proxy -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b3f
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq:  2 BYE
Content-Length: 0

2.10. 3-Way Conference - Third Party Is Added โœจ

      Alice           Bob            Carol
       |    INVITE F1   |              |
       |--------------->|              |
       | 180 Ringing F2 |              |
       |<---------------|              |
       |    200 OK F3   |              |
       |<---------------|              |
       |     ACK F4     |              |
       |--------------->|              |
       |       RTP      |              |
       |<==============>|              |
       |   INVITE F5    |              |
       |<---------------|              |
       |    200 OK F6   |              |
       |--------------->|              |
       |     ACK F7     |              |
       |<---------------|  INVITE F8   |
       |                |------------->|
       |                |    180 F9    |
       |                |<-------------|
       |                |  200 OK F10  |
       |                |<-------------|
       |                |  ACK F11     |
       |                |------------->|
       |                |       RTP    |
       |                |<============>|

Okay so, the vibe here is 3-way call era ๐ŸŽ€. Alice and Bob are already chatting in a 2-party call (aka a session) when Bob decides Carol needs to join the party ๐Ÿซถ. Bob can mix media in a 3-party call, so he's basically the hostess with the mostest ๐Ÿ’…. First, he sends a re-INVITE to Alice that swaps his Contact URI for one pointing at his mixer, and that URI acts like a focus. To make that clear, he includes the "isfocus" feature tag [RFC3840], as described in [RFC4579]. Then Bob INVITEs Carol using that same Contact URI. Tea โ˜•: Bob could totally wait to re-INVITE Alice until after Carol answers, and he could also put Alice on hold before calling Carol ๐ŸŒธ.

Message Details ๐Ÿ’–

F1 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9

Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 180 Ringing Bob -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:b54gh42f5@biloxi.example.com>
Content-Length: 0

F3 200 OK Bob -> Alice

SIP/2.0 200 OK

Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:b54gh42f5@biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 ACK Alice -> Bob

ACK sips:b54gh42f5@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfL
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

/* Alice and Bob have established a session.
   Bob re-INVITEs, changing Contact URIs. */

F5 INVITE Bob -> Alice

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 INVITE
Contact: <sips:bob-Mixer@client.biloxi.example.com>;isfocus
Content-Type: application/sdp
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F6 200 OK Alice -> Bob

SIP/2.0 200 OK

Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F7 ACK Bob -> Alice

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash3G
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 ACK
Content-Length: 0

/* Bob calls Carol. */

F8 INVITE Bob -> Carol

INVITE sips:carol@chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashJfd
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 INVITE
Contact: <sips:bob-Mixer@client.biloxi.example.com>;isfocus
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 28908445834 2890844834 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 48174 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F9 180 Ringing Carol -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashJfd
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=341313
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 INVITE
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F10 200 OK Carol -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashJfd
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=341313
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 INVITE
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890844922 2890844922 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 ACK Bob -> Carol

ACK sips:carol@client.chicago.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash431
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=8675309
To: Carol <sips:carol@chicago.example.com>;tag=341313
Call-ID: sdjfdjfskdf@biloxi.example.com
CSeq: 42 ACK
Content-Length: 0

/* Bob's mixer now mixes media from both Alice and Carol
   to create the 3-way conference. */

Bob's mixer is now mixing audio from Alice and Carol into one 3-way conference. Iconic โœจ๐ŸŒˆ

2.11. 3-Way Conference - Third Party Joins ๐ŸŽ€

            Alice           Bob            Carol
             |    INVITE F1   |              |
             |--------------->|              |
             | 180 Ringing F2 |              |
             |<---------------|              |
             |    200 OK F3   |              |
             |<---------------|              |
             |     ACK F4     |              |
             |--------------->|              |
             |       RTP      |              |
             |<==============>|  INVITE Join:A-B F5
             |                |<-------------|
             |                |    180 F6    |
             |                |------------->|
             |   INVITE F7    |              |
             |<---------------|              |
             |    200 OK F8   |              |
             |--------------->|              |
             |     ACK F9     |              |
             |<---------------|              |
             |                |  200 OK F10  |
             |                |------------->|
             |                |  ACK F11     |
             |                |<-------------|
             |                |       RTP    |
             |                |<============>|

Okay so picture this: Alice and Bob are already chatting on a 2-party call, and then Carol wants in, so now it's a 3-party call ๐Ÿ“žโœจ Carol could have gotten Bob's dialog identifier through some non-SIP way, or maybe from a NOTIFY with the dialog package that Bob sent her. Either way, Carol sends an INVITE to Bob with a Join header that points at the dialog between Alice and Bob. Then Bob re-INVITEs Alice to switch into focus mode, and he includes the "isfocus" feature tag [RFC3840] as described in [RFC4579]. After that Bob accepts Carol's INVITE and boom, it's a 3-way call ๐Ÿ’…๐Ÿ”ฅ

Message Details

F1 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9

Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 180 Ringing Bob -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:b54gh42f5@biloxi.example.com>
Content-Length: 0

F3 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:b54gh42f5@biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, join, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 ACK Alice -> Bob

ACK sips:b54gh42f5@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf6
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

/* Alice and Bob have established a session.
   Carol requests to join the session. */

F5 INVITE Carol -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Carol <sips:carol@chicago.example.com>;tag=8675309
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 452k499sk@chicago.example.com
CSeq: 99 INVITE
Contact: <sips:carol@client.chicago.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, join
Join: 12345600@atlanta.example.com;from-tag=1234567;to-tag=23431
Content-Type: application/sdp
Content-Length: ...

v=0
o=carol 2890844922 2890844922 IN IP4 client.chicago.example.com
s=
c=IN IP4 client.chicago.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F6 180 Ringing Bob -> Carol

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=120.
From: Carol <sips:carol@chicago.example.com>;tag=8675309
To: Bob <sips:bob@biloxi.example.com>;tag=0982
Call-ID: 452k499sk@chicago.example.com
CSeq: 99 INVITE
Contact: <sips:bob-Mixer@client.biloxi.example.com>;isfocus
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Length: 0

F7 INVITE Bob -> Alice

INVITE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashdyKL
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 INVITE
Contact: <sips:bob-Mixer@client.biloxi.example.com>;isfocus
Content-Type: application/sdp
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, join, gruu
Content-Length: ...

v=0
o=bob 2890844527 2890844528 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F8 200 OK Alice -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnashdyKL
 ;received=192.0.2.113
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F9 ACK Bob -> Alice

ACK sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKnash3g
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=23431
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1024 ACK
Content-Length: 0

F10 200 OK Bob -> Carol

SIP/2.0 200 OK
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=120.
From: Carol <sips:carol@chicago.example.com>;tag=8675309
To: Bob <sips:bob@biloxi.example.com>;tag=0982
Call-ID: 452k499sk@chicago.example.com
CSeq: 99 INVITE
Contact: <sips:bob-Mixer@client.biloxi.example.com>;isfocus
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, join, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 28908445834 2890844834 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 48174 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 ACK OK Carol -> Bob

ACK sips:bob-Mixer@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS chicago.example.com:5061
 ;branch=z9hG4bKnash4Gf
Max-Forwards: 70
From: Carol <sips:carol@chicago.example.com>;tag=8675309
To: Bob <sips:bob@biloxi.example.com>;tag=0982
Call-ID: 452k499sk@chicago.example.com
CSeq: 99 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, join
Content-Length:0

2.12. Find-Me โ˜Ž๏ธ

Okay bestie, so here's the whole Find-Me flow as a picture ๐Ÿฆ‹ Alice calls Bob, and the proxy goes hunting through Bob's list of places like a detective ๐Ÿ•ต๏ธโ€โ™€๏ธ

             Alice           Proxy           User   User   User   User
                                              B1     B2     B3     B4
             |                |              |      |      |      |
             |    INVITE F1   |              |      |      |      |
             |--------------->|   INVITE F2  |      |      |      |
             |                |------------->|      |      |      |
             |(100 Trying) F3 |              |      |      |      |
             |<---------------|180 Ringing F4|      |      |      |
             |                |<-------------|      |      |      |
             | 180 Ringing F5 |              |      |      |      |
             |<---------------|              |      |      |      |
             |                |    Timeout   |      |      |      |
             |                |              |      |      |      |
             |                |   CANCEL F6  |      |      |      |
             |                |------------->|      |      |      |
             |                |   200 OK F7  |      |      |      |
             |                |<-------------|      |      |      |
             |                |     487 F8   |      |      |      |
             |                |<-------------|      |      |      |
             |                |     ACK F9   |      |      |      |
             |                |------------->|      |      |      |
             |                |     INVITE F10      |      |      |
             |                |-------------------->|      |      |
             |                |480 Not Logged In F11|      |      |
             |                |<--------------------|      |      |
             |                |              ACK F12|      |      |
             |                |-------------------->|      |      |
             |                |          INVITE F13        |      |
             |                |--------------------------->|      |
             |                |      486 Busy Here F14     |      |
             |                |<---------------------------|      |
             |                |            ACK F15         |      |
             |                |--------------------------->|      |
             |                |              INVITE F16           |
             |                |---------------------------------->|
             |                |            180 Ringing F17        |
             |     180 F18    |<----------------------------------|
             |<---------------|               200 OK F19          |
             |   200 OK F20   |<----------------------------------|
             |<---------------|                                   |
             |     ACK F21    |                                   |
             |--------------->|                 ACK F22           |
             |                |---------------------------------->|
             |               Both way RTP Established             |
             |<==================================================>|
             |                |                  BYE F23          |
             |     BYE F24    |<----------------------------------|
             |<---------------|                                   |
             |    200 OK F25  |                                   |
             |--------------->|                 200 OK F26        |
             |                |---------------------------------->|
             |                |                                   |

Alice's call to Bob kicks off a hunt through a list of contacts, calling each location in turn ๐Ÿ’– Whichever location picks up first becomes the active set, and no other sets are allowed to join the call. Iconic gatekeeping ๐Ÿ’…

While this flow shows a sequential search, the search could also be done with parallel forking โœจ So many options, so little time ๐Ÿ™ˆ

Message Details

F1 INVITE Alice -> Proxy

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t= 0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 INVITE Proxy -> B1

INVITE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103

Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t= 0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F3 (100 Trying) Proxy -> Alice

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F4 180 Ringing B1 -> Proxy

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F5 180 Ringing Proxy -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

/* B1 rings until a configurable timer in the proxy
   expires.  The proxy then sends Cancel and proceeds down
   the list of routes. */

F6 CANCEL Proxy -> B1

CANCEL sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 CANCEL
Content-Length: 0

F7 200 OK B1 -> Proxy

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 CANCEL
Content-Length: 0

F8 487 Request Terminated B1 -> Proxy

SIP/2.0 487 Request Terminated
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F9 ACK Proxy -> B1

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.1
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=765432
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F10 INVITE Proxy -> B2

INVITE sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 480 Not Logged In B2 -> Proxy

SIP/2.0 480 Not Logged In
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314756
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F12 ACK Proxy -> B2

ACK sips:bob@client2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.2
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314756
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F13 INVITE Proxy -> B3

INVITE sips:bob@client3.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.3
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F14 486 Busy Here B3 -> Proxy

SIP/2.0 486 Busy Here
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.3
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F15 ACK Proxy -> B3

Okay so, picking up right where the Find-Me call flow left off, bestie ๐Ÿงš๐Ÿ’– Bob's side of the call is still going. Here's the rest of the ladder ๐Ÿ’…

ACK sips:bob@client3.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.3
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7654321
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F16 INVITE Proxy -> B4 ๐Ÿฆ‹

INVITE sips:bob@client4.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.4
Via: SIP/2.0/TLS client.atlanta.example.com:5061

 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F17 180 Ringing B4 -> Proxy ๐Ÿ””

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.4
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7137136
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client4.biloxi.example.com>
Content-Length: 0

F18 180 Ringing Proxy -> Alice ๐ŸŒธ

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7137136
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client4.biloxi.example.com>
Content-Length: 0

F19 200 OK B4 -> Proxy โœจ

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83749.4
 ;received=192.0.2.54
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7137136
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client4.biloxi.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client4.biloxi.example.com
s=
c=IN IP4 client4.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F20 200 OK Proxy -> Alice ๐ŸŽ€

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
Record-Route: <sips:ss1.example.com;lr>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7137136
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client4.biloxi.example.com>
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client4.biloxi.example.com
s=
c=IN IP4 client4.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F21 ACK Alice -> Proxy ๐Ÿซถ

ACK sips:bob@client4.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf
Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7137136
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F22 ACK Proxy -> B4 ๐Ÿ“

ACK sips:bob@client4.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK8374
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf
 ;received=192.0.2.103
Max-Forwards: 69
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7137136
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

The call is connected now, so the media streams go between Alice and B4 directly ๐ŸŽถ

/* RTP streams are established between Alice and B4. */

/* User B4 hangs up with Alice. */

F23 BYE B4 -> Proxy ๐Ÿ‘‹

BYE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client4.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7

Route: <sips:ss1.example.com;lr>
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=7137136
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 BYE
Content-Length: 0

F24 BYE Proxy -> Alice ๐Ÿ’œ

BYE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83754
Via: SIP/2.0/TLS client4.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
Max-Forwards: 69
From: Bob <sips:bob@biloxi.example.com>;tag=7137136
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 BYE
Content-Length: 0

F25 200 OK Alice -> Proxy ๐ŸŒˆ

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.example.com:5061
 ;branch=z9hG4bK83754
 ;received=192.0.2.54
Via: SIP/2.0/TLS client4.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=7137136
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 BYE
Content-Length: 0

F26 200 OK Proxy -> B4 โญ

SIP/2.0 200 OK
Via: SIP/2.0/TLS client4.biloxi.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=7137136
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 1 BYE
Content-Length: 0

2.13. Call Management (Incoming Call Screening) โœจ

okay bestie, this one is giving bouncer at the club ๐Ÿ’… Bob keeps an incoming call screening list, and Alice is on it as an address he will not accept calls from ๐Ÿ™…โ€โ™€๏ธ So what happens when Alice tries to ring him anyway? Let's walk through it ๐Ÿ‘€

                                                      Announcement
           Alice           Proxy            Bob           Server

             |                |              |              |
             |    INVITE F1   |              |              |
             |------------------------------>|              |
             | 305 Use Proxy F2              |              |
             |<------------------------------|              |
             |     ACK F3     |              |              |
             |------------------------------>|              |
             |    INVITE F4   |              |              |
             |--------------->|              |              |
             | 407 Proxy Authentication F5   |              |
             |<---------------|              |              |
             |     ACK F6     |              |              |
             |--------------->|              |              |
             |    INVITE F7   |              |              |
             |--------------->|              |              |
             | 403 Screening Failure (Terminating) Error-Info: URI F8
             |<---------------|              |              |
             |     ACK F9     |              |              |
             |--------------->|              |              |
             |    INVITE F10  |              |              |
             |--------------------------------------------->|
             |    200 OK F11  |              |              |
             |--------------------------------------------->|
             |     ACK F12    |                             |
             |--------------------------------------------->|
             |          Announcement Played to Caller       |
             |<=============================================|
             |                                    BYE F13   |
             |<---------------------------------------------|
             |     200 OK F14                               |
             |--------------------------------------------->|
             |                                              |
             |                                              |
             |                                              |

So F1, F2, and F3 are there to prove that Bob won't accept an INVITE unless the proxy has screened it first ๐Ÿ›ก๏ธ The proxy basically says "not you, try the front door" ๐Ÿšช

Heads up: you can't screen calls by looking at the From header ๐Ÿšซ You need some form of authentication credentials for that ๐Ÿ”

Next, the screening proxy slides an announcement URI into an Error-Info header field ๐ŸŽ™๏ธ Alice opens that URI by sending an INVITE to hear the Announcement. The Announcement Server flags itself with the automaton and rendering feature tags in F12 and F13, which tells everyone it's a media server that can only play announcements ๐Ÿ“ฃ It's not here to chat, just to play the message ๐Ÿ’€

Message Details

F1 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* Bob only accepts INVITEs that have been screened by the proxy. */

F2 305 Use Proxy Bob -> Alice

SIP/2.0 305 Use Proxy
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=342123
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:ss1.example.com>
Content-Length: 0

F3 ACK Alice -> Bob

ACK sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=342123
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

/* A retries the call through the proxy. */

F4 INVITE Alice -> Proxy 1

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf0
Max-Forwards: 70
Route: <sips:ss1.example.com>
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* Proxy 1 challenges Alice for authentication. */

F5 407 Proxy Authentication Required Proxy 1 -> Alice

SIP/2.0 407 Proxy Authentication Required
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf0
 ;received=192.0.2.103

From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7886765
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Proxy-Authenticate: Digest realm="example.com",
   nonce="ea9c8e88df84f1cec4341ae6cbe5a359",
   qop="auth", nc=00000001, cnonce="0a4f113b",
   opaque="", stale=FALSE, algorithm=MD5
Content-Length: 0

F6 ACK Alice -> Proxy 1

ACK sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf0
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=7886765
Call-ID: 12345600@atlanta.example.com
CSeq: 2 ACK
Content-Length: 0

/* Alice responds by sending an INVITE with authentication credentials in it. */

F7 INVITE Alice -> Proxy 1

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf2
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 3 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Proxy-Authorization: Digest username="alice",
   realm="example.com", qop=auth,
   nc=00000001, cnonce="4gr84543ft2",
   nonce="ae9137be1c87d175c2dd63302a0d6e0a",
   opaque="", uri="sips:bob@biloxi.example.com",
   response="bbaec39f943bdcb3620d90afc548a45c"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F8 403 Screening Failure (Terminating) Proxy 1 -> Alice

SIP/2.0 403 Screening Failure (Terminating)
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf2
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=ffe254
Call-ID: 12345600@atlanta.example.com
CSeq: 3 INVITE
Error-Info: <sips:screen-fail-term-ann@ms.biloxi.example.com>
Content-Length: 0

F9 ACK Alice -> Proxy 1

ACK sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf2
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=ffe254
Call-ID: 12345600@atlanta.example.com
Proxy-Authorization: Digest username="alice",
 realm="example.com", nonce="ae9137be1c87d175c2dd63302a0d6e0a",
 opaque="", uri="sips:bob@biloxi.example.com",
 response="bbaec39f943bdcb3620d90afc548a45c"
CSeq: 3 ACK
Content-Length: 0

/* To hear the recording, Alice connects to the Error-Info URI. */

F10 INVITE Alice -> Proxy 1

INVITE sips:screen-fail-term-ann@ms.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bKfj
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 4 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 200 OK Announcement Server -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bKfj
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=234934
Call-ID: 12345600@atlanta.example.com
CSeq: 4 INVITE
Contact: <sips:ms.biloxi.example.com>
 ;automaton;+sip.rendering="no"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=annc 2890844543 2890844543 IN IP4 announce.biloxi.example.com
s=
c=IN IP4 announce.biloxi.example.com
t=0 0
m=audio 49174 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F12 ACK Alice -> Announcement Server

ACK sips:ms.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b32

Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=234934
Call-ID: 12345600@atlanta.example.com
CSeq: 4 ACK
Content-Length: 0

/* Announcement Server plays announcement then disconnects. */

F13 BYE Announcement Server -> Alice

BYE sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS announcement.example.com:5061
 ;branch=z9hG4bKS
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=234934
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2334 BYE
Content-Length: 0

F14 200 OK Alice -> Announcement Server

SIP/2.0 200 OK
Via: SIP/2.0/TLS announcement.example.com:5061
 ;branch=z9hG4bKS
 ;received=192.0.2.103
From: Bob <sips:bob@biloxi.example.com>;tag=234934
To: Alice <sips:alice@atlanta.example.com>;tag=1234567
Call-ID: 12345600@atlanta.example.com
CSeq: 2334 BYE
Content-Length: 0

2.14. Call Management (Outgoing Call Screening) ๐Ÿšซ๐Ÿ“ž

okay so picture this: Alice has her own outgoing call screening list, and Bob is on it. that means Alice is NOT allowed to place a call to him, full stop ๐Ÿ™…โ€โ™€๏ธ here's how the messages go:

           Alice            Proxy           Bob
             |                |              |
             |    INVITE F1   |              |
             |--------------->|              |
             | 407 Proxy Authentication F2   |
             |<---------------|              |
             |     ACK F3     |              |
             |--------------->|              |
             |    INVITE F4   |              |
             |--------------->|              |
             | 403 Screening Failure (Originating) F5
             |<---------------|              |
             |     ACK F6     |              |
             |--------------->|              |
             |                |              |

Alice tries to call Bob anyway, and the proxy says nope ๐Ÿ’€ but the cool part is that Alice could still set up a session to listen to the announcement sitting in the Error-Info header field ๐ŸŽง

Message Details โœจ

F1 INVITE Alice -> Proxy 1

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/* Proxy 1 challenges Alice for authentication. */

F2 407 Proxy Authentication Required Proxy 1 -> Alice

SIP/2.0 407 Proxy Authentication Required
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=90210
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Proxy-Authenticate: Digest realm="example.com",
 nonce="ea9c8e88df84f1cec4341ae6cbe5a359",
 qop="auth", nc=00000001, cnonce="0a4f113b",
 opaque="", stale=FALSE, algorithm=MD5
Content-Length: 0

F3 ACK Alice -> Proxy 1

ACK sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=90210
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0
/* Alice responds be sending an INVITE with authentication
   credentials in it. */

F4 INVITE Alice -> Proxy 1

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b4
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Proxy-Authorization: Digest username="alice", realm="example.com",
 nonce="cb360afc54bbaec39f943bd820d9a45c", opaque="",
 uri="sips:bob@biloxi.example.com",
 response="b9d2e5bcdec9f69ab2a9b44f270285a6"
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F5 403 Screening Failure (Originating) Proxy 1 -> Alice

SIP/2.0 403 Screening Failure (Originating)
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b4
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=18017
Call-ID: 12345600@atlanta.example.com
CSeq: 2 INVITE
Error-Info: <sips:screen-fail-orig-ann@announcement.example.com>
Content-Length: 0

F6 ACK Alice -> Proxy 1

ACK sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b4
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=18017
Call-ID: 12345600@atlanta.example.com
CSeq: 2 ACK
Proxy-Authorization: Digest username="alice", realm="example.com",
 nonce="cb360afc54bbaec39f943bd820d9a45c", opaque="",
 uri="sips:bob@biloxi.example.com",
 response="b9d2e5bcdec9f69ab2a9b44f270285a6"
Content-Length: 0

2.15. Call Park ๐Ÿ…ฟ๏ธ๐Ÿฆ‹

this one is giving main character energy ๐Ÿ‘‘ Alice calls Bob, and then Bob parks the call at the Park Server by sending it a REFER. the server sends an INVITE to Alice that replaces the session between Alice and Bob. the Park Server uses the automaton, rendering, and byeless feature tags in F9 to show Alice what it can do ๐Ÿงš Alice accepts, which makes her send a BYE to Bob. Bob gets a NOTIFY saying the park worked, and that NOTIFY also carries the dialog identifiers in the application/sip body ๐Ÿ’œ

           Alice           Bob        Park Server       Carol
             |              |              |              |
             |   INVITE F1  |              |              |
             |------------->|              |              |
             |180 Ringing F2|              |              |
             |<-------------|              |              |
             |  200 OK F3   |              |              |
             |<-------------|              |              |
             |    ACK F4    |              |              |
             |------------->|              |              |
             |  RTP Media   |              |              |
             |<============>|              |              |
             |      Bob Parks Call         |              |
             |              |   REFER Refer-To: A F5      |
             |              |------------->|              |
             |              |    202 F6    |              |
             |              |<-------------|              |
             |              |   NOTIFY F7  |              |
             |              |<-------------|              |
             |              |    200 F8    |              |
             |              |------------->|              |
             |  INVITE F9 Replaces: B      |              |
             |<----------------------------|              |
             |          200 OK F10         |              |
             |---------------------------->|              |
             |           ACK F11           |              |
             |<----------------------------|              |
             |           RTP Music         |              |
             |<===========================>|              |
             |     BYE F12  |              |              |
             |------------->|  NOTIFY F14  |              |
             |  200 OK F13  |<-------------|              |
             |<-------------|  200 OK F15  |              |
             |              |------------->|              |
             |              |   Carol picks up the call   |
             |              |              |              |
             |              |              | SUBSCRIBE F16|
             |              |              |<-------------|
             |              |              |  200 OK F17  |
             |              |              |------------->|
             |              |              |  NOTIFY F18  |
             |              |              |------------->|
             |              |              |  200 OK F19  |
             |              |              |<-------------|
             |           INVITE Replaces: Park Server F20 |
             |<-------------------------------------------|
             |              |              |   200 F21    |
             |------------------------------------------->|
             |              |              |    ACK F22   |
             |<-------------------------------------------|
             |                  RTP Media                 |
             |<==========================================>|
             |           BYE F23           |              |
             |---------------------------->|              |
             |          200 OK F24         |              |
             |<----------------------------|              |
             |       No more RTP Music     |              |

then Carol wants the call, so she sends an INVITE with the dialog identifiers to Alice, and that INVITE replaces the session with the Park Server ๐Ÿ”ฅ Alice accepts and sends a BYE to the Park Server. Carol gets the dialog identifiers from a NOTIFY from the Park Server, which is how she knows where to go ๐Ÿซถ

ngl this call flow is basically a special case of call transfer ๐Ÿ’… and it could also be used for Music on Hold ๐ŸŽถ

Message Details โœจ

F1 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.alice.example.com:5061
 ;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 180 Ringing Bob -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F3 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bKnashds7
 ;received=192.0.2.105
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890844527 2890844527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 ACK Alice -> Bob

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=314159
Call-ID: 12345601@atlanta.example.com
CSeq: 1 ACK
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces
Content-Length: 0

Okay bestie, the Park choreography keeps going, and it's giving full main-character energy ๐Ÿ’…๐Ÿฆ‹

/* Bob REFERs Park Server to establish session with Alice,
   which replaces the established session between Alice and Bob.
   Note that there is no session established between Bob
   and the Park Server. */

F5 REFER Bob -> Park Server

   REFER sips:park@server.example.com SIP/2.0
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKnashds9
   Max-Forwards: 70
   From: Bob <sips:bob@biloxi.example.com>;tag=02134
   To: Park Server <sips:park@server.example.com>
   Call-ID: 4802029847@biloxi.example.com
   CSeq: 1 REFER
 <allOneLine>
   Refer-To: <sips:a8342043f@atlanta.example.com;gr?Replaces=
   12345601%40atlanta.example.com%3Bfrom-tag%3D314159
   %3Bto-tag%3D1234567&Require=replaces>
 </allOneLine>
   Referred-By: <sips:bob@biloxi.example.com>
   Contact: <sips:bob@client.biloxi.example.com>
   Content-Length: 0

F6 202 Accepted Park Server -> Bob

   SIP/2.0 202 Accepted
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKnashds9
    ;received=192.0.2.105
   From: Bob <sips:bob@biloxi.example.com>;tag=02134
   To: Park Server <sips:park@server.example.com>;tag=56323
   Call-ID: 4802029847@biloxi.example.com
   Contact: <sips:park@server.example.com>
   CSeq: 1 REFER
   Content-Length: 0

F7 NOTIFY Park Server -> Bob

   NOTIFY sips:bob@client.biloxi.example.com SIP/2.0
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74bT6
   To: Bob <sips:bob@biloxi.example.com>;tag=02134
   Max-Forwards: 70
   From: Park Server <sips:park@server.example.com>;tag=56323
   Call-ID: 4802029847@biloxi.example.com
   CSeq: 1 NOTIFY
   Event: refer
   Contact: <sips:park@server.example.com>
   Subscription-State: active;expires=60
   Content-Type: message/sipfrag
   Content-Length: ...

   SIP/2.0 100 Trying

F8 200 OK Bob -> Park Server

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74bT6
    ;received=192.0.2.103
   To: Bob <sips:bob@biloxi.example.com>;tag=02134
   From: Park Server <sips:park@server.example.com>;tag=56323
   Call-ID: 4802029847@biloxi.example.com
   CSeq: 1 NOTIFY
   Content-Length: 0
/* Park Server places call to Alice to replace session
   between Alice and Bob. */

F9 INVITE Park Server -> Alice

   INVITE sips:a8342043f@atlanta.example.com;gr SIP/2.0
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74rf
   Max-Forwards: 70
   From: <sips:park@server.example.com>;tag=0111
   To: <sips:a8342043f@atlanta.example.com;gr>
   Call-ID: a5-75-34-12-76@server.example.com
   CSeq: 1 INVITE
   Referred-By: <sips:bob@biloxi.example.com>
   Contact: <sips:park@server.example.com>;automaton
       ;+sip.byeless;+sip.rendering="no"
   Require: replaces
   Replaces: 12345601@atlanta.example.com
    ;from-tag=314159;to-tag=1234567
   Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
   Supported: replaces
   Content-Type: application/sdp
   Content-Length: ...

   v=0
   o=ParkServer 2890844576 2890844576 IN IP4 Park.server.example.com
   s=
   c=IN IP4 server.example.com
   t=0 0
   m=audio 49170 RTP/AVP 0
   a=rtpmap:0 PCMU/8000

F10 200 OK Alice -> Park Server

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74rf
    ;received=192.0.2.103
   From: <sips:park@server.example.com>;tag=0111
   To: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
   Call-ID: a5-75-34-12-76@server.example.com
   CSeq: 1 INVITE
   Contact: <sips:a8342043f@atlanta.example.com;gr>
   Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
   Supported: replaces, gruu
   Content-Type: application/sdp
   Content-Length: ...

   v=0
   o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
   s=
   c=IN IP4 client.atlanta.example.com
   t=0 0
   m=audio 49170 RTP/AVP 0
   a=rtpmap:0 PCMU/8000
   a=recvonly

F11 ACK Park Server -> Alice

   ACK sips:a8342043f@atlanta.example.com;gr SIP/2.0
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK7rfF
   Max-Forwards: 70
   From: <sips:park@server.example.com>;tag=0111
   To: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
   Call-ID: a5-75-34-12-76@server.example.com
   CSeq: 1 ACK
   Content-Length: 0

F12 BYE Alice -> Bob

   BYE sips:bob@client.biloxi.example.com SIP/2.0
   Via: SIP/2.0/TLS client.atlanta.example.com:5061
    ;branch=z9hG4bKnashds7
   Max-Forwards: 70
   From: Alice <sips:alice@atlanta.example.com>;tag=1234567
   To: Bob <sips:bob@biloxi.example.com>;tag=314159
   Call-ID: 12345601@atlanta.example.com
   CSeq: 2 BYE
   Content-Length: 0

F13 200 OK Bob -> Alice

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS client.atlanta.example.com:5061
    ;branch=z9hG4bKnashds7
    ;received=192.0.2.105
   From: Alice <sips:alice@atlanta.example.com>;tag=1234567
   To: Bob <sips:bob@biloxi.example.com>;tag=314159
   Call-ID: 12345601@atlanta.example.com
   CSeq: 2 BYE
   Content-Length: 0
/* Park Server reports success back to Bob by returning
   a 200 OK response.  Bob obtains the dialog identifiers
   from the headers included in the response. */

F14 NOTIFY Park Server -> Bob

   NOTIFY sips:bob@client.biloxi.example.com SIP/2.0
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74bf9

   To: Bob <sips:bob@biloxi.example.com>;tag=02134
   Max-Forwards: 70
   From: Park Server <sips:park@server.example.com>;tag=56323
   Call-ID: 4802029847@biloxi.example.com
   CSeq: 2 NOTIFY
   Event: refer
   Subscription-State: terminated;reason=noresource
   Contact: <sips:park@server.example.com>;automaton
       ;+sip.byeless;+sip.rendering="no"
   Content-Type: message/sipfrag
   Content-Length: ...

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74rf
    ;received=192.0.2.103
   From: <sips:park@server.example.com>;tag=0111
   To: <sips:a8342043f@atlanta.example.com;gr>;tag=098594
   Call-ID: a5-75-34-12-76@server.example.com
   CSeq: 1 INVITE
   Contact: <sips:a8342043f@atlanta.example.com;gr>

F15 200 OK Bob -> Park Server

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74bf9
    ;received=192.0.2.103
   To: Bob <sips:bob@biloxi.example.com>;tag=02134
   From: Park Server <sips:park@server.example.com>;tag=56323
   Call-ID: 4802029847@biloxi.example.com
   CSeq: 2 NOTIFY
   Content-Length: 0
/* Alice is now parked at the Park Server. */

/* Carol picks up the call by sending an INVITE to A, which
   replaces the existing session with the Park Server.
   Carol needs to know the dialog information to construct
   the Replaces header. */

F16 SUBSCRIBE Carol -> Park Server

   SUBSCRIBE sips:bob@biloxi.example.com SIP/2.0
   Via: SIP/2.0/TLS client.chicago.example.com:5061
    ;branch=z9hG4bK74b232

   Max-Forwards: 70
   From: Carol <sips:carol@chicago.example.com>;tag=158x93461
   To: <sips:park@server.example.com>
   Call-ID: 2d6485356dfaj34dsf
   CSeq: 1 SUBSCRIBE
   Contact: <sips:carol@client.chicago.example.com>
   Event: dialog
   Expires: 0
   Accept: application/dialog-info+xml
   Content-Length: 0

F17 200 OK Park Server -> Carol

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS client.chicago.example.com:5061
    ;branch=z9hG4bK74b232
    ;received=192.0.2.105
   From: Carol <sips:carol@chicago.example.com>;tag=158x93461
   To: <sips:park@server.example.com>;tag=3213j
   Call-ID: 2d6485356dfaj34dsf
   CSeq: 1 SUBSCRIBE
   Contact: <sips:park@server.example.com>;automaton
       ;+sip.byeless;+sip.rendering="no"
   Content-Length: 0

F18 NOTIFY Park Server -> Carol

   NOTIFY sips:carol@client.example.com SIP/2.0
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74b8skd
   Max-Forwards: 70
   To: Carol <sips:carol@chicago.example.com>;tag=158x93461
   From: <sips:park@server.example.com>;tag=3213j
   Call-ID: 2d6485356dfaj34dsf
   CSeq: 1 NOTIFY
   Contact: <sips:park@server.example.com>;automaton
       ;+sip.byeless;+sip.rendering="no"
   Event: dialog
   Subscription-State: terminated;reason=timeout
   Content-Type: application/dialog-info+xml
   Content-Length: ...
   <?xml version="1.0"?>
   <dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info"
         version="0" state="full" entity="sips:park@server.example.com">
      <dialog id="439920143524"
         call-id="a5-75-34-12-76@server.example.com"
         local-tag="0111" remote-tag="098594" direction="initiator">
        <duration>1</duration>
        <local>
           <target>sips:park@server.example.com</target>
        </local>
        <remote>
          <target>sips:a8342043f@atlanta.example.com;gr</target>
        </remote>
        <state>confirmed</state>
      </dialog>
    </dialog-info>

F19 200 OK Carol -> Park Server

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS server.example.com:5061
    ;branch=z9hG4bK74b8skd
    ;received=192.0.2.103
   To: Carol <sips:carol@chicago.example.com>;tag=158x93461
   From: <sips:park@server.example.com>;tag=3213j
   Call-ID: 2d6485356dfaj34dsf
   CSeq: 1 NOTIFY
   Contact: <sips:carol@client.chicago.example.com>
   Content-Length: 0

F20 INVITE Carol -> Alice

   INVITE sips:alice@atlanta.example.com SIP/2.0
   Via: SIP/2.0/TLS client.chicago.example.com:5061
    ;branch=z9hG4bK74bQ2
   Max-Forwards: 70
   From: Carol <sips:carol@chicago.example.com>;tag=5893461
   To: Alice <sips:alice@atlanta.example.com>
   Call-ID: 6485356@chicago.example.com
   CSeq: 1 INVITE
   Contact: <sips:carol@client.chicago.example.com>
   Require: replaces
   Replaces: a5-75-34-12-76@server.example.com
    ;to-tag=098594;from-tag=0111
   Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER,
    SUBSCRIBE, NOTIFY
   Supported: replaces
   Content-Type: application/sdp
   Content-Length: ...

   v=0
   o=carol 2890844922 2890844922 IN IP4 client.chicago.example.com
   s=
   c=IN IP4 client.chicago.example.com
   t=0 0
   m=audio 3456 RTP/AVP 0
   a=rtpmap:0 PCMU/8000

F21 200 OK Alice -> Carol

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS client.chicago.example.com:5061
    ;branch=z9hG4bK74bQ2
    ;received=192.0.2.105
   From: Carol <sips:carol@chicago.example.com>;tag=5893461
   To: Alice <sips:alice@atlanta.example.com>;tag=222
   Call-ID: 6485356@chicago.example.com
   CSeq: 1 INVITE
   Contact: <sips:a8342043f@atlanta.example.com;gr>
   Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
   Supported: replaces, gruu
   Content-Type: application/sdp
   Content-Length: ...

   v=0
   o=alice 2890844527 2890844527 IN IP4 client.atlanta.example.com
   s=
   c=IN IP4 client.atlanta.example.com
   t=0 0
   m=audio 49170 RTP/AVP 0
   a=rtpmap:0 PCMU/8000

F22 ACK Carol -> Alice

   ACK sips:a8342043f@atlanta.example.com;gr SIP/2.0
   Via: SIP/2.0/TLS client.chicago.example.com:5061
    ;branch=z9hG4bK74bJ0
   Max-Forwards: 70
   From: Carol <sips:carol@chicago.example.com>;tag=5893461
   To: Alice <sips:alice@atlanta.example.com>;tag=222
   Call-ID: 6485356@chicago.example.com
   CSeq: 1 ACK
   Content-Length: 0
/* A replaces the session to the Park Server with the new
   session with C and generates a BYE to disconnect the
   Park Server. */

F23 BYE Alice -> Park Server

   BYE sips:park@server.example.com SIP/2.0
   Via: SIP/2.0/TLS client.atlanta.example.com:5061
    ;branch=z9hG4bK74b4N
   Max-Forwards: 70
   From: Alice <sips:alice@atlanta.example.com>;tag=098594
   To: <sips:park@server.example.com>;tag=0111
   Call-ID: a5-75-34-12-76@server.example.com
   CSeq: 1 BYE
   Content-Length: 0

F24 200 OK Park Server -> Alice

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS client.atlanta.example.com:5061
    ;branch=z9hG4bK74b4N
    ;received=192.0.2.103
   From: Alice <sips:alice@atlanta.example.com>;tag=098594
   To: <sips:park@server.example.com>;tag=0111
   Call-ID: a5-75-34-12-76@server.example.com
   CSeq: 1 BYE
   Content-Length: 0

2.16. Call Pickup โœจ๐ŸŽ€

okay bestie, this one is SO iconic ๐Ÿ’… Bob and Bill are in a work group at example.com and they can pick up each other's calls ๐Ÿ“ž Alice calls Bob, Bob doesn't pick up ๐Ÿ™ˆ and Bill decides to snatch the call ๐Ÿ˜ค

Here's the vibe. Bill sends a SUBSCRIBE to Bob to grab the dialog info ๐Ÿ‘€ then he builds an INVITE with a Replaces header aimed at Alice. Alice accepts that INVITE and sends a CANCEL so Bob's phone stops ringing ๐Ÿ“ต The 487/ACK bit (F11/F12) and the 200 OK to the CANCEL (F10) can show up in either order, so don't build anything that depends on which one lands first ๐Ÿ’€

Also, the early-only parameter from [RFC3891] is sitting in the Replaces header of F7 ๐Ÿงš It stops Alice from accepting the INVITE if Bob already picked up. If Bill wanted to "take" the call from Bob even after Bob answered, that parameter would just not be there in F7 ๐Ÿ’–

One more tea โ˜• the subscription between Bob and Carol could have been set up before Alice even called ๐Ÿซถ

            Alice          Bob                Bill
             |              |                   |
             |   INVITE F1  |                   |
             |------------->|                   |
             |180 Ringing F2|                   |
             |<-------------|                   |
             |              |   SUBSCRIBE F3    |
             |              |<------------------|
             |              |     200 OK F4     |
             |              |------------------>|
             |              |     NOTIFY F5     |
             |              |------------------>|
             |              |     200 OK F6     |
             |              |<------------------|
             |          INVITE Replaces:Bob  F7 |
             |<---------------------------------|
             |              |     200 OK F8     |
             |--------------------------------->|
             |   CANCEL F9  |                   |
             |------------->|                   |
             |  200 OK F10  |                   |
             |<-------------|                   |
             |    487 F11   |                   |
             |<-------------|                   |
             |    ACK F12   |                   |
             |------------->|                   |
             |                    ACK F13       |
             |<---------------------------------|
             |                                  |
             |    Two-Way RTP Established       |
             |<================================>|
             |                     BYE F14      |
             |--------------------------------->|
             |                   200 OK F15     |
             |<---------------------------------|
             |                                  |

Message Details ๐Ÿ’œ

F1 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 180 Ringing Bob -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

/* Bill decides to pick up the call. */

F3 SUBSCRIBE Bill -> Bob

SUBSCRIBE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS pc.biloxi.example.com:5061
 ;branch=z9hG4bK74bf
Max-Forwards: 70
From: Bill <sips:bill@biloxi.example.com>;tag=8675309
To: Bob <sips:bob@biloxi.example.com>
Call-ID: rt4353gs2egg@pc.biloxi.example.com
CSeq: 1 SUBSCRIBE
Contact: <sips:bill@pc.biloxi.example.com>
Event: dialog
Expires: 0
Accept: application/dialog-info+xml
Content-Length: 0

F4 200 OK Bob -> Bill

SIP/2.0 200 OK
Via: SIP/2.0/TLS pc.biloxi.example.com:5061
 ;branch=z9hG4bK74bf
 ;received=192.0.2.114
Max-Forwards: 70
From: Bill <sips:bill@biloxi.example.com>;tag=8675309
To: Bob <sips:bob@biloxi.example.com>;tag=31451098
Call-ID: rt4353gs2egg@pc.biloxi.example.com
CSeq: 1 SUBSCRIBE
Content-Length: 0

F5 NOTIFY Bob -> Bill

NOTIFY sips:bill@pc.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK74br
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=31451098
To: Bill <sips:bill@biloxi.example.com>;tag=8675309
Call-ID: rt4353gs2egg@pc.biloxi.example.com
CSeq: 1 NOTIFY
Contact: <sips:bob@client.biloxi.example.com>
Event: dialog
Subscription-State: terminated;reason=timeout
Content-Type: application/dialog-info+xml
Content-Length: ...

<?xml version="1.0"?>
<dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info"
       version="0" state="full" entity="sips:bob@biloxi.example.com">
   <dialog id="94992014524" call-id="12345600@atlanta.example.com"
       local-tag="3145678" remote-tag="1234567" direction="recipient">
     <duration>1</duration>
     <local>
       <identity display="Bob">sips:bob@biloxi.example.com</identity>
       <target>sips:bob@client.biloxi.example.com</target>
     </local>
     <remote>
       <identity display="Alice">sips:alice@atlanta.example.com
                                                       </identity>
       <target>sips:a8342043@atlanta.example.com;gr</target>
     </remote>
     <state>early</state>
   </dialog>
 </dialog-info>

F6 200 OK Bill -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK74br
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=31451098
To: Bill <sips:bill@biloxi.example.com>;tag=8675309
Call-ID: rt4353gs2egg@pc.biloxi.example.com
CSeq: 1 NOTIFY
Contact: <sips:bill@pc.biloxi.example.com>
Content-Length: 0

F7 INVITE Bill -> Alice

INVITE sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS pc.biloxi.example.com:5061
 ;branch=z9hG4bK74HH
Max-Forwards: 70
From: Bill <sips:bill@biloxi.example.com>;tag=8675310
To: Alice <sips:alice@atlanta.example.com>
Call-ID: 563456212@b2.biloxi.example.com
CSeq: 1 INVITE
Require: replaces
Replaces: 12345600@atlanta.example.com
 ;from-tag=314578;to-tag=1234567;early-only
Contact: <sips:bill@pc.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bill 2890843122 2890843122 IN IP4 pc.biloxi.example.com
s=
c=IN IP4 pc.biloxi.example.com
t=0 0
m=audio 5342 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* Alice matches the dialog information in the Replaces header
   and accepts the INVITE. */

F8 200 OK Alice -> Bill

SIP/2.0 200 OK
Via: SIP/2.0/TLS pc.biloxi.example.com:5061
 ;branch=z9hG4bK74HH
 ;received=192.0.2.114
From: Bill <sips:bill@biloxi.example.com>;tag=8675310
To: Alice <sips:alice@atlanta.example.com>;tag=131256
Call-ID: 563456212@b2.biloxi.example.com
CSeq: 1 INVITE
Contact: <sips:a8342043f@atlanta.example.com;gr>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces, gruu
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 289084543 289084543 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* Alice stops Bob's phone from ringing by sending a CANCEL. */

F9 CANCEL Alice -> Bob

CANCEL sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 CANCEL
Content-Length: 0

F10 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 CANCEL
Content-Length: 0

F11 487 Request Terminated Bob -> Alice

SIP/2.0 487 Request Terminated
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F12 ACK Alice -> Bob

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK83749.1
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=3145678
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F13 ACK Bill -> Alice

ACK sips:a8342043f@atlanta.example.com;gr SIP/2.0
Via: SIP/2.0/TLS pc.biloxi.example.com:5061
 ;branch=z9hG4bK7435
Max-Forwards: 70
From: Bill <sips:bill@biloxi.example.com>;tag=8675310
To: Alice <sips:alice@atlanta.example.com>;tag=131256
Call-ID: 563456212@b2.biloxi.example.com
CSeq: 1 ACK
Content-Length: 0

/* RTP streams are established between Alice and Bill.
   Later, Alice hangs up with Bill. */

F14 BYE Alice -> Bill

BYE sips:bill@pc.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf2
Max-Forwards: 70
To: Bill <sips:bill@biloxi.example.com>;tag=8675310
From: Alice <sips:alice@atlanta.example.com>;tag=131256
Call-ID: 563456212@b2.biloxi.example.com
CSeq: 1 BYE
Content-Length: 0

F15 200 OK Bill -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf2
 ;received=192.0.2.105
To: Bill <sips:bill@biloxi.example.com>;tag=8675310
From: Alice <sips:alice@atlanta.example.com>;tag=131256
Call-ID: 563456212@b2.biloxi.example.com
CSeq:  1 BYE
Content-Length: 0

2.17. Automatic Redial โœจ

okay so this one is giving "Bob is busy, but Alice is patient" ๐Ÿ’… Bob is on another call when Alice rings him, so instead of giving up, she subscribes to Bob's call state and waits for the moment he's free. The moment Bob's status flips to available, Alice gets alerted and sends the INVITE to set up the session. Then she wraps things up by ending the subscription. Lowkey the most relatable flow in the whole doc ๐Ÿซถ

           Alice             Bob
             |                |
             |    INVITE F1   |
             |--------------->|
             |486 Busy Here F2|
             |<---------------|    Bob is busy
             |     ACK F3     |
             |--------------->|
             |  SUBSCRIBE F4  |
             |--------------->|
             |   200 OK F5    |
             |<---------------|
             |    NOTIFY F6   |
             |<---------------|
             |   200 OK F7    |
             |--------------->|
             |                |
             |    NOTIFY F8   |    Bob is now available
             |<---------------|
             |   200 OK F9    |
             |--------------->|
             |                |
             |   INVITE F10   |
             |--------------->|    Session setup successful
             | 180 Ringing F11|
             |<---------------|
             |   200 OK F12   |
             |<---------------|
             |     ACK F13    |
             |--------------->|
             |  Media Session |
             |<==============>|
             |                |
             |   NOTIFY F14   |
             |<---------------|
             |   200 OK F15   |
             |--------------->|
             |                |
             |  SUBSCRIBE F16 | Alice terminates subscription
             |--------------->|
             |   200 OK F17   |
             |<---------------|
             |   NOTIFY F18   |
             |<---------------|
             |   200 OK F19   |
             |--------------->|
             |                |

Bob is initially busy when Alice calls. Alice subscribes to Bob's call state using a SUBSCRIBE F4. Bob sends a NOTIFY F8 when Bob is available. Alice is alerted, then Alice sends an INVITE to Bob to establish the session. The subscription is terminated using SUBSCRIBE F16.

Message Details ๐ŸŽ€

F1 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F2 486 Busy Here

SIP/2.0 486 Busy Here
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=982039i4
Call-ID: 12345600@atlanta.example.com
CSeq: 1 INVITE
Content-Length: 0

F3 ACK Alice -> Bob

ACK sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=1234567
To: Bob <sips:bob@biloxi.example.com>;tag=982039i4
Call-ID: 12345600@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F4 SUBSCRIBE Alice -> Bob

SUBSCRIBE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b8G
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=837348234
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 4524526232@atlanta.example.com
CSeq: 1 SUBSCRIBE
Contact: sips:alice@client.atlanta.example.com
Event: dialog
Accept: application/dialog-info+xml
Content-Length: 0

F5 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74b8G
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=837348234
To: Bob <sips:bob@biloxi.example.com>;tag=341123
Call-ID: 4524526232@atlanta.example.com
Expires: 60
CSeq: 1 SUBSCRIBE
Contact: sips:bob@client.biloxi.example.com
Content-Length: 0

F6 NOTIFY Bob -> Alice

NOTIFY sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK74bn2
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=341123
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 1 NOTIFY
Contact: <sips:bob@client.biloxi.example.com>
Event: dialog
Subscription-State: active;expires=59
Content-Type: application/dialog-info+xml
Content-Length: ...

<?xml version="1.0"?>
<dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info"
       version="0" state="full" entity="sips:bob@biloxi.example.com">
   <dialog id="562623442g3">
      <duration>1</duration>
     <state>confirmed</state>
   </dialog>
 </dialog-info>

F7 200 OK Alice -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK74bn2
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=341123
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 1 NOTIFY
Content-Length: 0

/* Bob is now available. */

F8 NOTIFY Bob -> Alice

NOTIFY sips:alice@atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK74bVi
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=341123
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 2 NOTIFY
Event: dialog
Subscription-State: active;expires=27
Contact: <sips:bob@client.biloxi.example.com>
Content-Type: application/dialog-info+xml
Content-Length: ...

<?xml version="1.0"?>
<dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info"
       version="0" state="full" entity="sips:bob@biloxi.example.com">
   <dialog id="562623442g3">
     <state>terminated</state>
   </dialog>
 </dialog-info>

F9 200 OK Alice -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bkVi
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=341123
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 2 NOTIFY
Content-Length: 0

F10 INVITE Alice -> Bob

INVITE sips:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfq
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=f23fkg14k
To: Bob <sips:bob@biloxi.example.com>
Call-ID: aoij4i9okitr@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:alice@client.atlanta.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=alice 2890844826 2890844826 IN IP4 client.atlanta.example.com
s=
c=IN IP4 client.atlanta.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 180 Ringing Bob -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfq
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=f23fkg14k
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: aoij4i9okitr@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

F12 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bfq
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=f23fkg14k
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: aoij4i9okitr@atlanta.example.com
CSeq: 1 INVITE
Contact: <sips:bob@client.biloxi.example.com>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...

v=0
o=bob 2890854527 2890854527 IN IP4 client.biloxi.example.com
s=
c=IN IP4 client.biloxi.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F13 ACK Alice -> Bob

ACK sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK74bLBJ
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=f23fkg14k
To: Bob <sips:bob@biloxi.example.com>;tag=23431
Call-ID: aoij4i9okitr@atlanta.example.com
CSeq: 1 ACK
Content-Length: 0

F14 NOTIFY Bob -> Alice

NOTIFY sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK4bnd2
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=341123
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 3 NOTIFY
Contact: <sips:bob@client.biloxi.example.com>
Event: dialog
Subscription-State: active;expires=15
Content-Type: application/dialog-info+xml
Content-Length: ...

<?xml version="1.0"?>
<dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info"
       version="0" state="full" entity="sips:bob@biloxi.example.com">
   <dialog id="62d2623442g3">
      <duration>1</duration>
     <state>confirmed</state>
   </dialog>
 </dialog-info>

F15 200 OK Alice -> Bob

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bK4bnd2
 ;received=192.0.2.105
From: Bob <sips:bob@biloxi.example.com>;tag=341123
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 3 NOTIFY
Content-Length: 0

/* Alice terminates the subscription. */

F16 SUBSCRIBE Alice -> Bob

SUBSCRIBE sips:bob@client.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK474b8
Max-Forwards: 70
From: Alice <sips:alice@atlanta.example.com>;tag=837348234
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 2 SUBSCRIBE
Contact: sips:alice@client.atlanta.example.com
Event: dialog
Expires: 0
Accept: application/dialog-info+xml
Content-Length: 0

F17 200 OK Bob -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.atlanta.example.com:5061
 ;branch=z9hG4bK474b8
 ;received=192.0.2.103
From: Alice <sips:alice@atlanta.example.com>;tag=837348234
To: Bob <sips:bob@biloxi.example.com>;tag=341123
Call-ID: 4524526232@atlanta.example.com
Expires: 0
CSeq: 2 SUBSCRIBE
Contact: sips:bob@client.biloxi.example.com
Content-Length: 0

F18 NOTIFY Bob -> Alice

NOTIFY sips:alice@client.atlanta.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061
 ;branch=z9hG4bKb5n2j
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=341123
To: Alice <sips:alice@atlanta.example.com>;tag=837348234
Call-ID: 4524526232@atlanta.example.com
CSeq: 4 NOTIFY
Contact: <sips:bob@client.biloxi.example.com>
Event: dialog
Subscription-State: terminated;reason=noresource
Content-Type: application/dialog-info+xml
Content-Length: ...

<?xml version="1.0"?>
<dialog-info xmlns="urn:ietf:params:xml:ns:dialog-info"
       version="0" state="full" entity="sips:bob@biloxi.example.com">
   <dialog id="62d2623442g3">
      <duration>3</duration>
     <state>confirmed</state>
   </dialog>
 </dialog-info>

F19 200 OK Alice -> Bob

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKb5n2j
    ;received=192.0.2.105
   From: Bob <sips:bob@biloxi.example.com>;tag=341123
   To: Alice <sips:alice@atlanta.example.com>;tag=837348234
   Call-ID: 4524526232@atlanta.example.com
   CSeq: 4 NOTIFY
   Content-Length: 0

2.18. Click to Dial โœจ

Okay, bestie, this one is SO relatable ๐ŸŒธ Bob is browsing the web on his PC, sees Carol's SIP URI, and clicks it because he wants to talk to her. ๐Ÿซถ His browser hands the URI to the SIP client on his PC, and that client is set up with the URI of Bob's SIP phone. So the PC sends a REFER to the phone, and the phone is the one that actually sets up the session between Bob and Carol. Iconic teamwork ๐Ÿ’…

        Bob's PC                Bob                Carol
            | REFER Refer-To:Carol F1                 |
            |------------------->|                    |
            |  202 Accepted F2   |                    |
            |<-------------------|                    |
            |                    |     INVITE F3      |
            |                    |------------------->|
            |                    |   180 Ringing F4   |
            |                    |<-------------------|
            |                    |     200 OK F5      |
            |                    |<-------------------|
            |                    |       ACK F6       |
            |                    |------------------->|
            |                    |         RTP        |
            |                    |<==================>|
            |                    |                    |

Now, the detail that's giving me life ๐Ÿงš Bob's PC asks for no REFER dialog to be set up, using the Refer-Sub: false header field [RFC4488]. Very organised of it ๐ŸŽ€

This flow is way better than the 3pcc flow ๐Ÿ‘‘ Why? Because the end-to-end SIP signaling never gets interrupted by the 3pcc controller, and Bob doesn't get a call that's missing its ringback tone or gets clipped. Nobody wants that, periodt ๐Ÿ™ˆ Also, the REFER has to be properly authorised, and Bob has to explicitly authorise the INVITE that gets triggered. Those two things are necessary, no exceptions ๐Ÿ”’

Heads up, babe: the REFER and the triggered INVITE both need their authorization sorted out before this flow works. Don't skip it! ๐Ÿ’€

Message Details ๐Ÿ“

/* Bob's PC SIP client sends a REFER to Bob's SIP phone. */

   F1 REFER PC -> Bob

   REFER sips:bob@biloxi.example.com SIP/2.0
   Via: SIP/2.0/TLS pc.biloxi.example.com:5061
    ;branch=z9hG4bKnashds7
   Max-Forwards: 70
   From: <sips:pc.biloxi.example.com>;tag=1234567
   To: Bob <sips:bob@biloxi.example.com>
   Call-ID: 1234560183434
   CSeq: 1 REFER
   Refer-To: <sips:carol@chicago.example.com>
   Refer-Sub: false
   Contact: <sips:pc.biloxi.example.com>
   Content-Length: 0


   F2 202 Accepted Bob -> PC

   SIP/2.0 202 Accepted
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKnashds7
    ;received=192.0.2.103
   From: <sips:pc.biloxi.example.com>;tag=1234567
   To: Bob <sips:bob@biloxi.example.com>;tag=314159
   Call-ID: 1234560183434
   Contact: <sips:bob@client.biloxi.example.com>
   CSeq: 1 REFER
   Refer-Sub: false
   Content-Length: 0


   F3 INVITE Bob -> Carol

   INVITE sips:carol@chicago.example.com SIP/2.0
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKnashdK9
   Max-Forwards: 70
   From: Bob <sips:bob@biloxi.example.com>;tag=8675309
   To: Carol <sips:carol@chicago.example.com>
   Call-ID: 7436222@atlanta.example.com
   CSeq: 1 INVITE
   Contact: <sips:bob@client.biloxi.example.com>
   Referred-By: <sips:pc.biloxi.example.com>
   Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
   Supported: replaces
   Content-Type: application/sdp
   Content-Length: ...

   v=0
   o=bob 2890844539 2890844539 IN IP4 client.biloxi.example.com
   s=
   c=IN IP4 client.biloxi.example.com
   t=0 0
   m=audio 3458 RTP/AVP 0
   a=rtpmap:0 PCMU/8000
F4 180 Ringing Carol -> Bob

   SIP/2.0 180 Ringing
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKnashdK9
    ;received=192.0.2.113
   From: Bob <sips:bob@biloxi.example.com>;tag=8675309
   To: Carol <sips:carol@chicago.example.com>;tag=928287
   Call-ID: 7436222@atlanta.example.com
   CSeq: 1 INVITE
   Contact: <sips:carol@client.chicago.example.com>
   Content-Length: 0


   F5 200 OK Carol -> Bob

   SIP/2.0 200 OK
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKnashdK9
    ;received=192.0.2.113
   From: Bob <sips:bob@biloxi.example.com>;tag=8675309
   To: Carol <sips:carol@chicago.example.com>;tag=928287
   Call-ID: 7436222@atlanta.example.com
   CSeq: 1 INVITE
   Contact: <sips:carol@client.chicago.example.com>
   Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
   Supported: replaces
   Content-Type: application/sdp
   Content-Length: ...

   v=0
   o=carol 2890844527 2890844527 IN IP4 client.chicago.example.com
   s=
   c=IN IP4 client.chicago.example.com
   t=0 0
   m=audio 3456 RTP/AVP 0
   a=rtpmap:0 PCMU/8000


   F6 ACK Bob -> Carol

   ACK sips:carol@client.chicago.example.com SIP/2.0
   Via: SIP/2.0/TLS client.biloxi.example.com:5061
    ;branch=z9hG4bKnashd43
   Max-Forwards: 70
   From: Bob <sips:bob@biloxi.example.com>;tag=8675309
   To: Carol <sips:carol@chicago.example.com>;tag=928287
   Call-ID: 7436222@atlanta.example.com
   CSeq: 1 ACK
   Content-Length: 0

   /* Bob and Carol now have established a session. */

3. Security Considerations ๐Ÿ›ก๏ธ

Okay, this part is serious, so listen up ๐Ÿ‘€ Since so many of the examples here are about SIP call control, whether it's peer-to-peer or 3pcc, the security considerations in the Multiparty Framework document [FRAMEWORK] apply. Read that one too, bestie ๐Ÿ“š

Lots of these services only work because a user agent is part of a group. ๐Ÿซ‚ Think employees in one department, a set of home phone extensions, or members of a call center. Because of that, the user agents in the group give other group members special privileges and features. ๐Ÿ”ฅ For example, a user agent might not normally let another user agent see detailed dialog information, but that info might get shared with a group member so a service like call pickup can work. Group members must be authenticated using normal SIP means, such as certificates or shared secrets. No cap, this is non-negotiable ๐Ÿ”

The service examples in this document lean SUPER hard on the SIP call control primitives REFER, Replaces, Join, and the dialog package. The security considerations for each of those extensions [RFC3515], [RFC3891], [RFC3911], [RFC4235] apply to the scenarios in this document. It's giving "read the fine print" energy, and I'm obsessed ๐Ÿ’œ

4. Acknowledgements ๐ŸŽ€

The authors want to thank the reviewers who gave detailed comments and corrections: Vijay Gurbani, John Elwell, Joel Repiquet, Nagesh Kumar, Chandra Ravipati, Eric Burger, Jeroen Bemmel, Miguel Garcia, and Dale Worley. You all ate this review ๐Ÿ‘‘

The Transfer - Instant Messaging call flow is based on the "IM-a-call" call flow by Jonathan Rosenberg and Henning Schulzrinne. โœจ The Automatic Redial call flow is based on a call flow by Adam Roach. The authors also wanted to thank the following people for their help and review of this call flows document: Joel Repiquet, Aki Neimi, Rohan Mahy, Jonathan Rosenberg, Hemant Agrawal, Henry Sinnreich, Dean Willis, David Devanatham, Joe Pizzimenti, Matt Cannon, John Hearty, the whole MCI WorldCom IPOP Design team, Scott Orton, Greg Osterhout, Pat Sollee, Doug Weisenberg, Danny Mistry, Steve McKinnon, and Denise Ingram, Denise Caballero, Tom Redman, Ilya Slain, Pat Sollee, John Truetken, and others from MCI WorldCom, 3Com, Cisco, Lucent, and Nortel. ๐Ÿซถ๐ŸŒˆ

5. References ๐Ÿ“š

5.1. Normative References

[RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, June 2002.

[RFC3264] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model with Session Description Protocol (SDP)", RFC 3264, June 2002.

[RFC3265] Roach, A., "Session Initiation Protocol (SIP)-Specific Event Notification", RFC 3265, June 2002.

[RFC3428] Campbell, B., Rosenberg, J., Schulzrinne, H., Huitema, C., and D. Gurle, "Session Initiation Protocol (SIP) Extension for Instant Messaging", RFC 3428, December 2002.

[RFC3515] Sparks, R., "The Session Initiation Protocol (SIP) Refer Method", RFC 3515, April 2003.

[RFC3840] Rosenberg, J., Schulzrinne, H., and P. Kyzivat, "Indicating User Agent Capabilities in the Session Initiation Protocol (SIP)", RFC 3840, August 2004.

[RFC3891] Mahy, R., Biggs, B., and R. Dean, "The Session Initiation Protocol (SIP) "Replaces" Header", RFC 3891, September 2004.

[RFC3911] Mahy, R. and D. Petrie, "The Session Initiation Protocol (SIP) "Join" Header", RFC 3911, October 2004.

[RFC4235] Rosenberg, J., Schulzrinne, H., and R. Mahy, "An INVITE-Initiated Dialog Event Package for the Session Initiation Protocol (SIP)", RFC 4235, November 2005.

[RFC4488] Levin, O., "Suppression of Session Initiation Protocol (SIP) REFER Method Implicit Subscription", RFC 4488, May 2006.

[RFC4579] Johnston, A. and O. Levin, "Session Initiation Protocol (SIP) Call Control - Conferencing for User Agents", BCP 119, RFC 4579, August 2006.

5.2. Informative References

[FRAMEWORK] Mahy, R., Sparks, R., Rosenberg, J., Petrie, D., and A. Johnston, "A Call Control and Multi-party usage framework for the Session Initiation Protocol (SIP)", Work in Progress, April 2008.

[GRUU] Rosenberg, J., "Obtaining and Using Globally Routable User Agent (UA) URIs (GRUU) in the Session Initiation Protocol (SIP)", Work in Progress, October 2007.

[RFC3665] Johnston, A., Donovan, S., Sparks, R., Cunningham, C., and K. Summers, "Session Initiation Protocol (SIP) Basic Call Flow Examples", BCP 75, RFC 3665, December 2003.

[RFC3725] Rosenberg, J., Peterson, J., Schulzrinne, H., and G. Camarillo, "Best Current Practices for Third Party Call Control (3pcc) in the Session Initiation Protocol (SIP)", BCP 85, RFC 3725, April 2004.

[RFC4317] Johnston, A. and R. Sparks, "Session Description Protocol (SDP) Offer/Answer Examples", RFC 4317, December 2005.

[RFC4475] Sparks, R., Hawrylyshen, A., Johnston, A., Rosenberg, J., and H. Schulzrinne, "Session Initiation Protocol (SIP) Torture Test Messages", RFC 4475, May 2006.

[TRANSFER] Sparks, R. and A. Johnston, "Session Initiation Protocol Call Control - Transfer", Work in Progress, September 2008.

Authors' Addresses ๐Ÿ’Œ

Alan Johnston (editor) Avaya St. Louis, MO 63124

EMail: alan@sipstation.com

Robert J. Sparks Tekelec

EMail: RjS@nostrum.com

Chris Cunningham Cisco Systems

EMail: chrcunni@cisco.com

Steve Donovan Cisco Systems

EMail: srd@cisco.com

Kevin Summers Sonus Plano, TX 75093

EMail: ksummers@sonusnet.com

Okay bestie, time for the legal stuff ๐Ÿ’… The copyright belongs to The IETF Trust (2008), and this document is subject to the rights, licenses and restrictions in BCP 78. Except for what BCP 78 says, the authors keep all their rights ๐ŸŽ€

The document and everything in it is handed over "AS IS" ๐Ÿซถ and, no cap, that is a LOT of disclaimers. THE CONTRIBUTOR, the organization they represent or are sponsored by (if there is one), the Internet Society, the IETF Trust and the Internet Engineering Task Force all say they're not promising anything, expressed or implied. That includes no promise that using the info won't infringe anyone's rights, and no implied promise of merchantability or fitness for a particular purpose ๐Ÿ˜ญ


Intellectual Property ๐Ÿ’–

The IETF is not picking a side on whether any Intellectual Property Rights (or other rights) that someone claims over this technology are valid, how far they reach, or whether you can get a license for them ๐Ÿงš It also hasn't done its own digging to find any of those rights. If you want the procedures for rights in RFC documents, check out BCP 78 and BCP 79 ๐ŸŒธ

Copies of IPR disclosures sent to the IETF Secretariat are a thing, and so are any assurances of licenses. You can also find the result of any attempt to get a general license or permission for implementers or users of this spec. All of it lives in the IETF's online IPR repository at http://www.ietf.org/ipr ๐Ÿ”ฅ

The IETF also invites anyone to flag copyrights, patents, patent applications or other proprietary rights that might cover technology needed to implement this standard. Send that info to the IETF at ietf-ipr@ietf.org ๐Ÿฆ‹ We love a team player โœจ

๐Ÿ“ฆ where this page comes from