RFC 3087
Control of Service Context using SIP Request-URI
RFC 3087: Control of Service Context using SIP Request-URI π
Okay bestie, this one is RFC 3087, Control of Service Context using SIP Request-URI π§ It's Informational, so it's sharing ideas and advice, not laying down a rulebook π B. Campbell and R. Sparks from dynamicsoft wrote it, and it came out in April 2001. Its header doesn't list anything it obsoletes or updates, so no drama there π
Status of This Memo πΈ
This memo is just here to inform the Internet community. It does not specify an Internet standard of any kind, and it can be distributed as much as people want (distribution is unlimited) π
Copyright Notice β¨
Copyright (C) The Internet Society (2001). All Rights Reserved. π₯
Abstract π¦
This memo is an info drop for the Internet community. It describes a useful way to think about using the standard SIP (Session Initiation Protocol) Request-URI (Uniform Resource Identifier). The authors and lots of people in the SIP community think it's a solid convention to follow π«Ά It doesn't define any new protocol compared to RFC 2543.
In a regular telephony setup, fancy extended services often rely on call state info, like the calling party, the called party, the reason for a forward, and so on, to figure out what's going on. In a SIP/2.0 call, though, a lot of that info might be missing or just not reliable π So this document proposes a mechanism for passing context info along to an application. With this approach, a client or proxy can communicate context through a distinctive Request-URI. The doc then keeps going with examples of how this could work in a voice mail application π
Table of Contents π
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . 3
2. Example Application . . . . . . . . . . . . . . . . . . . 3
2.1 Using URIs to Control Voice Mail Service Behavior . . . . 3
3. Voice Mail Scenario Descriptions . . . . . . . . . . . . . 5
3.1 Deposits . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.1 Direct Request to Deposit to a particular mailbox . . . . 5
3.1.1.1 SIP source . . . . . . . . . . . . . . . . . . . . . . . . 5
3.1.1.2 Arbitrary PSTN source . . . . . . . . . . . . . . . . . . 5
3.1.1.3 Recognized PSTN source . . . . . . . . . . . . . . . . . . 6
3.1.2 Direct Request to Deposit, mailbox to be determined . . . 6
3.1.2.1 SIP source . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.2.2 PSTN source . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.2.3 Indirect Request to Deposit, due to find-me proxy decision 6
3.2 Retrievals . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2.1 Request to Retrieve from a particular mailbox . . . . . . 7
3.2.1.1 Trusted SIP source . . . . . . . . . . . . . . . . . . . . 7
3.2.1.2 Authenticated SIP source . . . . . . . . . . . . . . . . . 7
3.2.1.3 Unauthenticated SIP source . . . . . . . . . . . . . . . . 7
3.2.1.4 PSTN source . . . . . . . . . . . . . . . . . . . . . . . 7
3.2.2 Request to Retrieve, mailbox to be determined . . . . . . 7
3.2.2.1 SIP source . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2.2.2 Arbitrary PSTN source . . . . . . . . . . . . . . . . . . 8
3.2.2.3 Recognized PSTN source . . . . . . . . . . . . . . . . . . 8
4. Voice Mail Call Flow Examples . . . . . . . . . . . . . . 8
4.1 Generic Scenario . . . . . . . . . . . . . . . . . . . . . 8
4.1.1 Direct call to the voice mail system . . . . . . . . . . . 8
4.2 Message Deposit Scenarios . . . . . . . . . . . . . . . . 13
4.2.1 Call to known subscriber forwarded on no answer . . . . . 13
4.2.2 Call to known subscriber forwarded on busy . . . . . . . . 19
4.2.3 Direct call to a subscriber's mailbox . . . . . . . . . . 24
4.3 Message Retrieval Scenarios . . . . . . . . . . . . . . . 29
4.3.1 Call to retrieve messages believed to be from a known
subscriber . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.2 Call to retrieve messages from an authenticated subscriber 33
5. Security Considerations . . . . . . . . . . . . . . . . . 38
6. Acknowledgments . . . . . . . . . . . . . . . . . . . . . 38
References . . . . . . . . . . . . . . . . . . . . . . . . 38
Authors' Addresses . . . . . . . . . . . . . . . . . . . . 38
Full Copyright Statement . . . . . . . . . . . . . . . . . 39
1. Introduction π
Okay so a communication service should totally use whatever info it already has when someone shows up π Think about most voice mail systems: a subscriber checking messages from their own desk doesn't have to type in their mailbox number again. The service just assumes the store being accessed is the one tied to the endpoint they're using. Some services even let the user confirm that assumption with IVR techniques before asking for a PIN π
This idea of context-awareness can be captured in a voice mail service that implements SIP as defined in RFC 2543[1], with no modifications needed, just through the standard use of that protocol's Request-URI β¨ And honestly, the idea works for any SIP-based service where the starting application state should be figured out from context π¦
This is a usage convention on top of standard SIP as defined in RFC 2543[1]. It doesn't modify or extend that protocol in any way, so nothing changes under the hood π
2. Example Application π
In this doc, voice mail is the example we use to show off the technique π One big reason to apply this to voice mail is that it lets a proxy or location server control the starting state of a voice service. For example, a voice client might register a contact list that ends with the URL that accepts voice messages for that client π§
2.1 Using URIs to Control Voice Mail Service Behavior π¬
Lots of conventional voice mail systems use call state info, like the calling party, the called party, the reason for the forward, etc, to decide what the starting state should be π€ For instance, one outgoing message might play if the call hit voice mail because the called party didn't answer, and a different one if the line was busy. The system also works out who the message is for based on the called party info. And if the call came from a subscriber's own phone number, it might authenticate the caller and then jump straight into the message retrieval and account maintenance menu π₯
When a new subscriber gets added to a system, a set of identities could be generated, and each one gets a unique sip URI. The tables below show some of the identities that might get generated (it's not exhaustive, so there's more out there π). The example schemes show that the URIs could, but don't necessarily have to, have mnemonic value π
In real-world applications, it's important that an application doesn't apply semantic rules to the various URIs. Instead, it should allow any arbitrary string to be provisioned, and map that string to the desired behavior π The owner of the system may choose to provision mnemonic strings, but the application shouldn't require it. In any big installation, the system owner probably already has rules for mnemonic URIs, and if an application tried to define its own rules, that could cause a conflict π For our example, this means a voice mail system should allow an arbitrary mix of URLs from these schemes, or any other scheme that makes valid SIP URIs, to be provisioned, rather than enforcing one particular scheme π«Ά
URI Identity Example Scheme 1
Example Scheme 2
Example Scheme 3
Deposit with sip:sub-rjs-deposit@vm.wcom.com
standard greeting sip:677283@vm.wcom.com
sip:rjs@vm.wcom.com;mode=deposit
Deposit with on sip:sub-rjs-deposit-busy.vm.wcom.com
phone greeting sip:677372@vm.wcom.com
sip:rjs@vm.wcom.com;mode=3991243
Deposit with sip:sub-rjs-deposit-sg@vm.wcom.com
special greeting sip:677384@vm.wcom.com
sip:rjs@vm.wcom.com;mode=sg
Retrieve - SIP sip:sub-rjs-retrieve@vm.wcom.com
authentication sip:677405@vm.wcom.com
sip:rjs@vm.wcom.com;mode=retrieve
Retrieve - prompt sip:sub-rjs-retrieve-inpin.vm.wcom.com
for PIN in-band sip:677415@vm.wcom.com
sip:rjs@vm.wcom.com;mode=inpin
When a service is first set up, identities like these could be created π§
URI Identity Example Scheme 1
Example Scheme 2
Example Scheme 3
Deposit - sip:deposit@vm.wcom.com
identify target sip:670001@vm.wcom.com
mailbox by To: sip:deposit@vm.wcom.com
Retrieve - sip:retrieve@vm.wcom.com
identify target sip:670002@vm.wcom.com
mailbox by SIP sip:retrieve@vm.wcom.com
authentication
Deposit - prompt sip:deposit-in@vm.wcom.com
for target sip:670003@vm.wcom.com
mailbox in-band sip:deposit@vm.wcom.com;mode=inband
Retrieve - prompt sip:retrieve-in@vm.wcom.com
for target sip:670004@vm.wcom.com
mailbox and PIN sip:retrieve@vm.wcom.com;mode=inband
in-band
Besides handing this set of URIs to the subscriber (to use however they like π ), an integrated service provider could add them to the set of contacts in a find-me proxy. The proxy could then route calls to the right URI based on where the request came from, the subscriber's preferences, and their current state π¦
3. Voice Mail Scenario Descriptions π
In each of these scenarios, the PSTN gateway is configured to communicate only with one particular proxy-registrar πΈ
3.1 Deposits π₯
3.1.1 Direct Request to Deposit to a particular mailbox β¨
3.1.1.1 SIP source
A SIP client that knows the URI for a particular deposit mailbox (sip:sub-rjs-deposit@vm.wcom.com) can send a direct invitation to the voice mail service, or send it through a protecting proxy π The proxy could restrict access to deposit identities with special greetings by authenticating the requester π
3.1.1.2 Arbitrary PSTN source
The gateway's proxy would map a call from an unrecognized PSTN number, one tied to a subscriber's mailbox, into an invite to the deposit with standard greeting URI (sip:sub-rjs-deposit@vm.wcom.com) π
3.1.1.3 Recognized PSTN source
The gateway's proxy would map a call from a recognized PSTN number (an exact or pattern match) that's tied to a subscriber's mailbox into an invite to the appropriate special greeting URI (sip:sub-rjs-deposit-sg@vm.wcom.com) π The gateway's ability to identify the calling party (using the calling party number) is trusted, so no further authentication of the requester gets done π«Ά
3.1.2 Direct Request to Deposit, mailbox to be determined π§
3.1.2.1 SIP source π¦
Okay so a voice mail service (or its protecting proxy) could expose a generic deposit URL π for when a caller just wants to go straight to voice mail. The service would likely play an IVR dialog to figure out which message store the message should go into π
Now here's the tea β An app designer might be tempted to match the To: and From: headers on a call to infer stuff. Bestie, that can get messy when multiple proxy forwards happen in one call π Say A calls B, and B has all calls forwarded to C. C forwards the call to her voice mail service. If that service matches the To: header to pick the message store, it'll grab the info for B instead of C. And there's no reason to assume C's voice mail service knows anything about B π
3.1.2.2 PSTN source π
The gateway's proxy would map a call from an unrecognized PSTN number that dials the top-level voice mail service access number to an invite to the Deposit - prompt for target mailbox in-band URI (sip:deposit-in@vm.wcom.com for example). Getting the call to the target mailbox would proceed as in the SIP source case πΈ
3.1.2.3 Indirect Request to Deposit, due to find-me proxy decision π§
A find-me proxy could map an invitation to a subscriber (sip:rjs@wcom.com) to the right voice mail service URI, depending on the subscriber's current state. The normal deposit URI could be chosen if the subscriber's contact list has been exhausted with no answer π΅ The busy-announcement URI would be chosen when a busy everywhere response comes back from one of the contacts π A DND announcement URI could be selected if the subscriber had activated DND π And calls to sip:receptionist@wcom.com could be configured to roll over to sip:deposit@wcom.com β¨
3.2 Retrievals π
3.2.1 Request to Retrieve from a particular mailbox π
3.2.1.1 Trusted SIP source π
A request to retrieve the contents of a particular mailbox (sip:sub-rjs-retrieve@vm.wcom.com) coming from a trusted source could be honored without further authentication checks. A trusted source is one the voice mail service has secure communications with, and one it's willing to delegate authentication to. This could be the service's protecting proxy, for example π«Ά
3.2.1.2 Authenticated SIP source πͺͺ
A service, or its protecting proxy, could choose to honor a retrieve request for a particular mailbox (sip:sub-rjs-retrieve@vm.wcom.com) based on SIP authentication. If SIP level authentication fails, the service or proxy could be configured to send the call to the in-band pin prompting URI (sip:sub-rjs-retrieve-inpin@vm.wcom.com) π
3.2.1.3 Unauthenticated SIP source π»
A service, or its protecting proxy, that receives a retrieve request for a particular mailbox (sip:sub-rjs-retrieve@vm.wcom.com) with no other way of authenticating the requestor could send the request to the in-band pin prompting URI (sip:sub-rjs-retrieve-inpin@vm.wcom.com) π
3.2.1.4 PSTN source π±
This scenario assumes the service provider's network has been configured so that a PSTN number could be dialed explicitly to retrieve messages from a particular mailbox. Such services exist, but they aren't common π In that kind of network, the gateway's proxy would map the call to the in-band pin prompting URI (sip:sub-rjs-retrieve-inpin@vm.wcom.com) π
3.2.2 Request to Retrieve, mailbox to be determined π΅οΈββοΈ
3.2.2.1 SIP source π¬
Just like the Request to Deposit scenario, when a service gets a request for the top-level retrieve URI, it would most likely need in-band IVR techniques to figure out the target mailbox and authenticate the caller π§©
3.2.2.2 Arbitrary PSTN source βοΈ
This scenario assumes there's a single PSTN number that subscribers dial to reach the voice mail service and retrieve messages. This is the most common access method offered by current voice mail services π
The gateway's proxy would map a call to the top-level PSTN number onto the top-level retrieve in-band prompting URI (sip:retrieve-in@vm.wcom.com). Once the system identifies the target mailbox, the call would be transferred to the appropriate in-band pin prompting URI (sip:sub-rjs-retrieve-inpin@vm.wcom.com) π¦
3.2.2.3 Recognized PSTN source π
This scenario also assumes there's a single PSTN number that subscribers dial to retrieve messages.
The gateway's proxy would recognize the calling party number as a subscriber and map the call to that subscriber's in-band prompting URI (sip:sub-rjs-retrieve-inpin@vm.wcom.com) π
4 Voice Mail Call Flow Examples β¨
The following section walks through some example call flows for a hypothetical voice mail service, with the host name vm.wcom.com π¬ All of the call flows assume that a proxy protects the voice mail service, and that a trust relationship exists between the voice mail service and that proxy π«Ά
4.1 Generic Scenario πΈ
4.1.1. Direct call to the voice mail system ππ
okay so User A calls the voice mail system directly, no middleman needed π«Ά The voice mail system pulls up the top-level menu, which might ask the caller to punch in an extension or spell out the first few letters of a name. main character energy β¨
User A Proxy VM Service
| | |
| INVITE F1 | |
|------------------>| |
| | INVITE F2 |
| (100 Trying) F3 |---------------------->|
|<------------------| |
| | 180 Ringing F4 |
| 180 Ringing F5 |<----------------------|
|<------------------| |
| | 200 OK F6 |
| 200 OK F6 |<----------------------|
|<------------------| |
| | |
| ACK F8 | |
|------------------>| ACK F9 |
| |---------------------->|
| | |
| RTP Established- Play top level menu |
|<-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m->|
| | |
| BYE F10 | |
|------------------>| BYE F11 |
| |---------------------->|
| | |
| | 200 OK F12 |
| |<----------------------|
| 200 OK F13 | |
|<------------------| |
| | |
now the receipts π§Ύ here's every single message, flow by flow, so you can see exactly what's being sent (no skipping, bestie π)
Flow Id Comments
INVITE F1 INVITE sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Proxy-Authorization:Digest username="UserA",
realm="MCI WorldCom SIP",
nonce="ea9c8e88df84f1cc4e341ae6cbe5a359", opaque="",
uri="sip:VoiceMail@wcom.com", response=<appropriately
calculated hash goes here>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/*Client for A prepares to receive data on port 49170
from the network. */
INVITE F2 INVITE sip:top@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
(100 Trying SIP/2.0 100 Trying
F3 Via: SIP/2.0/UDP here.com:5060
Proxy->A) From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
180 Ringing SIP/2.0 180 Ringing
F4 Via: SIP/2.0/UDP wcom.com:5060; branch=1
VM->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
180 Ringing SIP/2.0 180 Ringing
F5 Via: SIP/2.0/UDP here.com:5060
Proxy->A From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
200 OK F6 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: VoiceMailSystem <sip:top@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F7 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact VoiceMailSystem <sip:top@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
ACK F8 ACK sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip:top@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
ACK F9 ACK sip:top@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>; tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and VM. VM
system starts IVR dialog for top level menu */
/* User A Hangs Up with VM system. Alternatively, the
VM system could initiate the BYE*/
BYE F10 BYE sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip: top@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
BYE F11 BYE sip: top@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F12 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F13 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
4.2. Message Deposit Scenarios β¨π
4.2.1 Call to known subscriber forwarded on no answer π
okay so bestie, this one is a whole drama πΏ User A calls UserB, but UserB just... doesn't pick up π So the call gets forwarded to UserB's mailbox, and the voice mail system plays UserB's outgoing message for a ring-no-answer. The flow assumes that the URL sip:UserB-dep-fna@vm.wcom.com maps to the desired behavior for depositing a message on a forward-no-answer β¨
User A Proxy User B VM System
| | | |
| INVITE F1 | | |
|---------------->| INVITE F2 | |
| |----------------->| |
| (100 Trying) F3 | | |
|<----------------| 180 Ringing F4 | |
| |<-----------------| |
| 180 Ringing F5 | | |
|<----------------| (Request Timeout)| |
| | | |
| | Cancel F6 | |
| |----------------->| |
| | | |
| | 200 OK F7 | |
| |<-----------------| |
| | | |
| | INVITE F8 |
| |---------------------------------->|
| | | |
| | 200 OK F9| |
| 200 OK F10 |<----------------------------------|
|<----------------| | |
| | | |
| ACK F11 | | |
|---------------->| ACK F12 | |
| |---------------------------------->|
| | | |
| RTP Established Both Ways-Deposit Msg for B |
|<-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m->|
| | | |
| BYE F13 | | |
|---------------->| BYE F14 | |
| |---------------------------------->|
| | | |
| | OK F15 | |
| OK F16 |<----------------------------------|
|<----------------| | |
| | | |
Now let's go message by message, because the details are where the magic is π§
Flow Id Comments
INVITE F1 INVITE sip:UserB@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Proxy-Authorization:Digest username="UserA",
realm="MCI WorldCom SIP",
nonce="ea9c8e88df84f1cec4341ae6cbe5a359", opaque="",
uri="sip:UserB@wcom.com", response=<appropriately
calculated hash goes here>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/*Client for A prepares to receive data on port 49170
from the network. */
INVITE F2 INVITE sip:UserB1@somewhere.wcom.com SIP/2.0
Proxy->B1 Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
(100 Trying SIP/2.0 100 Trying
F3 Via: SIP/2.0/UDP here.com:5060
Proxy->A) From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
180 Ringing SIP/2.0 180 Ringing
F4 Via: SIP/2.0/UDP wcom.com:5060; branch=1
B1->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
180 Ringing SIP/2.0 180 Ringing
F5 Via: SIP/2.0/UDP here.com:5060
Proxy->A From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
/* B1 rings for 9 seconds, this duration is a
configurable parameter in the Proxy Server. Proxy
sends Cancel and proceeds down the list of routes,
eventually hitting the voice mail URI for forward no
answer */
CANCEL F6 CANCEL sip:UserB1@wcom.com SIP/2.0
Proxy->B1 Via: SIP/2.0/UDP wcom.com:5060; branch=1
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 CANCEL
Content-Length: 0
200 OK F7 SIP/2.0 200 OK
B1->Proxy Via: SIP/2.0/UDP wcom.com:5060; branch=1
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 CANCEL
Content-Length: 0
INVITE F8 INVITE sip:UserB-dep-fna@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060;branch=2
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F9 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060; branch=2
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheLittleGuyVoiceMail <sip:UserB-dep-
fna@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F10 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheLittleGuyVoiceMail <sip:UserB-dep-
fna@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
ACK F11 ACK sip:UserB@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip: UserB-dep-fna@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
ACK F12 ACK sip:UserB-dep-fna@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and B2. VM
system starts IVR dialog for message-deposit on no-
answer for UserB */
/* User A Hangs Up with VM system. Alternatively, the
VM system could initiate the BYE*/
BYE F13 BYE sip:UserB@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip: UserB-dep-fna@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
BYE F14 BYE sip: UserB-dep-fna@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F15 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F16 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
That's the whole forward-no-answer dance, start to finish π¦ Bestie, you literally just watched a call bounce from UserB to the voice mail system and back out again, all in one flow π
4.2.2. Call to known subscriber forwarded on busy β¨
okay so User A tries to call UserB, but UserB is busy ππ the call gets forwarded straight to UserB's mailbox, and the voice mail system plays UserB's outgoing message for busy π this flow assumes that "sip:UserB-dep-fb@vm.wcom.com" maps to UserB's mailbox and the behavior of "deposit message on busy." π
User A Proxy User B VM System
| | | |
| INVITE F1 | | |
|---------------->| INVITE F2 | |
| (100 Trying) F3 | | |
|<----------------| 486 Busy Here F4 | |
| |<-----------------| |
| | | |
| | ACK F5 | |
| |----------------->| |
| | | |
| | INVITE F6 |
| |---------------------------------->|
| | | |
| | 200 OK F7| |
| 200 OK F8 |<----------------------------------|
|<----------------| | |
| | | |
| ACK F9 | | |
|---------------->| ACK F10 | |
| |---------------------------------->|
| | | |
| RTP Established Both Ways-Deposit Msg for B |
|<-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m->|
| | | |
| BYE F11 | | |
|---------------->| BYE F12 | |
| |---------------------------------->|
| | | |
| | OK F13 | |
| OK F14 |<----------------------------------|
|<----------------| | |
| | | |
Now let's go through every single message, because the details are where the magic is π§π
Flow Id Comments
INVITE F1 INVITE sip:UserB@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Proxy-Authorization:Digest username="UserA",
realm="MCI WorldCom SIP",
nonce="ea9c8e88df84f1cec4341ae6cbe5a359", opaque="",
uri="sip:UserB@wcom.com", response=<appropriately
calculated hash goes here>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/*Client for A prepares to receive data on port 49170
from the network. */
INVITE F2 INVITE sip:UserB1@somewhere.wcom.com SIP/2.0
Proxy->B1 Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
(100 Trying SIP/2.0 100 Trying
F3 Via: SIP/2.0/UDP here.com:5060
Proxy->A) From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
486 Busy SIP/2.0 486 Busy Here
Here F4 Via: SIP/2.0/UDP wcom.com:5060;branch=1
B1->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
ACK F5 ACK sip: UserB1@wcom.com SIP/2.0
Proxy->B Via: SIP/2.0/UDP wcom.com:5060; branch=1
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=123456
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
INVITE F6 INVITE sip:UserB-dep-fb@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060;branch=2
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F7 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060; branch=2
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheLittleGuyVoiceMail <sip:UserB-dep-
fb@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F8 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact TheLittleGuyVoiceMail <sip:UserB-dep-
fb@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
ACK F9 ACK sip:UserB@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip:UserB-dep-fb@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
ACK F10 ACK sip:UserB-dep-fb@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and B2. VM
system starts IVR dialog for message-deposit on busy
for UserB */
/* User A Hangs Up with VM system. Alternatively, the
VM system could initiate the BYE*/
BYE F11 BYE sip:UserB@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route: <sip:UserB-dep-fnb@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
BYE F12 BYE sip: UserB-dep-fnb@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F13 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F14 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuy <sip:UserB@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
That's the whole busy-forward dance, bestie! π¦ User A gets a 486 from UserB, the proxy reroutes everything to the voice mail system, and A leaves the message π Honestly, iconic π
4.2.3. Direct call to a subscriber's mailbox π¬π¦
okay so this one is the "I'm calling the mailbox directly" flow π User A dials UserB's mailbox straight up. The whole thing assumes that "sip:UserB-dep@vm.wcom.com" maps to UserB's mailbox, and that the "generic message deposit" behavior is what happens π
The vibe of the call goes like this β¨ INVITE F1 goes from A to the proxy, then the proxy sends INVITE F2 to the VM service. A gets a 100 Trying (F3), and the VM service sends back a 200 OK (F4) which the proxy passes along as F5. A sends ACK F6, the proxy forwards it as ACK F7, and then RTP goes both ways while the message is deposited π§ When that's done, BYE F8 and BYE F9 get sent, the VM system replies with 200 OK F10, and the proxy sends 200 OK F11 back to A π«Ά
User A Proxy VM Service
| | |
| INVITE F1 | |
|------------------>| |
| | INVITE F2 |
| (100 Trying) F3 |---------------------->|
|<------------------| |
| | 200 OK F4 |
| 200 OK F5 |<----------------------|
|<------------------| |
| | |
| ACK F6 | |
|------------------>| ACK F7 |
| |---------------------->|
| | |
| RTP Both Ways - Deposit Msg for B |
|<-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m->|
| | |
| BYE F8 | |
|------------------>| BYE F9 |
| |---------------------->|
| | |
| | 200 OK F10 |
| |<----------------------|
| 200 OK F11 | |
|<------------------| |
| | |
Flow Id Comments
INVITE F1 INVITE sip:UserB-VM@vm.wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-VM@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Proxy-Authorization:Digest username="UserA",
realm="MCI WorldCom SIP",
nonce="ea9c8e88df84f1cec4341ae6cbe5a359", opaque="",
uri="sip:UserB-VM@wcom.com", response=<appropriately
calculated hash goes here>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/*Client for A prepares to receive data on port 49170
from the network. */
INVITE F2 INVITE sip:UserB-dep@vm.wcom.com SIP/2.0
Proxy->B1 Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB-VM@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-VM@vm.wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
(100 Trying SIP/2.0 100 Trying
F3 Via: SIP/2.0/UDP here.com:5060
Proxy->A) From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-VM@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
200 OK F4 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB-VM@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheLittleGuyVoiceMail <sip:UserB-
dep@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F5 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:UserB-VM@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact TheLittleGuyVoiceMail <sip:UserB-
dep@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
ACK F6 ACK sip:UserB-VM@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip:UserB-dep@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
ACK F7 ACK sip:UserB-dep@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and VM. VM
system starts IVR dialog for generic message-deposit
for UserB */
/* User A Hangs Up with VM system. Alternatively, the
VM system could initiate the BYE*/
BYE F8 BYE sip:UserB-VM@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip:UserB-dep@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
BYE F9 BYE sip: UserB-dep@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F10 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F11 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: TheLittleGuyVoiceMail <sip:UserB-
VM@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
4.3. Message Retrieval Scenarios π§π
4.3.1 Call to retrieve messages believed to be from a known subscriber β¨
Okay so, someone at UserA's desk uses a SIP client to call the voice mail system and check their messages ππ. The client has already authenticated to the proxy with credentials assigned to the device, so the proxy can make a lowkey safe guess that the caller is the device owner π. The URI sip:UserA-retrieve@vm.wcom.com maps to UserA's mailbox, and its behavior is "retrieve messages after prompting for and verifying PIN" π. The VM System only trusts the proxy and won't accept calls from any untrusted source π
ββοΈ. That means the proxy blocks direct calls to UserA-retrieve@vm.wcom.com, and it only forwards calls placed to VoiceMail@wcom.com over to UserA-retrieve@vm.wcom.com when they come from a client device assigned to UserA. Main character security, honestly π¦.
User A Proxy VM Service
| | |
| INVITE F1 | |
|------------------>| |
| | INVITE F2 |
| (100 Trying) F3 |---------------------->|
|<------------------| |
| | 200 OK F4 |
| 200 OK F5 |<----------------------|
|<------------------| |
| | |
| ACK F6 | |
|------------------>| ACK F7 |
| |---------------------->|
| | |
| RTP Both Ways - VM prompts for PIN
|<-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m->|
| | |
| BYE F8 | |
|------------------>| BYE F9 |
| |---------------------->|
| | |
| | 200 OK F10 |
| |<----------------------|
| 200 OK F11 | |
|<------------------| |
| | |
Here's the full message breakdown, step by step, so you can see exactly who says what and when π π
Flow Id Comments
INVITE F1 INVITE sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Proxy-Authorization:Digest username="UserAPhone",
realm="MCI WorldCom SIP",
nonce="ea9c8e88df84f1cec4341ae6cbe5a359", opaque="",
uri="sip:VoiceMail@wcom.com", response=<appropriately
calculated hash goes here>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/*Client for A prepares to receive data on port 49170
from the network. */
INVITE F2 INVITE sip:UserA-retrieve@vm.wcom.com SIP/2.0
Proxy->B1 Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
(100 Trying SIP/2.0 100 Trying
F3 Via: SIP/2.0/UDP here.com:5060
Proxy->A) From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
200 OK F4 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: VoiceMailSystem <sip:UserA-
retrieve@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F5 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact VoiceMailSystem <sip: UserA-
retrieve@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
ACK F6 ACK sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip:UserA-retrieve@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
ACK F7 ACK sip:UserA-retrieve@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>; tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and VM. VM
determines that the call is likely from UserA, and
starts a message retrieval session, prompting for
PIN*/
/* User A Hangs Up with VM system. Alternatively, the
VM system could initiate the BYE*/
BYE F8 BYE sip: VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip:UserA-retrieve@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
BYE F9 BYE sip: UserA-retrieve@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F10 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F11 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
4.3.2. Call to retrieve messages from an authenticated subscriber β¨
okay so this one is giving trusted insider energy π«Ά UserA calls the voice mail system to retrieve their messages. The caller is authenticated with UserA's credentials, and sip:UserA-retrieve-auth@vm.wcom.com maps to UserA's mailbox and the "retrieve messages" behavior. The voice mail service trusts the proxy not to forward any calls to that URI unless the call has been authenticated as coming from UserA. π
Given all of that, the VM service may choose not to require a PIN for calls to this URI. The vibe is "already verified, no need to ask again" π
Here's the whole call flow, from the INVITE to the final 200 OK:
User A Proxy VM Service
| | |
| INVITE F1 | |
|------------------>| |
| | INVITE F2 |
| (100 Trying) F3 |---------------------->|
|<------------------| |
| | 200 OK F4 |
| 200 OK F5 |<----------------------|
|<------------------| |
| | |
| ACK F6 | |
|------------------>| ACK F7 |
| |---------------------->|
| | |
| RTP Both Ways - Deposit Msg for B |
|<-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m-m->|
| | |
| BYE F8 | |
|------------------>| BYE F9 |
| |---------------------->|
| | |
| | 200 OK F10 |
| |<----------------------|
| 200 OK F11 | |
|<------------------| |
| | |
And here's every message, flow by flow, with the exact headers and bodies π
Flow Id Comments
INVITE F1 INVITE sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Proxy-Authorization:Digest username="UserA",
realm="MCI WorldCom SIP",
nonce="ea9c8e88df84f1cec4341ae6cbe5a359", opaque="",
uri="sip:VoiceMail@wcom.com", response=<appropriately
calculated hash goes here>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/*Client for A prepares to receive data on port 49170
from the network. */
INVITE F2 INVITE sip:UserA-retrieve-auth@vm.wcom.com SIP/2.0
Proxy->B1 Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: TheBigGuy <sip:UserA@here.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserA 2890844526 2890844526 IN IP4 client.here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
(100 Trying SIP/2.0 100 Trying
F3 Via: SIP/2.0/UDP here.com:5060
Proxy->A) From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Content-Length: 0
200 OK F4 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060; branch=1
Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact: VoiceMailSystem <sip:UserA-retrieve-
auth@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
200 OK F5 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
Record-Route: <sip:VoiceMail@wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 INVITE
Contact VoiceMailSystem <sip: UserA-retrieve-
auth@vm.wcom.com>
Content-Type: application/sdp
Content-Length: <appropriate value>
v=0
o=UserB 2890844527 2890844527 IN IP4 vm.wcom.com
s=Session SDP
c=IN IP4 110.111.112.114
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
ACK F6 ACK sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route: <sip:UserA-retrieve-auth@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
ACK F7 ACK sip:UserA-retrieve-auth@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>; tag=3145678
Call-Id: 12345600@here.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and VM. VM
determines that the call is likely from UserA, and
starts a message retrieval session. Since the proxy
has already authenticated the identity of UserA, the
VM does not need to prompt for PIN. */
/* User A Hangs Up with VM system. Alternatively, the
VM system could initiate the BYE*/
BYE F8 BYE sip:VoiceMail@wcom.com SIP/2.0
A->Proxy Via: SIP/2.0/UDP here.com:5060
Route:<sip:UserA-retrieve-auth@vm.wcom.com>
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
BYE F9 BYE sip: UserA-retrieve-auth@vm.wcom.com SIP/2.0
Proxy->VM Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F10 SIP/2.0 200 OK
VM->Proxy Via: SIP/2.0/UDP wcom.com:5060
Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
200 OK F11 SIP/2.0 200 OK
Proxy->A Via: SIP/2.0/UDP here.com:5060
From: TheBigGuy <sip:UserA@here.com>
To: VoiceMail <sip:VoiceMail@wcom.com>;tag=3145678
Call-Id: 12345600@here.com
CSeq: 2 BYE
Content-Length: 0
5. Security Considerations π
okay, serious moment, bestie π This document describes a usage of SIP/2.0 as defined by RFC 2543[1]. It adds no additions, no modifications, and no restrictions to the protocol defined there. So any implementation of the ideas in this document is subject to the issues discussed in RFC 2543[1]. Go read those too, no skipping π
6. Acknowledgments π«Ά
The authors want to thank Chris Cunningham, Steve Donovan, Alan Johnston, Henry Sinnreich, Kevin Summers, John Truetken, and Dean Willis for their discussion of and contribution to this work. Legends, all of them β¨
References
[1] Handley, M., Schulzrinne, H., Schooler, E. and J. Rosenberg, "SIP: Session Initiation Protocol", RFC 2543, March 1999.
Authors' Addresses π
Ben Campbell
dynamicsoft
5100 Tennyson Parkway
Suite 1200
Plano, TX 75024
EMail: bcampbell@dynamicsoft.com
Robert J. Sparks
dynamicsoft
5100 Tennyson Parkway
Suite 1200
Plano, TX 75024
EMail: rsparks@dynamicsoft.com
Full Copyright Statement Β©
Copyright (C) The Internet Society (2001). All Rights Reserved.
This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English.
The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.
This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Acknowledgement π
Funding for the RFC Editor function is currently provided by the Internet Society. π
π¦ where this page comes from
- ietf: rfc3087 2001-04
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms