RFC 3666

Session Initiation Protocol (SIP) Public Switched Telephone Network (PSTN) Call Flows

πŸ“… published January 2004, from ietf

RFC 3666: SIP to PSTN Call Flows πŸ“žβœ¨

Session Initiation Protocol (SIP) Public Switched Telephone Network (PSTN) Call Flows πŸ’–

Okay bestie, this one's from A. Johnston (MCI), S. Donovan, R. Sparks, C. Cunningham (dynamicsoft), and K. Summers (Sonus). It's from the Network Working Group and it's a Best Current Practice (that's BCP 76 πŸŽ€). It came out in December 2003. It doesn't list anything it obsoletes or updates, so no drama there 🫢


Status of this Memo 🌸

This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements. Distribution of this memo is unlimited.

Copyright (C) The Internet Society (2003). All Rights Reserved.

Abstract πŸ¦‹

Okay so this doc is full of best current practice examples of Session Initiation Protocol (SIP) call flows, and they show how SIP interworks with the Public Switched Telephone Network (PSTN) πŸ“ž The main players are SIP User Agents, SIP Proxy Servers, and PSTN Gateways. The scenarios are SIP to PSTN, PSTN to SIP, and PSTN to PSTN via SIP, which is giving full network drama πŸ“

For the PSTN side, it uses ISDN (Integrated Services Digital Network), ISUP (ISDN User Part), and FGB (Feature Group B) circuit associated signaling. The calls use global telephone numbers from the PSTN, plus private extensions served by a PBX (Private Branch Exchange). Call flow diagrams and message details are included too ✨

Table of Contents 🧚

   1.  Overview.....................................................   2
       1.1.  General Assumptions....................................   3
       1.2.  Legend for Message Flows...............................   4
       1.3.  SIP Protocol Assumptions...............................   5
   2.  SIP to PSTN Dialing..........................................   6
       2.1.  Successful SIP to ISUP PSTN call.......................   7
       2.2.  Successful SIP to ISDN PBX call........................  15
       2.3.  Successful SIP to ISUP PSTN call with overflow.........  23
       2.4.  Session established using ENUM Query...................  32
       2.5.  Unsuccessful SIP to PSTN call: Treatment from PSTN.....  38
       2.6.  Unsuccessful SIP to PSTN: REL w/Cause from PSTN........  45
       2.7.  Unsuccessful SIP to PSTN: ANM Timeout..................  49
   3.  PSTN to SIP Dialing..........................................  54
       3.1.  Successful PSTN to SIP call............................  55
       3.2.  Successful PSTN to SIP call, Fast Answer...............  62
       3.3.  Successful PBX to SIP call.............................  68
       3.4.  Unsuccessful PSTN to SIP REL, SIP error mapped to REL..  74
       3.5.  Unsuccessful PSTN to SIP REL, SIP busy mapped to REL...  76
       3.6.  Unsuccessful PSTN->SIP, SIP error interworking to tones  80
       3.7.  Unsuccessful PSTN->SIP, ACM timeout....................  84
       3.8.  Unsuccessful PSTN->SIP, ACM timeout, stateless Proxy...  88
       3.9.  Unsuccessful PSTN->SIP, Caller Abandonment.............  91
   4.  PSTN to PSTN Dialing via SIP Network.........................  96
       4.1.  Successful ISUP PSTN to ISUP PSTN call.................  97
       4.2.  Successful FGB PBX to ISDN PBX call with overflow...... 105
   5.  Security Considerations...................................... 113
   6.  References................................................... 115
       6.1.  Normative References................................... 115
       6.2.  Informative References................................. 115
   7.  Acknowledgments.............................................. 116
   8.  Intellectual Property Statement.............................. 116
   9.  Authors' Addresses........................................... 117
   10. Full Copyright Statement..................................... 118

1. Overview πŸŽ€

The call flows in this document were developed while designing a SIP IP communications network, so they're an example of a minimum set of functionality. It's giving "start small and make it work" energy πŸ’…

The authors really hope this document helps SIP implementers, designers, and protocol researchers alike, and that it moves things closer to a standard implementation of RFC 3261 [2]. These flows are carefully checked and working group reviewed scenarios of the most common SIP/PSTN interworking examples, and they're meant to be a companion to the specs 🫢

The call flows are based on the current version 2.0 of SIP in RFC 3261 [2], with SDP usage described in RFC 3264 [3]. Other RFCs also make up the SIP standard, but they aren't used in this set of basic call flows. The SIP/ISUP mapping is based on RFC 3398 [4] ✨

The PSTN signaling protocols in this document are ISDN (Integrated Services Digital Network), ISUP (ISDN User Part), and FGB (Feature Group B) circuit associated signaling. The doc mainly shows ANSI ISUP because of its practical origins. As used here, though, it's virtually identical to the ITU-T International ISUP that's the reference in [4] 🌈

Basic SIP call flow examples live in a companion document, RFC 3665 [10] πŸ¦‹

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14, RFC 2119 [1]. This part is serious, so pay attention πŸ‘‘

1.1. General Assumptions 🧚

There's a bunch of architecture, network, and protocol assumptions underneath the call flows here. Note that these assumptions are not requirements πŸ™ˆ They're laid out so you can keep them in mind and understand the call flow examples better.

The authentication of SIP User Agents in these example call flows is performed using HTTP Digest as defined in [3] and [5] πŸ”

Some Proxy Servers in these call flows insert Record-Route headers into requests, so they stay in the signaling path for future message exchanges. Main character behavior πŸ’œ

These flows show TLS, TCP, and UDP for transport. SCTP could also be used. See the discussion in RFC 3261 [2] for details on the transport issues for SIP 🌸

The SIP Proxy Server has access to a Location Service and other databases. The Request-URI and the context (From header) are enough to figure out which proxy or gateway the message should be routed to. In most cases, a primary and a secondary route get determined in case a Proxy or Gateway fails downstream. Backup plans, iconic ✨

Gateways provide tones (ringing, busy, etc) and announcements to the PSTN side based on SIP response messages. Or they pass along audio in-band tones (ringing, busy tone, etc.) in an early media stream to the SIP side 🎢

The Proxy and Gateway work together like this:

  • The SIP Proxy Server performs digit analysis and lookup and locates the correct gateway.
  • The SIP Proxy Server performs gateway location based on primary and secondary routing.

Telephone numbers are usually represented as SIP URIs. An alternative is the tel URI [6] πŸ“ž

This document shows typical examples of SIP/ISUP interworking. Even though it's in the spirit of the SIP-T framework [7], these examples don't represent a complete implementation of the framework. They're more of a minimal set for very basic SIP to ISUP interworking, rather than the bigger goal of ISUP transparency 🧠

Real talk: there are NO examples of encapsulated ISUP in this document. If there were, those messages would show S/MIME encryption, because this info is sensitive, as discussed in the SIP-T Framework security considerations section. (Note: RFC 3204 [8] has an example of an INVITE with encapsulated ISUP πŸ‘€) See the Security Considerations section for a more detailed discussion of the security of these call flows πŸ”’

In ISUP, the Calling Party Number is abbreviated as CgPN and the Called Party Number is abbreviated as CdPN. Other abbreviations include Numbering Plan Indicator (NPI) and Nature of Address (NOA) πŸ’–

1.2. Legend for Message Flows πŸ¦‹

Dashed lines (---) show signaling messages that are mandatory to the call scenario. These messages can be SIP or PSTN signaling. The arrow shows the direction of message flow ➑️

Double dashed lines (===) show media paths between network elements 🎧

Messages with parentheses around their name are optional messages πŸ™ƒ

Messages are labeled in the Figures as F1, F2, etc. Those labels point to the message details in the list that follows the Figure. Comments in the message details look like this:

   /* Comments. */

1.3. SIP Protocol Assumptions πŸ‘‘

This document doesn't prescribe the flows exactly as they're shown. The flows illustrate the principles of best practice instead. They're best practice usages (orderings, syntax, selection of features for the purpose, handling of error) of SIP methods, headers and parameters 🧩

IMPORTANT: The exact flows here must not be copied as-is by an implementer, because they include specific incorrect characteristics that were added for convenience. Those are listed below. To sum up, the SIP/PSTN call flows are well-reviewed examples of SIP usage, which is best common practice according to IETF consensus 🚨

To keep things simple to read and edit, some examples differ from actual SIP messages. For example, the SIP Digest responses aren't actual MD5 encodings. Call-IDs are often repeated, and CSeq counts often start at 1. Header fields are usually shown in the same order. Usually only the minimum required header field set is shown. Others that would normally be there, like Accept, Supported, Allow, etc., are left out πŸ™ˆ

Here are the actors:

   Element       Display Name   URI                        IP Address
   -------       ------------   ---                        ----------

   User Agent    Alice          sip:alice@a.example.com    192.0.2.101
   User Agent    Bob            sip:bob@b.example.com      192.0.2.200
   Proxy Server                 sip:ss1.a.example.com      192.0.2.111
   User Agent (Gateway)         sip:gw1.a.example.com      192.0.2.201
   User Agent (Gateway)         sip:gw2.a.example.com      192.0.2.202
   User Agent (Gateway)         sip:gw3.a.example.com      192.0.2.203
   User Agent (Gateway)         sip:ngw1.a.example.com     192.0.2.103
   User Agent (Gateway)         sip:ngw2.a.example.com     192.0.2.102

Note that NGW 1 and NGW 2 also have device URIs (Contacts) of sip:ngw1@a.example.com and sip:ngw2@a.example.com, which resolve to the Proxy Server sip:ss1.wcom.com using DNS SRV records 🧚✨

Part 1 of 19 done, bestie! More parts are coming πŸŒˆπŸ’–

2. SIP to PSTN Dialing ✨

okay so this section is all about Alice calling out to the regular phone network (the PSTN) πŸ“ž Alice is a SIP phone or other SIP-enabled device, and Bob is reachable at the global telephone number +19725552222 🌸 Alice's call goes through a Proxy Server (Proxy 1) and a Network Gateway.

There are also other scenarios where Alice calls Carol πŸ’… Carol sits behind a PBX (Private Branch Exchange) and can be reached by her private extension 444-3333 or her global number +1-918-555-3333. Also, Alice puts her global telephone number +1-314-555-1111 in the From header of her INVITE messages. That's lowkey genius because it gives the Gateway the option of using that header to fill in the calling party identification in later signaling πŸ¦‹ The open question is how the Gateway can tell whether that number is accurate before it passes it along as a valid calling party number on the PSTN. Still unresolved, bestie 🫢

In these scenarios, Alice is a SIP phone or other SIP-enabled device. She places a call to Bob on the PSTN, or to Carol on a PBX, through a Proxy Server and a Gateway.

In the failure scenarios the call doesn't complete. BUT, in some cases a media stream still gets set up anyway 😭 That happens because some dialing failures on the PSTN come back as in-band tones (busy, reorder tones, or announcements like "The number you have dialed has changed. The new number is..."). The 183 Session Progress response, which carries SDP media information, is used to set up this early media path, so the caller Alice can hear and understand the final result of her call πŸŽ€

The media stream gets ended either by the caller after the tone or announcement has been heard and understood, or by the Gateway once a timer expires.

In other failure scenarios, an SS7 Release with Cause Code gets mapped to a SIP response. In these cases the early media path isn't used, but the actual failure code still gets passed back to the caller by the SIP User Agent Client πŸ’€

2.1. Successful SIP to ISUP PSTN call

   Alice           Proxy 1           NGW 1          Switch B
     |                |                |                |
     |   INVITE F1    |                |                |
     |--------------->|                |                |
     |     100  F2    |                |                |
     |<---------------|   INVITE F3    |                |
     |                |--------------->|                |
     |                |     100  F4    |                |
     |                |<---------------|     IAM F5     |
     |                |                |--------------->|
     |                |                |     ACM F6     |
     |                |     183 F7     |<---------------|
     |     183 F8     |<---------------|                |
     |<---------------|                |                |
     |        Both Way RTP Media       |  One Way Voice |
     |<===============================>|<===============|
     |                |                |      ANM F9    |
     |                |    200 F10     |<---------------|
     |     200 F11    |<---------------|                |
     |<---------------|                |                |
     |     ACK F12    |                |                |
     |--------------->|     ACK F13    |                |
     |                |--------------->|                |
     |        Both Way RTP Media       | Both Way Voice |
     |<===============================>|<==============>|
     |     BYE F14    |                |                |
     |--------------->|     BYE F15    |                |
     |                |--------------->|                |
     |                |     200 F16    |                |
     |     200 F17    |<---------------|     REL F18    |
     |<---------------|                |--------------->|
     |                |                |     RLC F19    |
     |                |                |<---------------|
     |                |                |                |

Alice dials the globalized E.164 number +19725552222 to reach Bob πŸ’– She might only have dialed the last 7 digits, or used some other dialing plan, and that's fine. It's assumed that the SIP User Agent Client converts the digits into a global number and puts them into a SIP URI. Tel URIs could be used instead of SIP URIs too 🌈

Alice could use either her SIP address (sip:alice@a.example.com) or her SIP telephone number (sip:+13145551111@ss1.a.example.com;user=phone) in the From header. In this example she uses the telephone number, and it gets passed as the calling party identification through the Network Gateway (NGW 1) to Bob (F5). Important detail: for this number to get into the SS7 network, it would have to be verified for accuracy somehow πŸ™ˆ

In this scenario, Bob answers, then Alice hangs up. The signaling between NGW 1 and Bob's telephone switch is ANSI ISUP. For the full details of the SIP to ISUP mapping, check out [4] 🧚

In this flow, notice that the Contact returned by NGW 1 in messages F7-11 is sip:ngw1@a.example.com. That's because NGW 1 only accepts SIP messages that come through Proxy 1, and any direct signaling gets ignored 🚫 Since this Contact URI might be used outside of this dialog and must be routable (Section 8.1.1.8 in RFC 3261 [2]), the Contact URI for NGW 1 has to resolve to Proxy 1. This Contact URI resolves via DNS to Proxy 1 (sip:ss1.a.example.com), which then resolves it to sip:ngw1.a.example.com, the address of NGW 1. It's a whole chain, but it all works out πŸ’…

This flow shows TCP transport πŸ¦‹

Message Details

F1 INVITE Alice -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com;transport=tcp>
Proxy-Authorization: Digest username="alice", realm="a.example.com",
 nonce="dc3a5ab25302aa931904ba7d88fa1cf5", opaque="",
 uri="sip:+19725552222@ss1.a.example.com;user=phone",
 response="ccdca50cb091d587421457305d097458c"
Content-Type: application/sdp
Content-Length: 154

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

F2 100 Trying Proxy 1 -> Alice

SIP/2.0 100 Trying
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

/* Proxy 1 uses a Location Service function to determine the gateway
for terminating this call.  The call is forwarded to NGW 1.  Client
for A prepares to receive data on port 49172 from the
network.*/

F3 INVITE Proxy 1 -> NGW 1

INVITE sip:+19725552222@ngw1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 154

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

F4 100 Trying NGW 1 -> Proxy 1

SIP/2.0 100 Trying
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1

 ;received=192.0.2.111
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 IAM NGW 1 -> Bob

IAM
CdPN=972-555-2222,NPI=E.164,NOA=National
CgPN=314-555-1111,NPI=E.164,NOA=National

F6 ACM Bob -> NGW 1

ACM

F7 183 Session Progress NGW 1 -> Proxy 1

SIP/2.0 183 Session Progress
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

/* NGW 1 sends PSTN audio (ringing) in the RTP path to A */

F8 183 Session Progress Proxy 1 -> Alice

SIP/2.0 183 Session Progress
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

F9 ANM Bob -> NGW 1

ANM

F10 200 OK NGW 1 -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

F11 200 OK Proxy 1 -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

F12 ACK Alice -> Proxy 1

ACK sip:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

F13 ACK Proxy 1 -> NGW 1

ACK sip:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

/* Alice Hangs Up with Bob. */

Okay so that ACK is the last bit of the call setup, and now the call is wrapping up πŸ’… Alice hangs up with Bob, and it's all very orderly, no drama 🫢

F14 BYE Alice -> Proxy 1

BYE sip:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

F15 BYE Proxy 1 -> NGW 1

BYE sip:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

F16 200 OK NGW 1 -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

F17 200 OK Proxy 1 -> A

SIP/2.0 200 OK
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

F18 REL NGW 1 -> B

REL
CauseCode=16 Normal

F19 RLC B -> NGW 1

RLC

2.2. Successful SIP to ISDN PBX call

Now we're going to look at a call that goes from a SIP phone all the way into a PBX over an ISDN trunk. It's giving full-circuit energy πŸ¦‹

Alice            Proxy 1           GW 1             PBX C
  |                |                |                |
  |   INVITE F1    |                |                |
  |--------------->|                |                |
  |     100  F2    |                |                |
  |<---------------|   INVITE F3    |                |
  |                |--------------->|                |
  |                |     100  F4    |                |
  |                |<---------------|    SETUP F5    |
  |                |                |--------------->|
  |                |                |  CALL PROC F6  |
  |                |                |<---------------|
  |                |                |   PROGress F7  |
  |                |    180 F8      |<---------------|
  |    180 F9      |<---------------|                |
  |<---------------|                |                |
  |                |                |  One Way Voice |
  |                |                |<===============|
  |                |                |   CONNect F10  |
  |                |                |<---------------|
  |                |                | CONNect ACK F11|
  |                |    200 F12     |--------------->|
  |     200 F13    |<---------------|                |
  |<---------------|                |                |
  |     ACK F14    |                |                |
  |--------------->|     ACK F15    |                |
  |                |--------------->|                |
  |        Both Way RTP Media       | Both Way Voice |
  |<===============================>|<==============>|
  |     BYE F16    |                |                |
  |--------------->|     BYE F17    |                |
  |                |--------------->|                |
  |                |     200 F18    |                |
  |     200 F19    |<---------------| DISConnect F20 |
  |<---------------|                |--------------->|
  |                |                |   RELease F21  |
  |                |                |<---------------|
  |                |                | RELease COM F22|
  |                |                |--------------->|
  |                |                |                |

So the story is: Alice is a SIP device, and Carol is hanging out behind a Gateway (GW 1) that's hooked up to a PBX πŸ’– The PBX connection runs over an ISDN trunk group. Alice dials Carol's number (918-555-3333), which gets globalized and wrapped up into a SIP URI ✨

The host bit of the Request-URI in INVITE F3 is what tells everyone which context (customer, trunk group, or line) the private number 444-3333 is valid in πŸ™ˆ Without it, this INVITE could get forwarded by GW 1 and the context of those digits could just vanish, and then the call is unroutable. Not me losing the thread πŸ’€

Proxy 1 looks up the telephone number and finds the gateway that serves Carol. Carol gets identified by her extension (444-3333) in the Request-URI that gets sent to GW 1 πŸŽ€

Also, the Contact URI for GW 1, which shows up in messages F8, F9, F12, and F13, is sips:4443333@gw1.a.example.com. That one resolves straight to the gateway, so no detours 🧚

This flow shows off the use of Secure SIP (sips) URIs. Very secure, very serious, very iconic πŸ”₯

Message Details ✨

F1 INVITE Alice -> Proxy 1

INVITE sips:+19185553333@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Contact: <sips:alice@client.a.example.com>
Proxy-Authorization: Digest username="alice",
 realm="a.example.com", nonce="qo0dc3a5ab22aa931904badfa1cf5j9h",
 opaque="", uri="sips:+19185553333@ss1.a.example.com;user=phone",
 response="6c792f5c9fa360358b93c7fb826bf550"
Content-Type: application/sdp
Content-Length: 154

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

F2 100 Trying Proxy 1 -> Alice

SIP/2.0 100 Trying
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Content-Length: 0

F3 INVITE Proxy 1 -> GW 1

INVITE sips:4443333@gw1.a.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
Record-Route: <sips:ss1.a.example.com;lr>
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Contact: <sips:alice@client.a.example.com>
Content-Type: application/sdp
Content-Length: 154

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

F4 100 Trying GW -> Proxy 1

SIP/2.0 100 Trying
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Content-Length: 0

F5 SETUP GW 1 -> Carol

Protocol discriminator=Q.931
Message type=SETUP
Bearer capability: Information transfer capability=0 (Speech) or 16
(3.1 kHz audio)
Channel identification=Preferred or exclusive B-channel
Progress indicator=1 (Call is not end-to-end ISDN;further call
progress information may be available inband)
Called party number:
Type of number unknown
Digits=444-3333

F6 CALL PROCeeding Carol-> GW 1

Protocol discriminator=Q.931
Message type=CALL PROC
Channel identification=Exclusive B-channel

F7 PROGress Carol-> GW 1

Protocol discriminator=Q.931
Message type=PROG
Progress indicator=1 (Call is not end-to-end ISDN;further call
progress information may be available inband)

F8 180 Ringing GW 1 -> Proxy 1

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sips:ss1.a.example.com;lr>
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Contact: <sips:4443333@gw1.a.example.com>
Content-Length: 0

F9 180 Ringing Proxy 1 -> Alice

SIP/2.0 180 Ringing
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sips:ss1.a.example.com;lr>
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Contact: <sips:4443333@gw1.a.example.com>
Content-Length: 0

F10 CONNect Carol-> GW 1

Protocol discriminator=Q.931
Message type=CONN

F11 CONNect ACK GW 1 -> Carol

Protocol discriminator=Q.931
Message type=CONN ACK

F12 200 OK GW 1 -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sips:ss1.a.example.com;lr>
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Contact: <sips:4443333@gw1.a.example.com>
Content-Type: application/sdp
Content-Length: 144

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

F13 200 OK Proxy 1 -> Alice

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sips:ss1.a.example.com;lr>
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 INVITE
Contact: <sips:4443333@gw1.a.example.com>
Content-Type: application/sdp
Content-Length: 144

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

F14 ACK Alice -> Proxy 1

We're still wrapping up the 2.2 call flow, so here's the ACK that Alice's side sends back after the 200 OK. πŸ’–

F15 ACK Proxy 1 -> GW 1

ACK sips:4443333@gw1.a.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 ACK
Content-Length: 0

/* Alice Hangs Up with Bob. */ πŸ“ž

F16 BYE Alice -> Proxy 1

BYE sips:4443333@gw1.a.example.com SIP/2.0
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
Max-Forwards: 70
Route: <sips:ss1.a.example.com;lr>
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 3 BYE
Content-Length: 0

F17 BYE Proxy 1 -> GW 1 πŸ¦‹

BYE sips:4443333@gw1.a.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 3 BYE
Content-Length: 0

F18 200 OK GW 1 -> Proxy 1 🌸

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 3 BYE
Content-Length: 0

F19 200 OK Proxy 1 -> A 🧚

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.a.example.com:5061;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sips:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Carol <sips:+19185553333@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 3 BYE
Content-Length: 0

F20 DISConnect GW 1 -> Carol πŸ’…

Protocol discriminator=Q.931
Message type=DISC
Cause=16 (Normal clearing)

F21 RELease Carol-> GW 1 ✨

Protocol discriminator=Q.931
Message type=REL

F22 RELease COMplete GW 1 -> Carol πŸŽ€

Protocol discriminator=Q.931
Message type=REL COM

2.3. Successful SIP to ISUP PSTN call with overflow 🌈

Okay bestie, this next flow is the overflow one, and it's giving main character energy. Here's the whole picture, with Alice, Proxy 1, NGW 1, NGW 2 and Switch B all in one diagram. πŸ¦‹

   Alice          Proxy 1         NGW 1          NGW 2        Switch B
    |              |              |              |              |
    |  INVITE F1   |              |              |              |
    |------------->|              |              |              |
    |              |  INVITE F2   |              |              |
    |    100  F3   |------------->|              |              |
    |<-------------|    503 F4    |              |              |
    |              |<-------------|              |              |
    |              |    ACK F5    |              |              |
    |              |------------->|              |              |
    |              |   INVITE F6                 |              |
    |              |---------------------------->|     IAM F7   |
    |              |                             |------------->|
    |              |                             |     ACM F8   |
    |              |            183 F9           |<-------------|
    |   183 F10    |<----------------------------|              |
    |<-------------|                             |              |
    |               Two Way RTP Media            | One Way Voice|
    |<==========================================>|<=============|
    |              |                             |    ANM F11   |
    |              |           200 F12           |<-------------|
    |    200 F13   |<----------------------------|              |
    |<-------------|                             |              |
    |    ACK F14   |                             |              |
    |------------->|            ACK F15          |              |
    |              |---------------------------->|              |
    |             Both Way RTP Media             |Both Way Voice|
    |<==========================================>|<============>|
    |    BYE F16   |                             |              |
    |------------->|           BYE F17           |              |
    |              |---------------------------->|              |
    |              |           200 F18           |              |
    |    200 F19   |<----------------------------|    REL F20   |
    |<-------------|                             |------------->|
    |              |                             |    RLC F21   |
    |              |                             |<-------------|
    |              |                             |              |

So here's the tea β˜•. Alice calls Bob through Proxy 1, and Proxy 1 tries to route the call to a Network Gateway, NGW 1. NGW 1 isn't available, so it responds with a 503 Service Unavailable (F4). No worries though, because the call then gets routed to Network Gateway NGW 2, and Bob answers. The call ends when Alice disconnects. NGW 2 and Bob's telephone switch use ANSI ISUP signaling, which is so specific and I'm here for it. πŸ’…

NGW 2 also only accepts SIP messages that come through Proxy 1, so the Contact URI sip:ngw2@a.example.com is used in this flow. 🫢

Also, this flow shows UDP transport. πŸ’œ

Message Details

F1 INVITE Alice -> Proxy 1 πŸ’–

INVITE sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com>
Proxy-Authorization: Digest username="alice",
 realm="a.example.com", nonce="b59311c3ba05b401cf80b2a2c5ac51b0",
 opaque="", uri="sip:+19725552222@ss1.a.example.com;user=phone",
 response="ba6ab44923fa2614b28e3e3957789ab0"
Content-Type: application/sdp
Content-Length: 154

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

/* Proxy 1 uses a Location Service function to determine where B is located. Proxy 1 receives a primary route NGW 1 and a secondary route NGW 2. NGW 1 is tried first */ πŸ”₯

F2 INVITE Proxy 1 -> NGW 1 🌸

INVITE sip:+19725552222@ngw1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl

To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com>
Content-Type: application/sdp
Content-Length: 154

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

F3 100 Trying Proxy 1 -> Alice 🧚

SIP/2.0 100 Trying
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F4 503 Service Unavailable NGW 1 -> Proxy 1 πŸ’€

SIP/2.0 503 Service Unavailable
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 ACK Proxy 1 -> NGW 1 πŸ¦‹

ACK sip:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com>;user=phone>
 ;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

/* Proxy 1 now tries secondary route to NGW 2 */ ✨

F6 INVITE Proxy 1 -> NGW 2 πŸ‘‘

INVITE sip:+19725552222@ngw2.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com>
Content-Type: application/sdp
Content-Length: 154

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

F7 IAM NGW 2 -> Bob πŸ“

IAM
CdPN=972-555-2222,NPI=E.164,NOA=National
CgPN=314-555-1111,NPI=E.164,NOA=National

F8 ACM Bob -> NGW 2 πŸ’œ

ACM

F9 183 Session Progress NGW 2 -> Proxy 1 🌈

SIP/2.0 183 Session Progress
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw2@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

/* RTP packets are sent by GW to A for audio (e.g. ring tone) */ πŸ””

F10 183 Session Progress Proxy 1 -> Alice 🌸

SIP/2.0 183 Session Progress
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw2@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

F11 ANM Bob -> NGW 2 πŸ’…

ANM

F12 200 OK NGW 2 -> Proxy 1 🫢

Okay bestie, the 200 OK is on its way back so the call is officially connected πŸŽ€πŸ’– Here's the rest of the flow, and yes, it's giving main character energy ✨

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw2@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

F13 200 OK Proxy 1 -> Alice πŸ¦‹ The proxy forwards that same 200 OK on to Alice, and it's giving consistency πŸ’…

SIP/2.0 200 OK
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101

Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw2@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

F14 ACK Alice -> Proxy 1 🌸 Alice sends the ACK back, and the route header is doing the heavy lifting here 🧚

ACK sip:ngw2@a.example.com SIP/2.0
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
Route: <ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

F15 ACK Proxy 1 -> NGW 2 πŸ’œ The proxy passes the ACK along to the gateway, and every header is still there, no cap 🫢

ACK sip:ngw2@a.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and B(via the GW) */

/* Alice Hangs Up with Bob. */

Now the media is flowing between A and B through the gateway, and then Alice hangs up 😭πŸ₯€

F16 BYE Alice -> Proxy 1 πŸ’€ Here comes the BYE, and the CSeq jumps to 2 because it's a whole new request πŸ™ˆ

BYE sip:ngw2@a.example.com SIP/2.0
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
Route: <ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

F17 BYE Proxy 1 -> NGW 2 πŸ“ The proxy forwards the BYE to the gateway, with Max-Forwards dropping to 69 πŸ”₯

BYE sip:ngw2@a.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

F18 200 OK NGW 2 -> Proxy 1 🌈 The gateway says yes to the BYE with a 200 OK. Look at that little blank line in the To header, it's the vibe πŸŽ€

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>

 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

F19 200 OK Proxy 1 -> Alice 🧚 The proxy sends the final 200 OK back to Alice, and the BYE is officially wrapped up ✨

SIP/2.0 200 OK
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 2 BYE
Content-Length: 0

On the PSTN side, the gateway starts the release πŸ‘‘

F20 REL NGW 2 -> B πŸ’… The gateway sends the REL with CauseCode=16 Normal, which is the most iconic reason to hang up πŸ”₯

REL
CauseCode=16 Normal

F21 RLC B -> NGW 2 πŸ¦‹ Bob sends back the RLC to confirm, and that's the whole call wrapped up, periodt πŸ’–

RLC

And that's a whole wrap on the flow! 🌈✨

2.4. Successful SIP to SIP using ENUM Query ✨

Okay bestie, this one is my favorite πŸ¦‹ Here's the vibe: Alice and Bob are both on SIP, so the call never has to touch the PSTN at all. The whole thing runs over IP πŸ’…

Here's the full message flow, with Alice's UA on the left, the DNS Server, Proxy 3, and Bob on the right:

   Alice         DNS Server         Proxy 3            Bob
     |                |                |                |
     |  ENUM Query F1 |                |                |
     |--------------->|                |                |
     |   Response F2  |                |                |
     |<---------------|                |                |
     |            INVITE F3            |                |
     |-------------------------------->|    INVITE F4   |
     |             100 F5              |--------------->|
     |<--------------------------------|      180 F6    |
     |             180 F7              |<---------------|
     |<--------------------------------|                |
     |                                 |     200 F8     |
     |             200 F9              |<---------------|
     |<--------------------------------|                |
     |             ACK F10             |                |
     |-------------------------------->|     ACK F11    |
     |                                 |--------------->|
     |                Both Way RTP Media                |
     |<================================================>|
     |                                 |     BYE F12    |
     |             BYE F13             |<---------------|
     |<--------------------------------|                |
     |             200 F14             |                |
     |-------------------------------->|     200 F15    |
     |                                 |--------------->|
     |                                 |                |

So the story is: Alice calls Bob by dialing his number, 9725552222 πŸ“ž Her UA turns that into an E.164 number, +19725552222, and then does an ENUM query [9] on it, which is the 2.2.2.2.5.5.5.2.7.9.1.e164.arpa name. The answer is a NAPTR record with a SIP AOR URI for Bob, sip:+19725552222@b.example.com. πŸŽ€ So Alice's UA sends an INVITE, and the call completes over IP, totally bypassing the PSTN. Iconic, right? 😭

The call ends when Bob sends a BYE message πŸ‘‹

Message Details ✨

Okay, now let's go through every single message, step by step 🧚

F1 ENUM Query Alice -> DNS Server

   2.2.2.2.5.5.5.2.7.9.1.e164.arpa

F2 ENUM NAPTR Set DNS Server -> Alice

   $ORIGIN 2.2.2.2.5.5.5.2.7.9.1.e164.arpa.
         IN NAPTR 100 10 "u" "sip+E2U"
                "!^.*$!sip:+19725552222@b.example.com!".

F3 INVITE Alice -> Proxy 3

   INVITE sip:+19725552222@b.example.com SIP/2.0
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
   Max-Forwards: 70
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 INVITE
   Contact: <sip:+13145551111@client.a.example.com>
   Content-Type: application/sdp
   Content-Length: 154

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

F4 INVITE Proxy 3 -> Bob

   INVITE sip:+19725552222@client.b.example.com SIP/2.0
   Via: SIP/2.0/UDP ss3.b.example.com:5060;branch=z9hG4bK721e418c4.1
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
    ;received=192.0.2.101
   Max-Forwards: 69
   Record-Route: <sip:ss3.b.example.com;lr>
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 INVITE
   Contact: <sip:+13145551111@client.a.example.com>
   Content-Type: application/sdp
   Content-Length: 154

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

F5 100 Trying Proxy 3 -> Alice

   SIP/2.0 100 Trying
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
    ;received=192.0.2.101
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 INVITE
   Content-Length: 0

F6 180 Ringing B -> Proxy 3

   SIP/2.0 180 Ringing
   Via: SIP/2.0/UDP ss3.b.example.com:5060;branch=z9hG4bK721e418c4.1
    ;received=192.0.2.233
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
    ;received=192.0.2.101
   Record-Route: <sip:ss3.b.example.com;lr>
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>;tag=314159
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 INVITE
   Contact: <sip:+19725552222@client.b.example.com>
   Content-Length: 0

F7 180 Ringing Proxy 3 -> Alice

   SIP/2.0 180 Ringing
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
    ;received=192.0.2.101
   Record-Route: <sip:ss3.b.example.com;lr>
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>;tag=314159
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 INVITE
   Contact: <sip:+19725552222@client.b.example.com>
   Content-Length: 0

F8 200 OK Bob -> Proxy 3

   SIP/2.0 200 OK
   Via: SIP/2.0/UDP ss3.b.example.com:5060;branch=z9hG4bK721e418c4.1
    ;received=192.0.2.233
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
    ;received=192.0.2.101
   Record-Route: <sip:ss3.b.example.com;lr>
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>;tag=314159
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 INVITE
   Contact: <sip:+19725552222@client.b.example.com;transport=tcp>
   Content-Type: application/sdp
   Content-Length: 151

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

F9 200 OK Proxy -> Alice

   SIP/2.0 200 OK
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
    ;received=192.0.2.101
   Record-Route: <sip:ss3.b.example.com;lr>
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>;tag=314159
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 INVITE
   Contact: <sip:+19725552222@client.b.example.com>
   Content-Type: application/sdp
   Content-Length: 151

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

F10 ACK Alice -> Proxy 3

   ACK sip:+19725552222@client.b.example.com SIP/2.0
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bq9
   Max-Forwards: 70
   Route: <sip:ss3.b.example.com;lr>
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>;tag=314159
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 ACK
   Content-Length: 0

F11 ACK Proxy 3 -> Bob

   ACK sip:+19725552222@client.b.example.com SIP/2.0
   Via: SIP/2.0/UDP ss3.b.example.com:5060;branch=z9hG4bK721e418c4.1
   Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bq9
    ;received=192.0.2.101
   Max-Forwards: 69
   From: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   To: <tel:+19725552222>;tag=314159
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 2 ACK
   Content-Type: application/sdp
   Content-Length: 0

   /* RTP streams are established between A and B*/

   /* User B Hangs Up with User A. */

F12 BYE Bob -> Proxy 3

   BYE sip:+13145551111@client.a.example.com SIP/2.0
   Via: SIP/2.0/UDP client.b.example.com:5060;branch=z9hG4bKfgaw2
   Max-Forwards: 70
   Route: <sip:ss3.b.example.com;lr>
   From: <tel:+19725552222>;tag=314159
   To: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 1 BYE
   Content-Length: 0

F13 BYE Proxy 3 -> Alice

   BYE sip:+13145551111@client.a.example.com SIP/2.0
   Via: SIP/2.0/UDP ss3.b.example.com:5060;branch=z9hG4bK721e418c4.1
    ;received=192.0.2.100
   Via: SIP/2.0/UDP client.b.example.com:5060;branch=z9hG4bKfgaw2
   Max-Forwards: 69
   From: <tel:+19725552222>;tag=314159
   To: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 1 BYE
   Content-Length: 0

F14 200 OK Alice -> Proxy 3

   SIP/2.0 200 OK
   Via: SIP/2.0/UDP ss3.b.example.com:5060;branch=z9hG4bK721e418c4.1
    ;received=192.0.2.233
   Via: SIP/2.0/UDP client.b.example.com:5060;branch=z9hG4bKfgaw2
    ;received=192.0.2.100
   From: <tel:+19725552222>;tag=314159
   To: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 1 BYE
   Content-Length: 0

F15 200 OK Proxy 3 -> Bob

   SIP/2.0 200 OK
   Via: SIP/2.0/UDP client.b.example.com:5060;branch=z9hG4bKfgaw2
    ;received=192.0.2.100
   From: <tel:+19725552222>;tag=314159
   To: <sip:+13145551111@a.example.com>;tag=9fxced76sl
   Call-ID: 2xTb9vxSit55XU7p8@a.example.com
   CSeq: 1 BYE
   Content-Length: 0

2.5. Unsuccessful SIP to PSTN call: Treatment from PSTN πŸ’…

   Alice            Proxy 1           NGW 1            Bob
     |                |                |                |
     |   INVITE F1    |                |                |
     |--------------->|                |                |
     |     100  F2    |                |                |
     |<---------------|   INVITE F3    |                |
     |                |--------------->|                |
     |                |     100  F4    |                |
     |                |<---------------|     IAM F5     |
     |                |                |--------------->|
     |                |                |     ACM F6     |
     |                |     183 F7     |<---------------|
     |     183 F8     |<---------------|                |
     |<---------------|                |                |
     |         Two Way RTP Media       |  One Way Voice |
     |<===============================>|<===============|
     |                 Treatment Applied                |
     |<=================================================|
     |   CANCEL F9    |                |                |
     |--------------->|                |                |
     |     200 F10    |                |                |
     |<---------------|   CANCEL F11   |                |
     |                |--------------->|                |
     |                |     200 F12    |                |
     |                |<---------------|     REL F13    |
     |                |                |--------------->|
     |                |                |     RLC F14    |
     |                |     487 F15    |<---------------|
     |                |<---------------|                |
     |                |     ACK F16    |                |
     |     487 F17    |--------------->|                |
     |<---------------|                |                |
     |     ACK F18    |                |                |
     |--------------->|                |                |
     |                |                |                |

okay so this one is the "the call didn't go through and the PSTN is giving us a vibe check" scenario πŸ™ˆ Alice calls Bob in the PSTN through a proxy server called Proxy 1 and a Network Gateway called NGW 1. The PSTN rejects the call with an in-band treatment (that's a tone or a recording) and Alice gets to hear it. Then she's like "nope" and hangs up, which sends a CANCEL (F9) to end the call. 😭 A BYE is not sent here, since Alice never got a final response. Main character energy, but make it make sense πŸŽ€

Message Details

F1 INVITE Alice -> Proxy 1 ✨

INVITE sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com>
Proxy-Authorization: Digest username="alice",
 realm="a.example.com", nonce="01cf8311c3b0b2a2c5ac51bb59a05b40",
 opaque="", uri="sip:+19725552222@ss1.a.example.com;user=phone",
 response="e178fbe430e6680a1690261af8831f40"
Content-Type: application/sdp
Content-Length: 154

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

F2 100 Trying Proxy 1 -> A πŸ¦‹

SIP/2.0 100 Trying
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

/* Proxy 1 uses a Location Service function to determine where B is
located.  Based upon location analysis the call is forwarded to NGW
1.  Client for A prepares to receive data on port 49172 from the
network. */

F3 INVITE Proxy 1 -> NGW 1 πŸ’–

INVITE sip:+19725552222@ngw1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com>
Content-Type: application/sdp
Content-Length: 154

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

F4 100 Trying NGW 1 -> Proxy 1 🌸

SIP/2.0 100 Trying
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 IAM NGW 1 -> Bob 🧚

IAM
CdPN=972-555-2222,NPI=E.164,NOA=National
CgPN=314-555-1111,NPI=E.164,NOA=National

F6 ACM Bob -> NGW 1 ⭐

ACM

F7 183 Session Progress NGW 1 -> Proxy 1 πŸ”₯

SIP/2.0 183 Session Progress
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

F8 183 Session Progress Proxy 1 -> Alice πŸŽ€

SIP/2.0 183 Session Progress
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146
v=0
o=GW 2890844527 2890844527 IN IP4 ngw1.a.example.com
s=-
c=IN IP4 ngw1.a.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* Caller hears the recorded announcement, then hangs up */

F9 CANCEL Alice -> Proxy 1 πŸ™ˆ

CANCEL sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F10 200 OK Proxy 1 -> A πŸ’œ

SIP/2.0 200 OK
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F11 CANCEL Proxy 1 -> NGW 1 πŸ¦‹

CANCEL sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F12 200 OK NGW 1 -> Proxy 1 🌈

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F13 REL NGW 1 -> B πŸ“

REL
CauseCode=18 No user responding

F14 RLC B -> NGW 1 🫢

RLC

F15 487 Request Terminated NGW 1 -> Proxy 1 πŸ’…

SIP/2.0 487 Request Terminated
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F16 ACK Proxy 1 -> NGW 1 πŸ‘‘

ACK sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>

 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

F17 487 Request Terminated Proxy 1 -> A 🧚

SIP/2.0 487 Request Terminated
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F18 ACK Alice -> Proxy 1 ✨

ACK sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

2.6. Unsuccessful SIP to PSTN: REL w/Cause from PSTN πŸ’”

   Alice            Proxy 1           NGW 1           Switch B
     |                |                |                |
     |   INVITE F1    |                |                |
     |--------------->|                |                |
     |     100  F2    |                |                |
     |<---------------|   INVITE F3    |                |
     |                |--------------->|                |
     |                |     100  F4    |                |
     |                |<---------------|     IAM F5     |
     |                |                |--------------->|
     |                |                |    REL(1) F6   |
     |                |                |<---------------|
     |                |                |     RLC F7     |
     |                |     404 F8     |--------------->|
     |                |<---------------|                |
     |                |     ACK F9     |                |
     |                |--------------->|                |
     |     404 F10    |                |                |
     |<---------------|                |                |
     |     ACK F11    |                |                |
     |--------------->|                |                |
     |                |                |                |

Okay so this one is a full-on tragedy 😭 Alice is trying to call PSTN Bob through a Proxy Server called Proxy 1 and a Network Gateway called NGW 1. The PSTN rejects the call with an ANSI ISUP Release message (REL) that includes a specific Cause code. The Gateway takes that cause value (1) and maps it to a SIP 404 Address Incomplete response, which gets proxied back to Alice πŸ’…. For more on how ISUP cause values map to SIP responses, check out [4] πŸŽ€.

Message Details 🧚

F1 INVITE Alice -> Proxy 1 πŸ“ž

INVITE sip:+44-1234@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com;transport=tcp>
Proxy-Authorization: Digest username="alice",
 realm="a.example.com", nonce="j1c3b0b01cf832da2c5ac51bb59a05b40",
 opaque="", uri="sip:+44-1234@ss1.a.example.com;user=phone",
 response="a451358d46b55512863efe1dccaa2f42"
Content-Type: application/sdp
Content-Length: 154

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

F2 100 Trying Proxy 1 -> A 🌸

SIP/2.0 100 Trying
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

/* Proxy 1 uses a Location Service function to determine where B is
located.  Based upon location analysis the call is forwarded to NGW1.
Client for A prepares to receive data on port 49172 from the network.
*/

F3 INVITE Proxy 1 -> NGW 1 πŸ¦‹

INVITE sip:+44-1234@ngw1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 154
v=0
o=alice 2890844526 2890844526 IN IP4 client.a.example.com
s=-
c=IN IP4 client.a.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 100 Trying NGW 1 -> Proxy 1 ✨

SIP/2.0 100 Trying
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 IAM NGW 1 -> Bob 🧚

IAM
CdPN=44-1234,NPI=E.164,NOA=International
CgPN=314-555-1111,NPI=E.164,NOA=National

F6 REL Bob -> NGW 1 πŸ’€

REL
CauseValue=1 Unallocated number

F7 RLC NGW 1 -> Bob 🫢

RLC
/* Network Gateway maps CauseValue=1 to the SIP message 404 Not
   Found */

F8 404 Not Found NGW 1 -> Proxy 1 🌈

SIP/2.0 404 Not Found
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Error-Info: <sip:not-found-ann@ann.a.example.com>
Content-Length: 0

F9 ACK Proxy 1 -> NGW 1 πŸ“

ACK sip:+44-1234@ngw1.a.example.com;user=phone SIP/2.0
Max-Forwards: 70
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

F10 404 Not Found Proxy 1 -> Alice πŸ‘‘

SIP/2.0 404 Not Found
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Error-Info: <sip:not-found-ann@ann.a.example.com>
Content-Length: 0

F11 ACK Alice -> Proxy 1 πŸŽ€

ACK sip:+44-1234@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+44-1234@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

2.7. Unsuccessful SIP to PSTN: ANM Timeout ✨

Okay, bestie, this one is a whole mood πŸ’€. Here's the flow:

    Alice           Proxy 1           NGW 1           Switch B
      |                |                |                |
      |   INVITE F1    |                |                |
      |--------------->|                |                |
      |     100  F2    |                |                |
      |<---------------|   INVITE F3    |                |
      |                |--------------->|                |
      |                |     100  F4    |                |
      |                |<---------------|     IAM F5     |
      |                |                |--------------->|
      |                |                |     ACM F6     |
      |                |      183 F7    |<---------------|
      |     183 F8     |<---------------|                |
      |<---------------|                |                |
      |                |      Timer on NGW 1 Expires     |
      |                |                |                |
      |                |                |     REL F9     |
      |                |                |--------------->|
      |                |                |    RLC F10     |
      |                |     480 F11    |<---------------|
      |                |<---------------|                |
      |                |     ACK F12    |                |
      |                |--------------->|                |
      |     480 F13    |                |                |
      |<---------------|                |                |
      |     ACK F14    |                |                |
      |--------------->|                |                |

So Alice is calling Bob on the PSTN through a proxy server (Proxy 1) and a Network Gateway (NGW 1). The call gets released by the Gateway after a timer runs out, because no ANswer Message (ANM) ever shows up 😭. The Gateway then sends an ISUP Release (REL) message out to the PSTN, and a 480 Temporarily Unavailable response back to Alice on the SIP side. Literally the saddest little timeout story ever πŸ₯ΊπŸ«Ά

Message Details πŸŽ€

F1 INVITE Alice -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com;transport=tcp>
Proxy-Authorization: Digest username="alice",
 realm="a.example.com", nonce="da2c5ac51bb59a05j1c3b0b01cf832b40",
 opaque="", uri="sip:+19725552222@ss1.a.example.com;user=phone",
 response="579cb9db184cdc25bf816f37cbc03c7d"
Content-Type: application/sdp
Content-Length: 154

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

/* Proxy 1 uses a Location Service function to determine where B is
located.  Based upon location analysis the call is forwarded to NGW
1.  Client for A prepares to receive data on port 49172 from the
network.*/

F2 100 Trying Proxy 1 -> A

SIP/2.0  100 Trying
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F3 INVITE Proxy 1 -> NGW 1

INVITE sip:+19725552222@ngw1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 154

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

F4 100 Trying NGW 1 -> Proxy 1

SIP/2.0  100 Trying
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 IAM NGW 1 -> Bob

IAM
CdPN=972-555-2222,NPI=E.164,NOA=National
CgPN=314-555-1111,NPI=E.164,NOA=National

F6 ACM Bob -> NGW 1

ACM

F7 183 Session Progress NGW 1 -> Proxy 1

SIP/2.0 183 Session Progress
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

F8 183 Session Progress Proxy 1 -> Alice

SIP/2.0 183 Session Progress
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
Record-Route: <sip:ss1.a.example.com;lr>
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146
v=0
o=GW 2890844527 2890844527 IN IP4 ngw1.a.example.com
s=-
c=IN IP4 ngw1.a.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* After NGW 1's timer expires, Network Gateway sends REL to ISUP
network and 480 to SIP network */

F9 REL NGW 1 -> Bob

REL

CauseCode=18 No user responding

F10 RLC Bob -> NGW 1

RLC

F11 480 Temporarily Unavailable NGW 1 -> Proxy 1

SIP/2.0 480 Temporarily Unavailable
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Error-Info: <sip:temp-unavail-ann@ann.a.example.com>
Content-Length: 0

F12 ACK Proxy 1 -> NGW 1

ACK sip:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Max-Forwards: 70
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl

To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

F13 480 Temporarily Unavailable F13 Proxy 1 -> Alice

SIP/2.0 480 Temporarily Unavailable
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
 ;received=192.0.2.101
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 INVITE
Error-Info: <sip:temp-unavail-ann@ann.a.example.com>
Content-Length: 0

F14 ACK Alice -> Proxy 1

ACK sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Max-Forwards: 70
Via: SIP/2.0/TCP client.a.example.com:5060;branch=z9hG4bK74bf9
From: Alice <sip:+13145551111@ss1.a.example.com;user=phone>
 ;tag=9fxced76sl
To: Bob <sip:+19725552222@ss1.a.example.com;user=phone>
 ;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@a.example.com
CSeq: 1 ACK
Content-Length: 0

3. PSTN to SIP Dialing πŸ’…

In these scenarios, Alice is calling from the PSTN to Bob on a SIP network πŸ“žβœ¨. Alice's telephone switch talks to a Network Gateway (NGW 1) using ANSI ISUP.

Here's the tea πŸ«–: the called SIP User Agent doesn't send in-band signaling info, so there's no early media path that needs to be set up on the IP side. That means the 183 Session Progress response is not used. BUT (main character energy πŸ‘‘) NGW 1 will still set up a one way speech path before the call completes, and generate ringing for the PSTN caller. Any tones or recordings get generated by NGW 1 and played down that speech path. Once the call completes successfully, NGW 1 bridges the PSTN speech path with the IP media path πŸ¦‹

Quick aside πŸŽ€: to keep the number of messages down, only a single proxy server is shown in these flows. That means the a.example.com proxy server has access to the b.example.com location service. Iykyk πŸ™ˆ

3.1. Successful PSTN to SIP call ✨

Okay so picture this: Alice is calling from the PSTN, and her call goes through Network Gateway NGW 1 and then Proxy Server Proxy 1 to reach Bob πŸ’–. Once Bob picks up, the media path is set up end-to-end πŸŽ€ Then, when Alice hangs up, her telephone switch sends an ISUP RELease message, and NGW 1 turns that into a BYE πŸ¦‹

Switch A          NGW 1          Proxy 1           Bob
  |                |                |                |
  |     IAM F1     |                |                |
  |--------------->|   INVITE F2    |                |
  |                |--------------->|   INVITE F3    |
  |                |     100  F4    |--------------->|
  |                |<---------------|                |
  |                |                |      180 F5    |
  |                |    180 F6      |<---------------|
  |     ACM F7     |<---------------|                |
  |<---------------|                |                |
  |  One Way Voice |                |                |
  |<===============|                |                |
  |  Ringing Tone  |                |      200 F8    |
  |<===============|    200 F9      |<---------------|
  |                |<---------------|                |
  |                |     ACK F10    |                |
  |     ANM F12    |--------------->|     ACK F11    |
  |<---------------|                |--------------->|
  | Both Way Voice |        Both Way RTP Media       |
  |<==============>|<===============================>|
  |     REL F13    |                |                |
  |--------------->|                |                |
  |     RLC F14    |                |                |
  |<---------------|     BYE F15    |                |
  |                |--------------->|     BYE F16    |
  |                |                |--------------->|
  |                |                |     200 F17    |
  |                |     200 F18    |<---------------|
  |                |<---------------|                |
  |                |                |                |

Message Details 🌸

F1 IAM Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-2222,NPI=E.164,NOA=National

F2 INVITE Alice -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

/* Proxy 1 uses a Location Service function to determine where B is
located.  Based upon location analysis the call is forwarded to NGW
1.  NGW 1  prepares to receive data on port 3456 from Alice.*/

F3 INVITE Proxy 1 -> Bob

INVITE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

F4 100 Trying Bob -> Proxy 1

SIP/2.0 100 Trying
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
    ;received=192.0.2.111
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 180 Ringing Bob -> Proxy 1

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
    ;received=192.0.2.111
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com>
Content-Length: 0

F6 180 Ringing Proxy 1 -> NGW 1

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com>
Content-Length: 0

F7 ACM NGW 1 -> Alice

ACM

F8 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
    ;received=192.0.2.111
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
Contact: <sip:bob@client.b.example.com>
CSeq: 1 INVITE
Content-Type: application/sdp
Content-Length: 151

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

F9 200 OK Proxy 1 -> NGW 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com>
Content-Type: application/sdp
Content-Length: 151

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

F10 ACK NGW 1 -> Proxy 1

ACK sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F11 ACK Proxy 1 -> Bob

ACK sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
Max-Forwards: 69
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F12 ANM Bob -> NGW 1

ANM

/* RTP streams are established between A and B (via the GW) */

/* Alice Hangs Up with Bob. */

F13 REL Alice -> NGW 1

REL
CauseCode=16 Normal

F14 RLC NGW 1 -> Alice

RLC

F15 BYE NGW 1-> Proxy 1

BYE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F16 BYE Proxy 1 -> Bob

BYE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
Max-Forwards: 69
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F17 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
    ;received=192.0.2.111
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F18 200 OK Proxy 1 -> NGW 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
    ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

3.2. Successful PSTN to SIP call, Fast Answer ✨

okay bestie, this one is the "fast answer" version πŸƒβ€β™€οΈπŸ’¨ It's basically the 3.1 call, but Bob picks up super fast. He skips the 180 Ringing and goes straight to a 200 OK (F5) πŸ’… The Gateway then sends an Answer Message (ANM) and doesn't send an Address Complete Message (ACM). Also, for ETSI and some other ISUP variants, a CONnect message (CON) shows up instead of the ANM πŸŽ€

   Switch A           NGW 1          Proxy 1           Bob
     |                |                |                |
     |     IAM F1     |                |                |
     |--------------->|   INVITE F2    |                |
     |                |--------------->|   INVITE F3    |
     |                |     100  F4    |--------------->|
     |                |<---------------|                |
     |                |                |      200 F5    |
     |                |     200 F6     |<---------------|
     |                |<---------------|                |
     |                |     ACK F7     |                |
     |     ANM F9     |--------------->|     ACK F8     |
     |<---------------|                |--------------->|
     | Both Way Voice |        Both Way RTP Media       |
     |<==============>|<===============================>|
     |     REL F10    |                |                |
     |--------------->|                |                |
     |     RLC F11    |                |                |
     |<---------------|     BYE F12    |                |
     |                |--------------->|     BYE F13    |
     |                |                |--------------->|
     |                |                |     200 F14    |
     |                |     200 F15    |<---------------|
     |                |<---------------|                |
     |                |                |                |

Message Details 🧚

F1 IAM Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-2222,NPI=E.164,NOA=National

F2 INVITE NGW 1 -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

v=0
o=GW 2890844527 2890844527 IN IP4 ngw1.a.example.com
s=-
c=IN IP4 ngw1.a.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/* Proxy 1 uses a Location Service function to determine where B is
located.  Based upon location analysis the call is forwarded to User
B.  Bob  prepares to receive data on port 3456 from Alice.*/

F3 INVITE Proxy 1 -> Bob

INVITE bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

F4 100 Trying Proxy 1 -> NGW 1

SIP/2.0 100 Trying
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 151

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

F6 200 OK Proxy 1 -> NGW 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 151

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

F7 ACK NGW 1 -> Proxy 1

ACK bob@client.b.example.com SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F8 ACK Proxy 1 -> Bob

ACK bob@client.b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=130.131.132.14
Max-Forwards: 69
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F9 ANM Bob -> NGW 1

ANM
/* RTP streams are established between A and B (via the GW) */
/* Alice Hangs Up with Bob. */

F10 REL ser Alice -> NGW 1

REL
CauseCode=16 Normal

F11 RLC NGW 1 -> Alice

RLC

F12 BYE NGW 1 -> Proxy 1

BYE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F13 BYE Proxy 1 -> Bob

BYE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Max-Forwards: 69
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F14 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F15 200 OK Proxy 1 -> NGW 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

3.3. Successful PBX to SIP call ✨

PBX A            GW 1           Proxy 1           Bob
  |                |                |                |
  |    Seizure     |                |                |
  |--------------->|                |                |
  |      Wink      |                |                |
  |<---------------|                |                |
  |  MF Digits F1  |                |                |
  |--------------->|   INVITE F2    |                |
  |                |--------------->|   INVITE F3    |
  |                |     100  F4    |--------------->|
  |                |<---------------|                |
  |                |                |      180 F5    |
  |                |    180 F6      |<---------------|
  |                |<---------------|                |
  |  One Way Voice |                |                |
  |<===============|                |                |
  |  Ringing Tone  |                |      200 F7    |
  |<===============|     200 F8     |<---------------|
  |                |<---------------|                |
  |                |     ACK F9     |                |
  |     Seizure    |--------------->|     ACK F10    |
  |<---------------|                |--------------->|
  | Both Way Voice |        Both Way RTP Media       |
  |<==============>|<===============================>|
  | Seizure Removal|                |                |
  |--------------->|                |                |
  | Seizure Removal|                |                |
  |<---------------|     BYE F11    |                |
  |                |--------------->|     BYE F12    |
  |                |                |--------------->|
  |                |                |     200 F13    |
  |                |     200 F14    |<---------------|
  |                |<---------------|                |
  |                |                |                |

Okay so in this scenario, Alice dials from PBX A to Bob through GW 1 and Proxy 1 πŸ“ž This is a super iconic example of a call that looks like it's headed for the PSTN but actually gets routed to a SIP Client πŸ¦‹

Signaling between PBX A and GW 1 is Feature Group B (FGB) circuit associated signaling, with in-band Mult-Frequency (MF) outpulsing πŸŽ€ After the 180 Ringing comes back from Bob, GW 1 generates a ringing tone for Alice πŸ””

Bob answers by sending a 200 OK ✨ The call ends when Alice hangs up, which makes GW1 send a BYE πŸ‘‹

The Gateway can only identify the trunk group that the call came in on. It cannot identify the individual line on PBX A that is placing the call πŸ™ˆ The SIP URI used to identify the caller is shown in these flows as sip:551313@gw1.a.example.com.

Message Details πŸ’…

PBX Alice -> GW 1

Seizure

GW 1 -> PBX A

Wink

F1 MF Digits PBX Alice -> GW 1

KP 1 972 555 2222 ST

F2 INVITE GW 1 -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
Max-Forwards: 70
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:551313@gw1.a.example.com;user=phone>
Content-Type: application/sdp
Content-Length: 146

v=0
o=GW 2890844527 2890844527 IN IP4 ngw1.a.example.com
s=-
c=IN IP4 gw1.a.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/* Proxy 1 uses a Location Service function to determine where the
phone number +19725552222 is located.  Based upon location
analysis the call is forwarded to SIP Bob. */

F3 INVITE Proxy 1 -> Bob

INVITE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:551313@gw1.a.example.com;user=phone>
Content-Type: application/sdp
Content-Length: 146

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

F4 100 Trying Proxy 1 -> GW 1

SIP/2.0 100 Trying
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 180 Ringing Bob -> Proxy 1

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com>
Content-Length: 0

F6 180 Ringing Proxy 1 -> GW 1

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com>
Content-Length: 0
/* One way Voice path is established between GW and the PBX for
ringing. */

F7 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
Contact: <sip:bob@client.b.example.com>
CSeq: 1 INVITE
Content-Type: application/sdp
Content-Length: 151

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

F8 200 OK Proxy 1 -> GW 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com>
Content-Type: application/sdp
Content-Length: 151

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

F9 ACK GW 1 -> Proxy 1

ACK sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F10 ACK Proxy 1 -> Bob

ACK sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Max-Forwards: 69
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0
/* RTP streams are established between A and B (via the GW) */

/* Alice Hangs Up with Bob. */

F11 BYE GW 1 -> Proxy 1

BYE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F12 BYE Proxy 1 -> Bob

BYE sip:bob@client.b.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Max-Forwards: 69
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F13 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

F14 200 OK Proxy 1 -> GW 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
From: <sip:551313@gw1.a.example.com;user=phone>;tag=jwdkallkzm
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 2 BYE
Content-Length: 0

3.4. Unsuccessful PSTN to SIP REL, SIP error mapped to REL πŸ’…

Okay bestie, this one is a rejected call and I'm obsessed with how cleanly it goes πŸ™ˆ Alice calls out through Gateway GW 1 and Proxy 1, and Proxy 1 is like "sorry, no route for that number" πŸ’€ So the call gets rejected, and the gateway turns the SIP error into a REL message with a specific Cause value. Iconic mapping energy ✨

   Switch A            GW 1          Proxy 1           Bob
     |                |                |                |
     |     IAM F1     |                |                |
     |--------------->|   INVITE F2    |                |
     |                |--------------->|                |
     |                |     604 F3     |                |
     |                |<---------------|                |
     |                |     ACK F4     |                |
     |                |--------------->|                |
     |     REL F5     |                |                |
     |<---------------|                |                |
     |     RLC F6     |                |                |
     |--------------->|                |                |
     |                |                |                |

Alice attempts to place a call through Gateway GW 1 and Proxy 1, which is unable to find any routing for the number. The call is rejected by Proxy 1 with a REL message containing a specific Cause value mapped by the gateway based on the SIP error. πŸŽ€

Message Details

F1 IAM Alice -> GW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-9999,NPI=E.164,NOA=National

F2 INVITE Alice -> Proxy 1

INVITE sip:+1972559999@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@gw1.a.example.com;user=phone>;tag=076342s
To: <sip:+1972559999@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Contact:
<sip:+13145551111@gw1.a.example.com;user=phone;transport=tcp>
Content-Type: application/sdp
Content-Length: 144

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

/* Proxy 1 uses a Location Service to find a route to +1-972-555-
9999.  A route is not found, so Proxy 1 rejects the call. */

F3 604 Does Not Exist Anywhere Proxy 1 -> GW 1

SIP/2.0 604 Does Not Exist Anywhere
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
From: <sip:+13145551111@gw1.a.example.com;user=phone>;tag=076342s
To: <sip:+1972559999@ss1.a.example.com;user=phone>;tag=6a34d410
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 INVITE
Error-Info: <sip:does-not-exist@ann.a.example.com>
Content-Length: 0

F4 ACK GW 1 -> Proxy 1

ACK sip:+1972559999@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@gw1.a.example.com;user=phone>;tag=076342s
To: <sip:+1972559999@ss1.a.example.com;user=phone>;tag=6a34d410
Call-ID: 4Fde34wkd11wsGFDs3@gw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F5 REL GW 1 -> Alice

REL
CauseCode=1

F6 RLC Alice -> GW 1

RLC

3.5. Unsuccessful PSTN to SIP REL, SIP busy mapped to REL πŸ“ž

Here we go again but this time Bob is busy 😭 Alice calls Bob through Network Gateway NGW 1 and Proxy 1, Proxy 1 routes it to Bob, and Bob replies with a 600 Busy Everywhere. The gateway then sends a REL with a Cause value mapped from that SIP error. Main character energy, but make it busy πŸ¦‹

   Switch A          NGW 1           Proxy 1          Bob
     |                |                |                |
     |     IAM F1     |                |                |
     |--------------->|   INVITE F2    |                |
     |                |--------------->|   INVITE F3    |
     |                |     100  F4    |--------------->|
     |                |<---------------|                |
     |                |                |      600 F5    |
     |                |                |<---------------|
     |                |                |      ACK F6    |
     |                |     600 F7     |--------------->|
     |                |<---------------|                |
     |                |     ACK F8     |                |
     |                |--------------->|                |
     |   REL(17) F9   |                |                |
     |<---------------|                |                |
     |     RLC F10    |                |                |
     |<-------------->|                |                |
     |                |                |                |

In this scenario, Alice calls Bob through Network Gateway NGW 1 and Proxy 1. The call is routed to Bob by Proxy 1. The call is rejected by Bob who sends a 600 Busy Everywhere response. The Gateway sends a REL message containing a specific Cause value mapped by the gateway based on the SIP error. ✨

Since no interworking is indicated in the IAM (F1), the busy tone is generated locally by Alice's telephone switch. In some scenarios, the busy signal is generated by the Gateway since interworking is indicated. For more discussion on interworking, refer to [4]. 🫢

Message Details

F1 IAM Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-2222,NPI=E.164,NOA=National

F2 INVITE Alice -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 144

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

/* Proxy 1 uses a Location Service function to determine a route for
+19725552222.  The call is then forwarded to Bob. */

F3 INVITE F3 Proxy 1 -> Bob

INVITE bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 144

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

F4 100 Trying Proxy 1 -> NGW 1

SIP/2.0 100 Trying
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 600 Busy Everywhere Bob -> Proxy 1

SIP/2.0 600 Busy Everywhere
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F6 ACK Proxy 1 -> Bob

ACK bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F7 600 Busy Everywhere Proxy 1 -> NGW 1

SIP/2.0 600 Busy Everywhere
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F8 ACK NGW 1 -> Proxy 1

ACK bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F9 REL NGW 1 -> Alice

REL
CauseCode=17 Busy

F10 RLC Alice -> NGW 1

RLC

3.6. Unsuccessful PSTN->SIP, SIP error interworking to tones ✨

Switch A          NGW 1           Proxy 1          Bob
  |                |                |                |
  |     IAM F1     |                |                |
  |--------------->|   INVITE F2    |                |
  |                |--------------->|   INVITE F3    |
  |                |     100  F4    |--------------->|
  |                |<---------------|                |
  |                |                |      600 F5    |
  |                |                |<---------------|
  |                |                |      ACK F6    |
  |                |     600 F7     |--------------->|
  |                |<---------------|                |
  |                |     ACK F8     |                |
  |     ACM F9     |--------------->|                |
  |<---------------|                |                |
  | One Way Voice  |                |                |
  |<===============|                |                |
  |    Busy Tone   |                |                |
  |<===============|                |                |
  |   REL(16) F10  |                |                |
  |--------------->|                |                |
  |     RLC F11    |                |                |
  |<---------------|                |                |
  |                |                |                |

Okay so in this scenario, Alice calls Bob through Network Gateway NGW 1 and Proxy 1 πŸ’– Proxy 1 routes the call to Bob, but the Bob client rejects it πŸ™…β€β™€οΈ Then NGW 1 sets up a two way voice path to Alice and plays busy tone πŸ“ž After that, the caller disconnects.

NGW 1 plays the busy tone because the IAM (F1) indicates that interworking is present πŸŽ€ Over in scenario 5.2.2., where there is no interworking, the busy indication is carried in the REL Cause value and gets generated locally instead πŸ¦‹

Also, bestie, for ETSI or ITU ISUP, a CONnect message gets sent instead of the Answer Message 🌸

Message Details

F1 IAM Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-2222,NPI=E.164,NOA=National
Interworking=encountered

F2 INVITE NGW1 -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

/* Proxy 1 uses a Location Service function to determine a route for +19725552222. The call is then forwarded to Bob. */

F3 INVITE Proxy 1 -> Bob

INVITE bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

F4 100 Trying Bob -> Proxy 1

SIP/2.0 100 Trying
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 600 Busy Everywhere Bob -> Proxy 1

SIP/2.0 600 Busy Everywhere
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F6 ACK Proxy 1 -> Bob

ACK bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F7 600 Busy Everywhere Proxy 1 -> NGW 1

SIP/2.0 600 Busy Everywhere
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F8 ACK NGW 1 -> Proxy 1

ACK sip:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F9 ACM NGW 1 -> Alice

ACM

/* A one way speech path is established between NGW 1 and Alice. */

/* Call Released after Alice hangs up. */

F10 REL Alice -> NGW 1

REL
CauseCode=16

F11 RLC NGW 1 -> Alice

RLC

3.7. Unsuccessful PSTN->SIP, ACM timeout πŸ•°οΈ

Switch A          NGW 1           Proxy 1          Bob
  |                |                |                |
  |     IAM F1     |                |                |
  |--------------->|   INVITE F2    |                |
  |                |--------------->|   INVITE F3    |
  |                |     100  F4    |--------------->|
  |                |<---------------|                |
  |                |                |   INVITE F5    |
  |                |                |--------------->|
  |                |                |   INVITE F6    |
  |                |                |--------------->|
  |                |                |   INVITE F7    |
  |                |                |--------------->|
  |                |                |   INVITE F8    |
  |                |                |--------------->|
  |                |                |   INVITE F9    |
  |                |                |--------------->|
  |     REL F10    |                |                |
  |--------------->|                |                |
  |     RLC F11    |                |                |
  |<---------------|                |                |
  |                |   CANCEL F12   |                |
  |                |--------------->|                |
  |                |     200 F13    |                |
  |                |<---------------|                |

Alice calls Bob through NGW 1 and Proxy 1 πŸ“± Proxy 1 re-sends the INVITE after SIP timer T1 expires, since it never gets any response from Bob 😬 Bob never answers with 180 Ringing or any other response, even though he's reachable but just unresponsive 🫠 Once a timer expires in Alice's network, she disconnects the call by sending a Release message REL. The Gateway maps that to a CANCEL πŸ’…

Message Details

F1 IAM Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-2222,NPI=E.164,NOA=National

F2 INVITE Alice -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

/* Proxy 1 uses a Location Service function to determine a route for +19725552222. The call is then forwarded to Bob. */

F3 INVITE Proxy 1 -> Bob

INVITE sip:bob@b.example.com  SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

F4 100 Trying Proxy 1 -> NGW 1

SIP/2.0 100 Trying
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 INVITE Proxy 1 -> Bob

Same as Message F3

F6 INVITE Proxy 1 -> Bob

Same as Message F3

F7 INVITE Proxy 1 -> Bob

Same as Message F3

F8 INVITE Proxy 1 -> Bob

Same as Message F3

F9 INVITE Proxy 1 -> Bob

Same as Message F3

/* Timer expires in Alice's access network. */

F10 REL Alice -> NGW 1

REL
CauseCode=16 Normal

F11 RLC NGW 1 -> Alice

RLC

F12 CANCEL NGW 1 -> Proxy 1

CANCEL sip:+19725552222@ss1.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F13 200 OK Proxy 1 -> NGW 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 CANCEL
Content-Length: 0

3.8. Unsuccessful PSTN->SIP, ACM timeout, stateless Proxy ✨

Okay so this scenario is a whole saga, bestie 😭. Alice calls Bob through NGW 1 and Proxy 1, but Proxy 1 is stateless, which means it does not send a 100 Trying response. Because nobody sends that little "I got it" message back, NGW 1 gets impatient and re-sends the INVITE once SIP timer T1 expires. It's giving dΓ©jΓ  vu, and it keeps happening πŸ™ˆ. Bob never picks up the vibe and never responds with 180 Ringing, so Alice's network finally gives up and disconnects the call with a release REL (CauseCode=102 Timeout). Iconic timeout energy πŸ’€.

Message Details

F1 IAM Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-2222,NPI=E.164,NOA=National

F2 INVITE NGW 1 -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

/* Proxy 1 uses a Location Service function to determine a route for
+19725552222.  The call is then forwarded to Bob. */

F3 INVITE Proxy 1 -> Bob

INVITE sip:bob@b.example.com  SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
Max-Forwards: 69
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

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

F4 INVITE NGW 1 -> Proxy 1

Same as Message F2

F5 INVITE Proxy 1 -> Bob

Same as Message F3

F6 INVITE NGW 1 -> Proxy 1

Same as Message F2

F7 INVITE Proxy 1 -> Bob

Same as Message F3

F8 INVITE NGW 1 -> Proxy 1

Same as Message F2

F9 INVITE Proxy 1 -> Bob

Same as Message F3

F10 INVITE NGW 1 -> Proxy 1

Same as Message F2

F11 INVITE Proxy 1 -> Bob

Same as Message F3

F12 INVITE NGW 1 -> Proxy 1

Same as Message F2

F13 INVITE Proxy 1 -> Bob

Same as Message F3

/* A timer expires in Alice's access network. */

F14 REL Alice -> NGW 1

REL
CauseCode=102 Timeout

F15 RLC NGW 1 -> Alice

RLC

3.9. Unsuccessful PSTN->SIP, Caller Abandonment πŸ™ˆπŸ’…

Okay so this one is giving "I'm about to hang up on you before you even pick up" energy πŸ“žπŸ’€. Alice calls Bob through NGW 1 and Proxy 1, but Bob never sends a 200 OK. Meanwhile NGW 1 plays ringing tone, because the ACM tells it that interworking happened somewhere along the way 🎢. Then Alice gets bored and hangs up with a Release message (REL), and NGW 1 translates that into a CANCEL for the SIP side ✨.

Plot twist πŸŒ€: if Bob had sent a 200 OK after the REL, NGW 1 would have sent an ACK and then a BYE to properly end the call. Very tidy, very iconic πŸ’œ.

   Switch A          NGW 1          Proxy 1           Bob
     |                |                |                |
     |     IAM F1     |                |                |
     |--------------->|   INVITE F2    |                |
     |                |--------------->|   INVITE F3    |
     |                |     100  F4    |--------------->|
     |                |<---------------|                |
     |                |                |      180 F5    |
     |                |    180 F6      |<---------------|
     |     ACM F7     |<---------------|                |
     |<---------------|                |                |
     |  One Way Voice |                |                |
     |<===============|                |                |
     |  Ringing Tone  |                |                |
     |<===============|                |                |
     |                |                |                |
     |     REL F8     |                |                |
     |--------------->|                |                |
     |     RLC F9     |                |                |
     |<---------------|   CANCEL F10   |                |
     |                |--------------->|                |
     |                |     200 F11    |                |
     |                |<---------------|                |
     |                |                |   CANCEL F12   |
     |                |                |--------------->|
     |                |                |     200 F13    |
     |                |                |<---------------|
     |                |                |     487 F14    |
     |                |                |<---------------|
     |                |                |     ACK F15    |
     |                |     487 F16    |--------------->|
     |                |<---------------|                |
     |                |     ACK F17    |                |
     |                |--------------->|                |
     |                |                |                |

Now for the message details, which are where the real magic lives πŸ”βœ¨.

Message Details πŸŽ€

F1 IAM Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=972-555-2222,NPI=E.164,NOA=National

F2 INVITE Alice -> Proxy 1

INVITE sip:+19725552222@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

/* Proxy 1 uses a Location Service function to determine a route for
+19725552222.  The call is then forwarded to Bob. */

F3 INVITE Proxy 1 -> Bob

INVITE sip:bob@b.example.com  SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:ngw1@a.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 146

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

F4 100 Trying Bob -> Proxy 1

SIP/2.0 100 Trying
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.201
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 180 Ringing Bob -> Proxy 1

SIP/2.0 180 Ringing
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com;transport=tcp>
Content-Length: 0

F6 180 Ringing Proxy 1 -> NGW 1

SIP/2.0 180 Ringing
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:bob@client.b.example.com>
Content-Length: 0

F7 ACM NGW 1 -> Alice

ACM

/* Alice hangs up */

F8 REL Alice -> NGW 1

REL
CauseCode=16 Normal

F9 RLC NGW 1 -> Alice

RLC

F10 CANCEL NGW 1 -> Proxy 1

CANCEL sip:+19725552222@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F11 200 OK Proxy 1 -> NGW 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F12 CANCEL Proxy 1 -> Bob

CANCEL sip:bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F13 200 OK Bob -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 CANCEL
Content-Length: 0

F14 487 Request Terminated Bob -> Proxy 1

SIP/2.0 487 Request Terminated
Via: SIP/2.0/TCP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F15 ACK Proxy 1 -> Bob

ACK sip:bob@b.example.com SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F16 487 Request Terminated Proxy 1 -> NGW 1

SIP/2.0 487 Request Terminated
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
 ;received=192.0.2.103
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F17 ACK NGW 1 -> Proxy 1

ACK sip:+19725552222@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TCP ngw1.a.example.com:5060;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sip:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sip:+19725552222@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 4Fde34wkd11wsGFDs3@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

4. PSTN to PSTN Dialing via SIP Network ✨

Okay, new vibe alert 🚨. In these scenarios, both the caller and the called party are in the telephone network, whether they're regular PSTN subscribers or PBX extensions πŸ“±β˜ŽοΈ. The calls route through two Gateways and at least one SIP Proxy Server, and the Proxy Server handles the authentication and location of the Gateways πŸ”πŸ—ΊοΈ.

Quick disclaimer, bestie 🫢: this call flows doc is NOT trying to give you a super detailed, parameter-by-parameter mapping of SIP to PSTN protocols. If you want SIP to ISUP mapping, check out the other references [4] πŸ“š.

Here's the payoff ✨: in these scenarios the call is successfully completed between the two Gateways, so the PSTN or PBX users can actually talk πŸ₯³πŸ’–. The 183 Session Progress response is used to indicate that in-band alerting may flow from the called party telephone switch to the caller πŸ””πŸŽ€.

4.1. Successful ISUP PSTN to ISUP PSTN call πŸ’–

okay so this is the happy path, bestie 🫢 Alice on the PSTN calls Carol, and the whole thing goes from ringing to talking to hanging up. Here's the full flow:

 Switch A       NGW 1         Proxy 1         GW 2         Switch C
  |              |              |              |              |
  |     IAM F1   |              |              |              |
  |------------->|              |              |              |
  |              |  INVITE F2   |              |              |
  |              |------------->|  INVITE F3   |              |
  |              |              |------------->|     IAM F4   |
  |              |              |              |------------->|
  |              |              |              |     ACM F5   |
  |              |              |   183 F6     |<-------------|
  |              |    183 F7    |<-------------|              |
  |    ACM F8    |<-------------|              |              |
  |<-------------|              |              |              |
  | One Way Voice|      Two Way RTP Media      | One Way Voice|
  |<=============|<===========================>|<=============|
  |              |              |              |    ANM F9    |
  |              |              |   200 F10    |<-------------|
  |              |    200 F11   |<-------------|              |
  |    ANM F12   |<-------------|              |              |
  |<-------------|              |              |              |
  |              |    ACK F13   |              |              |
  |              |------------->|    ACK F14   |              |
  |              |              |------------->|              |
  |Both Way Voice|     Both Way RTP Media      |Both Way Voice|
  |<=============|<===========================>|<=============|
  |              |              |              |    REL F15   |
  |              |              |              |<-------------|
  |              |              |   BYE F16    |              |
  |              |    BYE F18   |<-------------|    RLC F17   |
  |              |<-------------|              |------------->|
  |              |              |              |              |
  |              |    200 F19   |              |              |
  |              |------------->|    200 F20   |              |
  |              |              |------------->|              |
  |    REL F21   |              |              |              |
  |<-------------|              |              |              |
  |    RLC F22   |              |              |              |
  |------------->|              |              |              |
  |              |              |              |              |

So in this scenario πŸŽ€ Alice is in the PSTN and calls Carol, who's an extension on a PBX. Alice's telephone switch talks SS7 to the Network Gateway NGW 1, and Carol's PBX talks SS7 with the Gateway GW 2. GW 1 maps the CdPN and CgPN into SIP URIs and drops them into the To and From headers. Then Proxy 1 looks up the dialed digits in the Request-URI and maps them to Carol's PBX extension, which lives behind GW 2. The Proxy in F3 uses the host portion of the Request-URI to figure out which private dialing plan is being referenced. The INVITE then gets forwarded to GW 2 so the call can actually complete πŸ¦‹

An early media path is set up end-to-end, so Alice can hear the ringing tone that PBX C is generating. πŸ””

Carol answers ✨ and the media path gets cut through in both directions. Then Bob hangs up, which terminates the call. πŸ’…

Message Details 🌈

F1 IAM Switch Alice -> NGW 1

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=918-555-3333,NPI=E.164,NOA=National

F2 INVITE NGW 1 -> Proxy 1

INVITE sips:+19185553333@ss1.a.example.com;user=phone  SIP/2.0
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKlueha2
Max-Forwards: 70
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sips:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

v=0
o=GW 2890844526 2890844526 IN IP4 ngw1.a.example.com
s=-
c=IN IP4 ngw1.a.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* Proxy 1 consults Location Service and translates the dialed number
to a private number in the Request-URI*/

F3 INVITE Proxy 1 -> GW 2

INVITE sips:4443333@gw2.a.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKwqwee65
 ;received=192.0.2.103
Max-Forwards: 69
Record-Route: <sips:ss1.a.example.com;lr>
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sips:ngw1@a.example.com>
Content-Type: application/sdp
Content-Length: 146

v=0
o=GW 2890844526 2890844526 IN IP4 ngw1.a.example.com
s=-
c=IN IP4 ngw1.a.example.com
t=0 0
m=audio 3456 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 IAM GW 2 -> Switch C

IAM
CgPN=314-555-1111,NPI=E.164,NOA=National
CdPN=444-3333,NPI=Private,NOA=Subscriber

F5 ACM Switch C -> GW 2

ACM

/* Based on the ACM message, GW 2 returns a 183 response.  In-band
call progress indications are sent to Alice through NGW 1. */

F6 183 Session Progress GW 2 -> Proxy 1

SIP/2.0 183 Session Progress
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sips:ss1.a.example.com;lr>
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sips:4443333@gw2.a.example.com>
Content-Type: application/sdp
Content-Length: 143

v=0
o=GW 987654321 987654321 IN IP4 gw2.a.example.com
s=-
c=IN IP4 gw2.a.example.com
t=0 0
m=audio 14918 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F7 183 Session Progress Proxy 1 -> GW 1

SIP/2.0 183 Session Progress
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sips:ss1.a.example.com;lr>
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sips:4443333@gw2.a.example.com>
Content-Type: application/sdp
Content-Length: 143

v=0
o=GW 987654321 987654321 IN IP4 gw2.a.example.com
s=-
c=IN IP4 gw2.a.example.com
t=0 0
m=audio 14918 RTP/AVP 0
a=rtpmap:0 PCMU/8000

/* NGW 1 receives packets from GW 2 with encoded ringback, tones or
other audio.  NGW 1 decodes this and places it on the originating
trunk. */

F8 ACM NGW 1 -> Switch A

ACM

/* Bob answers */

F9 ANM Switch C -> GW 2

ANM

F10 200 OK GW 2 -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sips:ss1.a.example.com;lr>
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sips:4443333@gw2.a.example.com>
Content-Type: application/sdp
Content-Length: 143

v=0
o=GW 987654321 987654321 IN IP4 gw2.a.example.com
s=-
c=IN IP4 gw2.a.example.com
t=0 0
m=audio 14918 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F11 200 OK Proxy 1 -> NGW 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Record-Route: <sips:ss1.a.example.com;lr>
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 1 INVITE
Contact: <sips:4443333@gw2.a.example.com>
Content-Type: application/sdp
Content-Length: 143

v=0
o=GW 987654321 987654321 IN IP4 gw2.a.example.com
s=-
c=IN IP4 gw2.a.example.com
t=0 0
m=audio 14918 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F12 ANM NGW 1 -> Switch A

ANM

F13 ACK NGW 1 -> Proxy 1

ACK sips:4443333@gw2.a.example.com SIP/2.0
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKlueha2
Max-Forwards: 70
Route: <sips:ss1.a.example.com;lr>
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F14 ACK Proxy 1 -> GW 2

ACK sips:4443333@gw2.a.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TLS ngw1.a.example.com:5061;branch=z9hG4bKlueha2
 ;received=192.0.2.103
Max-Forwards: 69
From: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
To: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

/* RTP streams are established between NGW 1 and GW 2. */

/* Bob Hangs Up with Alice. */

F15 REL Switch C -> GW 2

REL
CauseCode=16 Normal

F16 BYE GW 2 -> Proxy 1

BYE sips:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TLS gw2.a.example.com:5061;branch=z9hG4bKtexx6
Max-Forwards: 70
Route: <sips:ss1.a.example.com;lr>
From: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
To: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 4 BYE
Content-Length: 0

F17 RLC GW 2 -> Switch C

RLC

F18 BYE Proxy 1 -> NGW 1

BYE sips:ngw1@a.example.com SIP/2.0
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
Via: SIP/2.0/TLS gw2.a.example.com:5061;branch=z9hG4bKtexx6
 ;received=192.0.2.202
Max-Forwards: 69
From: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
To: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 4 BYE
Content-Length: 0

F19 200 OK NGW 1 -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/TLS ss1.a.example.com:5061;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/TLS gw2.a.example.com:5061;branch=z9hG4bKtexx6
 ;received=192.0.2.202
From: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
To: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 4 BYE
Content-Length: 0

F20 200 OK Proxy 1 -> GW 2

SIP/2.0 200 OK
Via: SIP/2.0/TLS gw2.a.example.com:5061;branch=z9hG4bKtexx6
 ;received=192.0.2.202
From: <sips:+19185553333@ss1.a.example.com;user=phone>;tag=314159
To: <sips:+13145551111@ngw1.a.example.com;user=phone>;tag=7643kals
Call-ID: 2xTb9vxSit55XU7p8@ngw1.a.example.com
CSeq: 4 BYE
Content-Length: 0

F21 REL Switch C -> GW 2

REL
CauseCode=16 Normal

F22 RLC GW 2 -> Switch C

RLC

4.2. Successful FGB PBX to ISDN PBX call with overflow

Okay so picture this: PBX Alice is trying to call PBX Carol, and the call goes through GW 1 and Proxy 1 πŸ›€οΈ. Then things get a little messy. While the call is trying to reach Carol through GW 2, Proxy 1 gets a 503 Service Unavailable (F4) back for the INVITE it forwarded. That could mean every circuit is busy, or GW 2 is just having some other outage. We can't tell from here πŸ€·β€β™€οΈ. Proxy 1 spots the error and reroutes through GW 3 instead, and from there everything goes smoothly. Carol picks up, and the call ends when she hangs up πŸ“žβœ¨.

   PBX A       GW 1        Proxy 1        GW 2         GW 3        PBX C
     |            |            |            |            |            |
     |  Seizure   |            |            |            |            |
     |----------->|            |            |            |            |
     |    Wink    |            |            |            |            |
     |<-----------|            |            |            |            |
     |MF Digits F1|            |            |            |            |
     |----------->|            |            |            |            |
     |            | INVITE F2  |            |            |            |
     |            |----------->| INVITE F3  |            |            |
     |            |            |----------->|            |            |
     |            |            |   503 F4   |            |            |
     |            |            |<-----------|            |            |
     |            |            |   ACK F5   |            |            |
     |            |            |----------->|            |            |
     |            |            |  INVITE F6              |            |
     |            |            |------------------------>|  SETUP F7  |
     |            |            |          100  F8        |----------->|
     |            |            |<------------------------|CALL PROC F9|
     |            |            |                         |<-----------|
     |            |            |                         | ALERT F10  |
     |            |            |          180 F11        |<-----------|
     |            |  180 F12   |<------------------------|            |
     |            |<-----------|                         |            |
     | Ringtone   |            |                         |OneWay Voice|
     |<===========|            |                         |<===========|
     |            |            |                         | CONNect F13|
     |            |            |         200 F14         |<-----------|
     |            |  200 F15   |<------------------------|            |
     |  Seizure   |<-----------|                         |            |
     |<-----------|  ACK F16   |                         |            |
     |            |----------->|         ACK F17         |            |
     |            |            |------------------------>|CONN ACK F18|
     |            |            |                         |----------->|
     |BothWayVoice|          Both Way RTP Media          |BothWayVoice|
     |<==========>|<====================================>|<==========>|
     |            |            |                         |  DISC F19  |
     |            |            |                         |<-----------|
     |            |            |         BYE F20         |            |
     |            |  BYE F21   |<------------------------|  REL F22   |
     |Seiz Removal|<-----------|                         |----------->|
     |<-----------|  200 F23   |                         |            |
     |Seiz Removal|----------->|         200 F24         |            |
     |----------->|            |------------------------>| REL COM F25|
     |            |            |                         |<-----------|
     |            |            |                         |            |

PBX Alice calls PBX Carol via Gateway GW 1 and Proxy 1. During the attempt to reach Carol via GW 2, an error is encountered - Proxy 1 receives a 503 Service Unavailable (F4) response to the forwarded INVITE. This could be due to all circuits being busy, or some other outage at GW 2. Proxy 1 recognizes the error and uses an alternative route via GW 3 to terminate the call. From there, the call proceeds normally with Carol answering the call. The call is terminated when Carol hangs up.

Message Details πŸ’…

PBX Alice -> GW 1

Seizure

GW 1 -> PBX A

Wink

F1 MF Digits PBX Alice -> GW 1

KP 444 3333 ST

F2 INVITE GW 1 -> Proxy 1

INVITE sip:4443333@ss1.a.example.com SIP/2.0
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
Max-Forwards: 70
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:551313@gw1.a.example.com>
Content-Type: application/sdp
Content-Length: 155

v=0
o=GW 2890844526 2890844526 IN IP4 gw1.a.example.com
s=-
c=IN IP4 gw1.a.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
/* Proxy 1 uses a Location Service function to determine where B is
located.  Response is returned listing alternative routes, GW2 and
GW3, which are then tried sequentially. */

F3 INVITE Proxy 1 -> GW 2

INVITE sip:4443333@gw2.a.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:551313@gw1.a.example.com>
Content-Type: application/sdp
Content-Length: 155

v=0
o=GW 2890844526 2890844526 IN IP4 gw1.a.example.com
s=-
c=IN IP4 gw1.a.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F4 503 Service Unavailable GW 2 -> Proxy 1

SIP/2.0 503 Service Unavailable
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
 ;received=192.0.2.111
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F5 ACK Proxy 1 -> GW 2

ACK sip:4443333@ss1.a.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.1
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Max-Forward: 70
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=314159
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F6 INVITE Proxy 1 -> GW 3

INVITE sip:+19185553333@gw3.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Max-Forwards: 69
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:551313@gw1.a.example.com>
Content-Type: application/sdp
Content-Length: 155

v=0
o=GW 2890844526 2890844526 IN IP4 gw1.a.example.com
s=-
c=IN IP4 gw1.a.example.com
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F7 SETUP GW 3 -> PBX C

Protocol discriminator=Q.931
Message type=SETUP
Bearer capability: Information transfer capability=0 (Speech) or 16
(3.1 kHz audio)
Channel identification=Preferred or exclusive B-channel
Progress indicator=1 (Call is not end-to-end ISDN; further call
progress information may be available inband)
Called party number:
Type of number and numbering plan ID=33 (National number in ISDN
numbering plan)
Digits=918-555-3333

F8 100 Trying GW 3 -> Proxy 1

SIP/2.0 100 Trying
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Content-Length: 0

F9 CALL PROCeeding PBX C -> GW 3

Protocol discriminator=Q.931
Message type=CALL PROC

F10 ALERT PBX C -> GW 3

Protocol discriminator=Q.931
Message type=PROG

/* Based on ALERT message, GW 3 returns a 180 response. */

F11 180 Ringing GW 3 -> Proxy 1

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
 ;received=192.0.2.111
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:+19185553333@gw3.a.example.com;user=phone>
Content-Length: 0

F12 180 Ringing Proxy 1 -> GW 1

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65

 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:+19185553333@gw3.a.example.com;user=phone>
Content-Length: 0

F13 CONNect PBX C -> GW 3

Protocol discriminator=Q.931
Message type=CONN

F14 200 OK GW 3 -> Proxy 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
 ;received=192.0.2.111
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:+19185553333@gw3.a.example.com;user=phone>
Content-Type: application/sdp
Content-Length: 143

v=0
o=GW 987654321 987654321 IN IP4 gw3.a.example.com
s=-
c=IN IP4 gw3.a.example.com
t=0 0
m=audio 14918 RTP/AVP 0
a=rtpmap:0 PCMU/8000

F15 200 OK Proxy 1 -> GW 1

SIP/2.0 200 OK
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Record-Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 INVITE
Contact: <sip:+19185553333@gw3.a.example.com;user=phone>
Content-Type: application/sdp
Content-Length: 143

v=0
o=GW 987654321 987654321 IN IP4 gw3.a.example.com
s=-
c=IN IP4 gw3.a.example.com
t=0 0
m=audio 14918 RTP/AVP 0
a=rtpmap:0 PCMU/8000

GW 1 -> PBX A

Seizure

F16 ACK GW 1 -> Proxy 1

ACK sip:+19185553333@gw3.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F17 ACK Proxy 1 -> GW 3

ACK sip:+19185553333@gw3.a.example.com;user=phone SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
Via: SIP/2.0/UDP gw1.a.example.com:5060;branch=z9hG4bKwqwee65
 ;received=192.0.2.201
Max-Forwards: 69
From: <sip:551313@gw1.a.example.com>;tag=63412s
To: <sip:4443333@ss1.a.example.com>;tag=123456789
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 ACK
Content-Length: 0

F18 CONNect ACK GW 3 -> PBX C

Protocol discriminator=Q.931
Message type=CONN ACK

/* RTP streams are established between GW 1 and GW 3. */

/* Bob Hangs Up with Alice. */

F19 DISConnect PBX C -> GW 3

Protocol discriminator=Q.931
Message type=DISC
Cause=16 (Normal clearing)

F20 BYE GW 3 -> Proxy 1

Okay bestie, the BYE is still bouncing around the network, so let's keep the message flow going πŸ’…

BYE sip:551313@gw1.a.example.com SIP/2.0
Via: SIP/2.0/UDP gw3.a.example.com:5060;branch=z9hG4bKkdjuwq
Max-Forwards: 70
Route: <sip:ss1.a.example.com;lr>
From: <sip:4443333@ss1.a.example.com>;tag=123456789
To: <sip:551313@gw1.a.example.com>;tag=63412s
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 BYE
Content-Length: 0

F21 BYE Proxy 1 -> GW 1 πŸ¦‹

BYE sip:551313@gw1.a.example.com SIP/2.0
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
Via: SIP/2.0/UDP gw3.a.example.com:5060;branch=z9hG4bKkdjuwq
 ;received=192.0.2.203
Max-Forwards: 69
From: <sip:4443333@ss1.a.example.com>;tag=123456789
To: <sip:551313@gw1.a.example.com>;tag=63412s
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 BYE
Content-Length: 0

GW 1 -> PBX A 🌸

Seizure removal ✨

F22 RELease GW 3 -> PBX C πŸ“

Protocol discriminator=Q.931
Message type=REL

F23 200 OK GW 1 -> Proxy 1 πŸ’œ

SIP/2.0 200 OK
Via: SIP/2.0/UDP ss1.a.example.com:5060;branch=z9hG4bK2d4790.2
 ;received=192.0.2.111
Via: SIP/2.0/UDP gw3.a.example.com:5060;branch=z9hG4bKkdjuwq
 ;received=192.0.2.203
From: <sip:4443333@ss1.a.example.com>;tag=123456789
To: <sip:551313@gw1.a.example.com>;tag=63412s
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 BYE
Content-Length: 0

F24 200 OK Proxy 1 -> GW 3 🧚

SIP/2.0 200 OK
Via: SIP/2.0/UDP gw3.a.example.com:5060;branch=z9hG4bKkdjuwq
 ;received=192.0.2.203
From: <sip:4443333@ss1.a.example.com>;tag=123456789
To: <sip:551313@gw1.a.example.com>;tag=63412s
Call-ID: 2xTb9vxSit55XU7p8@gw1.a.example.com
CSeq: 1 BYE
Content-Length: 0

F25 RELease COMplete PBX C -> GW 3 πŸŽ€

Protocol discriminator=Q.931
Message type=REL COM

PBX Alice -> GW 1 🫢

Seizure removal πŸ’–


5. Security Considerations πŸ”

Okay, this part is seriously important, so pay attention πŸ™ˆ This document shows examples of mapping from SIP to ISUP and from ISUP to SIP. The gateways in these examples follow the Security Considerations Section of RFC 3398 [4], which we'll summarise here.

Honestly there aren't many security worries when you map ISUP to SIP, apart from privacy issues when the calling party number gets passed along. Some concerns with mapping tel URI parameters to ISUP involve users creating their own parameters and codes that touch the called number and local number portability (LNP). A gateway operator should use policies similar to the ones PSTN switches use to avoid security problems, because nobody wants that drama πŸ’€

Mapping a SIP response code to an ISUP Cause Code carries a theoretical risk, so a gateway operator may put policies in place to control this mapping. Gateways should also not rely on the contents of the From header field for identity information, since a user can populate it however they like πŸ™…β€β™€οΈ Instead, some sort of cryptographic authentication and authorization should be used for identity determination. These flows show HTTP Digest for user authentication. For brevity, the challenge isn't always shown, so don't be confused if it seems to be missing 🌈

The early media cut-through that appears in some flows is another potential security risk, but it's also required for proper interaction with the PSTN. Again, a gateway operator should use proper policies for early media to prevent fraud and misuse πŸ‘‘ Finally, a user agent (even a properly authenticated one) can launch multiple simultaneous requests through a gateway, which amounts to a denial of service attack. Adopting policies that limit the number of simultaneous requests from a single entity may be used to prevent this attack ⭐

As discussed in the SIP-T framework [7], SIP/ISUP interworking can be employed as an interdomain signaling mechanism, which may be subject to pre-existing trust relationships between administrative domains. Any administrative domain implementing SIP-T or SIP/ISUP interworking should have an adequate security apparatus in place. That apparatus should include elements that manage any appropriate policies for fraud and billing in an interdomain environment, so that translating ISUP information doesn't cause any security violations πŸ¦‹

Although this document doesn't show any examples of it, transporting ISUP in SIP bodies may open the door to abuse, fraud, and privacy concerns, especially when SIP-T requests can be generated, inspected, or modified by arbitrary SIP endpoints. ISUP MIME bodies should be secured (preferably with S/MIME as detailed in RFC 3261 [2]) to ease this concern. The authentication properties provided by S/MIME would let the recipient of a SIP-T message make sure that the ISUP MIME body was generated by an authorized entity. Encryption would ensure that only carriers holding a particular decryption key are able to inspect the encapsulated ISUP MIME bodies in a SIP request πŸ”’βœ¨


6. References πŸ“š

6.1. Normative References

[1] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.

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

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

[4] Camarillo, G., Roach, A. B., Peterson, J. and L. Ong, "Integrated Services Digital Network (ISDN) User Part (ISUP) to Session Initiation Protocol (SIP) Mapping", RFC 3398, December 2002.

[5] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., Leach, P., Luotonen, A. and L. Stewart, "HTTP Authentication: Basic and Digest Access Authentication", RFC 2617, June 1999.

[6] Vaha-Sipila, A., "URLs for Telephone Calls", RFC 2806, April 2000.

[7] Vemuri, A. and J. Peterson, "Session Initiation Protocol for Telephones (SIP-T): Context and Architectures", BCP 63, RFC 3372, September 2002.

[8] Zimmerer, E., Peterson, J., Vemuri, A., Ong, L., Audet, F., Watson, M. and M. Zonoun, "MIME media types for ISUP and QSIG Objects", RFC 3204, December 2001.

[9] Faltstrom, P., "E.164 number and DNS", RFC 2916, September 2000.

6.2. Informative References

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


7. Acknowledgments πŸ™

Thanks a ton to Rohan Mahy, Adam Roach, Gonzalo Camarillo, Cullen Jennings, and Tom Taylor for their detailed comments during the final review πŸ’– Thanks to Dean Willis for his early contributions to the development of this document. Thanks to Jon Peterson for his help on the security section 🫢

The authors wish to thank Kundan Singh for performing parser validation of messages ✨

The authors wish to thank the following individuals for their participation in a detailed review of this call flows document: Aseem Agarwal, Rafi Assadi, Ben Campbell, Sunitha Kumar, Jon Peterson, Marc Petit-Huguenin, Vidhi Rastogi, and Bodgey Yin Shaohua 🌸

The authors also wish to thank the following individuals for their assistance: Jean-Francois Mule, Hemant Agrawal, Henry Sinnreich, 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 πŸ‘‘


8. Intellectual Property Statement πŸ¦‹

The IETF takes no position on the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document, or on the extent to which any license under such rights might or might not be available. It also doesn't say it has tried to identify any such rights. Information on the IETF's procedures for rights in standards-track and standards-related documentation can be found in BCP-11. Copies of claims of rights made available for publication, and any assurances of licenses to be made available, or the result of an attempt to obtain a general license or permission for the use of such proprietary rights by implementors or users of this specification, can be obtained from the IETF Secretariat.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights which may cover technology that may be required to practice this standard. Please send that information to the IETF Executive Director.


9. Authors' Addresses 🧳

All listed authors actively contributed large amounts of text to this document πŸ’œ

Alan Johnston
MCI
100 South 4th Street
St. Louis, MO 63102
USA

EMail: alan.johnston@mci.com
Steve Donovan
dynamicsoft, Inc.
5100 Tennyson Parkway
Suite 1200
Plano, Texas 75024
USA

EMail: sdonovan@dynamicsoft.com
Robert Sparks
dynamicsoft, Inc.
5100 Tennyson Parkway
Suite 1200
Plano, Texas 75024
USA

EMail: rsparks@dynamicsoft.com
Chris Cunningham
dynamicsoft, Inc.
5100 Tennyson Parkway
Suite 1200
Plano, Texas 75024
USA

EMail: ccunningham@dynamicsoft.com
Kevin Summers
Sonus
1701 North Collins Blvd, Suite 3000
Richardson, TX 75080
USA

EMail: kevin.summers@sonusnet.com

Copyright (C) The Internet Society (2003). 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 assignees.

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