RFC 5359
Session Initiation Protocol Service Examples
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
Full Copyright Statement โจ
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
- ietf: rfc5359 2008-10
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms