RFC 3608

Session Initiation Protocol (SIP) Extension Header Field for Service Route Discovery During Registration

πŸ“… published October 2003, from ietf

RFC 3608 πŸŽ€ Session Initiation Protocol (SIP) Extension Header Field for Service Route Discovery During Registration

Okay bestie, this is RFC 3608 πŸ’– It's a Standards Track doc from the Network Working Group, dated October 2003 πŸ“…. The authors are D. Willis of dynamicsoft Inc. and B. Hoeneisen of Switch 🫢. The title block doesn't list anything it obsoletes or updates πŸ™ˆ

Status of This Memo ✨

Ngl, this section is the official "what kind of doc is this" bit πŸ“œ It says this is an Internet standards track protocol for the Internet community, and it's inviting discussion and suggestions for improvements πŸ’¬ If you want the standardization state and status of this protocol, check the current edition of the "Internet Official Protocol Standards" (STD 1) πŸ“š Distribution of this memo is unlimited 🌈

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

Abstract πŸ¦‹

Okay so this doc defines a SIP extension header field πŸŽ€ It gets used alongside responses to REGISTER requests. Its whole job is to let a registrar tell a registering user agent (UA) about a service route πŸ›£οΈ The UA can then use that route to request outbound services from the registrar's domain. Iconic ✨

Table of Contents 🌸

1.  Terminology  . . . . . . . . . . . . . . . . . . . . . . . .   2
2.  Background . . . . . . . . . . . . . . . . . . . . . . . . .   2
3.  Discussion of Mechanism  . . . . . . . . . . . . . . . . . .   4
4.  Applicability Statement  . . . . . . . . . . . . . . . . . .   5
5.  Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . .   5
6.  Usage  . . . . . . . . . . . . . . . . . . . . . . . . . . .   6
    6.1.  Procedures at the UA . . . . . . . . . . . . . . . . .   6
    6.2.  Procedures at the Proxy  . . . . . . . . . . . . . . .   7
    6.3.  Procedures at the Registrar  . . . . . . . . . . . . .   8
    6.4.  Examples of Usage  . . . . . . . . . . . . . . . . . .   9
          6.4.1.  Example of Mechanism in REGISTER Transaction .   9
          6.4.2.  Example of Mechanism in INVITE Transaction . .  12
7.  Security Considerations  . . . . . . . . . . . . . . . . . .  14
8.  IANA Considerations  . . . . . . . . . . . . . . . . . . . .  15
9.  Normative References . . . . . . . . . . . . . . . . . . . .  15
10. Informative References . . . . . . . . . . . . . . . . . . .  15
11. Intellectual Property Statement. . . . . . . . . . . . . . .  16
12. Authors' Addresses . . . . . . . . . . . . . . . . . . . . .  16
13. Full Copyright Statement . . . . . . . . . . . . . . . . . .  17

1. Terminology πŸ“–

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]. Those are the words that carry real weight in this doc, so read them as BCP 14 says 🧐

2. Background 🌈

So the Third Generation Partnership Project (3GPP) set up a requirement for discovering home proxies during SIP registration, and it published that requirement in [6] πŸ“£ In the 3GPP network, a home service proxy gets dynamically assigned to each address-of-record (AOR) 🎯 That assignment can happen alongside a REGISTER operation, or out-of-band whenever it's needed to support call services and the address-of-record has no registrations. This home service proxy can handle both inbound (UA terminated) and outbound (UA originated) services 🧚

For the inbound case, the Request-Uniform Resource Identifier (URI) of incoming SIP requests matches the address-of-record of a user tied to the home service proxy πŸ’Œ The home service proxy then (in most cases) forwards the request to the registered contact address for that AOR. The way to traverse required proxies between the home service proxy and the registered UA is covered in [4] πŸ›€οΈ

Outbound (UA originated) sessions are where it gets spicy 🌢️ The question is: "How does the UA know which service proxy to use and how to get there?" πŸ€”

Several mechanisms were floated in list discussions, including:

  1. Configuration data in the UA. This raises questions of UA configuration management and updating, especially if proxy assignment is very dynamic, such as in load-balancing scenarios.
  2. Use of some other protocol, such as HTTP, to get configuration data from a configuration server in the home network. While functional, this solution requires additional protocol engines, firewall complexity, operations overhead, and significant additional "over the air" traffic.
  3. Use of lookup tables in the home network, as may be done for inbound requests in some 3G networks. This has a relatively high overhead in terms of database operations.
  4. Returning a 302 response indicating the service proxy as a new contact, causing the upstream node processing the 302 (ostensibly the UA) to retransmit the request toward the service proxy. While this shares the database operation of the previous alternative, it does explicitly allow for caching the 302 response, thereby potentially reducing the frequency and number of database operations.
  5. Performing an operation equivalent to record-routing in a REGISTER transaction between the UA and the associated registrar, then storing that route in the UA and reusing it as a service route on future requests originating from the UA. While efficient, this constrains the service route for proxy operations to be congruent with the route taken by the REGISTER message.
  6. Returning service route information as the value of a header field in the REGISTER response. While similar to the previous alternative, this approach grants the ability for the registrar to selectively apply knowledge about the topology of the home network in constructing the service route.

This document defines this final alternative πŸŽ‰ That means returning the service route information as a header field in the REGISTER response. This new header field indicates a "preloaded route" that the UA may wish to use if it's requesting services from the proxy network associated with the registrar that generated the response πŸ¦‹

Scenario πŸ—ΊοΈ

UA1----P1-----|    |--R-------|
              |    |          |
              P2---|         DBMS
              |    |          |
UA2-----------|    |--HSP-----|

Here's the setup πŸ‘€ We've got a "home network" containing routing proxy P2, registrar R, home service proxy HSP, and database DBMS, which is used by both R and HSP. P2 is the "edge" of the home network from a SIP perspective, so it might get called an "edge proxy" πŸšͺ UA1 is an external UA sitting behind proxy P1. UA1 discovers P1 via Dynamic Host Configuration Protocol (DHCP). (That's just an example, and other mechanisms besides DHCP are possible.) UA2 is another UA on the Internet, and it doesn't use a default outbound proxy. The diagram doesn't show Domain Name System (DNS) elements, but the discussion will assume they're reasonably available 🌐 The mission? UA1 needs to discover HSP so that its outbound requests can be routed through HSP (at UA1's discretion), which gets it outbound services from HSP πŸš€

3. Discussion of Mechanism πŸ’­

UAs can include a Route header field in an initial request to force that request to visit, and potentially be serviced by, one or more proxies 🧭 Using such a route (called a "service route" or "preloaded route") lets a UA request services from a specific home proxy or network of proxies. The open question is: "How may a UA discover what service route to use?" πŸ™‹β€β™€οΈ

This document defines a header field called Service-Route, which can contain a route vector. If the UA uses it as discussed above, that vector directs requests through a specific sequence of proxies πŸŽ€ A registrar can use a Service-Route header field to tell a UA about a service route that, if the UA uses it, will provide services from a proxy or set of proxies associated with that registrar. The registrar can include the Service-Route header field in its response to a REGISTER request. So a registering UA learns about a service route it can use to request services from the system it just registered with πŸ’–

The routing set up by the Service-Route mechanism applies only to requests originating in the user agent πŸ™…β€β™€οΈ In other words, it applies only to UA originated requests, and not to requests terminated by that UA.

Simply put, the registrar generates a service route for the registering UA and returns it in the response to each successful REGISTER request πŸ’… This service route has the form of a Route header field that the registering UA can use to send requests through the service proxy the registrar selected. The UA uses this route by inserting it as a preloaded Route header field in requests it originates that are meant to route through the service proxy ✨

How the registrar builds the header field value is specific to the local implementation, and it's outside the scope of this document πŸ”’

4. Applicability Statement 🧁

The Service-Route mechanism is applicable when:

  1. The UA registers with a registrar.
  2. The registrar has knowledge of a service proxy that should be used by the UA when requesting services from the domain of the registrar. This knowledge may be a result of dynamic assignment or some other mechanism outside the scope of this document.
  3. The registrar(s) has/have sufficient knowledge of the network topology, policy, and situation such that a reasonable service route can be constructed.
  4. The service route constructed by the registrar is the same for all contacts associated with a single address-of-record. This mechanism does not provide for contact-specific service routes.
  5. Other mechanisms for proposing a service route to the UA are not available or are inappropriate for use within the specific environment.

Other methods may also exist for telling a UA about a service route πŸ€·β€β™€οΈ Those alternative methods are outside the scope of this document. Talking about why you'd want to assign a service route during registration, or when it'd be appropriate to do so, is also outside the scope of this document πŸ™ˆ

5. Syntax πŸŽ€

The syntax for the Service-Route header field is:

Service-Route = "Service-Route" HCOLON sr-value *( COMMA sr-value)

sr-value = name-addr *( SEMI rr-param )

Okay, important bit 🚨 The Service-Route header field values MUST conform to the syntax of a Route element as defined in [3]. As suggested there, such values MUST include the loose-routing indicator parameter ;lr for full compliance with [3] 🫢

The allowable usage of header fields is described in Tables 2 and 3 of [3]. The following additions to that table are needed for Service-Route πŸ“‹

Addition of Service-Route to SIP Table 3:

   Header field          where   proxy ACK BYE CAN INV OPT REG PRA
   _______________________________________________________________
   Service-Route        2xx      ar     -   -   -   -   -   o   -

6. Usage 🌸

6.1. Procedures at the UA πŸ’–

Okay so the UA does its normal registration thing first πŸ’…. The REGISTER response might come with a Service-Route header field, and if it does, the UA MAY store that value tied to the address-of-record that the REGISTER transaction registered a contact for πŸŽ€. If the UA handles more than one address-of-record, it may be able to keep multiple service routes, one for each address-of-record ✨. When the UA refreshes the registration, the stored Service-Route gets updated based on the Service-Route header field from the latest 200 class response. If that response has no Service-Route header field at all, the UA clears whatever service route it had stored for that address-of-record 🧹. And if the re-registration gets refused, or an existing registration expires and the UA decides not to re-register, the UA SHOULD discard any stored service route for that address-of-record πŸ’€.

The UA MAY choose to use a service route for future requests tied to an address-of-record when it knows one. If it does, it takes the contents of the Service-Route header field and uses them as a preloaded Route header field in outgoing initial requests [3]. The UA MUST preserve the order, in case there is more than one Service-Route header field or header field value 🫢.

Loose routes can interact with routing policy in pretty interesting ways πŸ¦‹. How the service route set fits together with any locally required default route and local policy is implementation dependent. For example, some devices use locally-configured explicit loose routing to reach a next-hop proxy, and others use a default outbound-proxy routing rule. But for the result to actually work, the combination MUST provide valid routing in the local environment. In general, the service route set gets appended to any locally configured route needed to egress the access proxy chain. Systems designers must match the service routing policy of their nodes with the basic SIP routing policy in order to get a workable system πŸ”₯.


6.2. Procedures at the Proxy πŸ¦‹

The Service-Route header field is generally treated like any other unknown header field by intermediate proxies. They just forward it on toward the destination πŸ’…. Note that, as usual, intermediate proxies that need to be traversed by future requests within a dialog may record-route. Proxies should not assume they'll be traversed by future requests in a dialog just because they show up in the Service-Route header field πŸ™ˆ.

There's a question of whether proxies processing a REGISTER response may add themselves to the route set in the Service-Route header field. Sounds useful for building service routes dynamically, but it has two big problems 😭. The first is about transparency from the registrar's point of view: intermediate proxies could add themselves without the registrar knowing or agreeing to it. The second is about end-to-end security. If the registrar uses S/MIME techniques to protect the REGISTER response, those additions would show up to the UA as "man in the middle" alterations in the response πŸ’€. So intermediate proxies SHOULD NOT alter the value of Service-Route in REGISTER responses, and if they do, the UA MUST NOT be required to accept the alteration πŸ›‘.

There are extra considerations if a proxy is "dual homed", which means it's connected to two (or more) different networks, so requests come in on one interface and get proxied out through another network interface 🌸. Proxies implementing multi-homing precisely as documented in [3] record-route a request with the sending interface. When they process the reply, they swap out the Record-Route header field value that represents the interface they proxied the request onto, and replace it with a new value that represents the interface they'll proxy the response onto. As a result, the route vector seen at the User Agent Server (UAS) isn't the exact inverse of the route vector seen at the User Agent Client (UAC). That's harmless by itself, but it makes things messier for nodes that use the recorded route vector (or recorded Path vector as per [4]) to figure out a service route for future use 🧩.

So instead of following the procedure in [3], proxies used with Service-Route that insert Record-Route or Path header field values SHOULD record not one but two route values when processing the request. The first value recorded indicates the receiving interface, and the second indicates the sending interface. When processing the response, no modification of the recorded route is required. This optimization gives you fully invertible routes that can be effectively used to construct service routes ✨.


6.3. Procedures at the Registrar 🌈

When a registrar gets a successful REGISTER request, it MAY choose to return one or more Service-Route header field(s) in the 200 class response. Whether to include these header field(s) in the 200 class response, and what value(s) to put in them, is a matter of local policy and outside the scope of this document 🧠.

Once the registrar has inserted a Service-Route header field or fields, it returns the 200 class response to the UA following standard procedures πŸ’–.

A REGISTER operation performing a Fetching Bindings (i.e., no Contact header field is present in the request) SHOULD return the same value of Service-Route as was returned in the corresponding previous REGISTER response for the address-of-record in question. Sometimes the Service-Route gets calculated dynamically by the registrar rather than stored, and whether that route should be recalculated during a Fetching Bindings operation is left up to the implementation πŸ€·β€β™€οΈ.

Note: A Fetching Bindings operation could be used by the UA to recover a lost value of Service-Route. Alternatively, a UA in this situation could just re-REGISTER.

Certain network topologies MAY require a specific proxy (e.g., firewall proxy) to be traversed before the home service proxy. So a registrar with specific knowledge of the network topology MAY return more than one Service-Route header field or element in the 200 class response. The order is top-down, which means the topmost Service-Route entry gets visited first πŸͺœ. These constructions are implementation specific and outside the scope of this document πŸ™ƒ.

In general, the Service-Route header field contains references to elements strictly within the administrative domain of the registrar and home service proxy. Like, imagine a user leaves the "home" network and roams into a "visited" network 🧳. The registrar can't be assumed to know the topology of the visited network, so the Service-Route it returns only contains elements within the home network 🏠.

Note that the inserted Service-Route element(s) MUST conform to the syntax of a Route element as defined in [3]. As suggested there, such route elements MUST include the loose-routing indicator parameter ";lr" for full compliance with [3] βœ….


6.4. Examples of Usage 🧚

We're going to walk through an example based on the scenario from the Background section earlier in this document πŸ“–. Here's the network diagram again:

Scenario

   UA1----P1-----|    |--R-------|
                 |    |          |
                 P2---|         DBMS
                 |    |          |
   UA2-----------|    |--HSP-----|

6.4.1. Example of Mechanism in REGISTER Transaction πŸ“

This example shows the message sequence for user agent UA1 registering to HOME.EXAMPLE.COM through registrar R. R returns a Service-Route saying UA1 may use home service proxy HSP.HOME.EXAMPLE.COM to receive outbound services from HOME.EXAMPLE.COM πŸ’….

Heads up, some header fields (e.g., Content-Length) and session descriptions are left out so the whole thing is shorter and hopefully easier to read πŸ™ˆ.

Message sequence for REGISTER returning Service-Route:

F1 Register UA1 -> P1

REGISTER sip:HOME.EXAMPLE.COM SIP/2.0
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKcR1ntRAp
To: Lawyer <sip:UA1@HOME.EXAMPLE.COM>
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=981211
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
 . . .

F2 Register P1 -> P2

REGISTER sip:HOME.EXAMPLE.COM SIP/2.0
Via: SIP/2.0/UDP P1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKlJuB1mcr
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKcR1ntRAp
To: Lawyer <sip:UA1@HOME.EXAMPLE.COM>
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=981211
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
 . . .

F3 Register P2 -> R

REGISTER sip:HOME.EXAMPLE.COM SIP/2.0
Via: SIP/2.0/UDP P2.HOME.EXAMPLE.COM:5060;branch=z9hG4bKvE0R2l07o2b6T
Via: SIP/2.0/UDP P1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKlJuB1mcr
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKcR1ntRAp
To: Lawyer <sip:UA1@HOME.EXAMPLE.COM>
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=981211
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
 . . .

F4 R executes Register

R Stores:
For <sip:UA1@HOME.EXAMPLE.COM>
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>

F5 R calculates Service Route

In this example R is set up with HSP as a service route, and R knows P2 is the provider edge proxy, so R sends back:

Service-Route: <sip:P2.HOME.EXAMPLE.COM;lr>,
               <sip:HSP.HOME.EXAMPLE.COM;lr>

F6 Register Response r -> P2

SIP/2.0 200 OK
Via: SIP/2.0/UDP P2.HOME.EXAMPLE.COM:5060;branch=z9hG4bKvE0R2l07o2b6T
Via: SIP/2.0/UDP P1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKlJuB1mcr
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKcR1ntRAp
To: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=87654
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=981211
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
Service-Route: <sip:P2.HOME.EXAMPLE.COM;lr>,
               <sip:HSP.HOME.EXAMPLE.COM;lr>
 . . .

F7 Register Response P2 -> P1

SIP/2.0 200 OK
Via: SIP/2.0/UDP P1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKlJuB1mcr
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKcR1ntRAp
To: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=87654
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=981211
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
Service-Route: <sip:P2.HOME.EXAMPLE.COM;lr>,
               <sip:HSP.HOME.EXAMPLE.COM;lr>
 . . .

F8 Register Response P1 -> UA1

SIP/2.0 200 OK
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKcR1ntRAp
To: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=87654
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=981211
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
Service-Route: <sip:P2.HOME.EXAMPLE.COM;lr>,
               <sip:HSP.HOME.EXAMPLE.COM;lr>
 . . .

F9 UA1 stores service route for UA1@HOME.EXAMPLE.COM βœ¨πŸŽ‰

6.4.2. Example of Mechanism in INVITE Transaction ✨

okay bestie, this one is the INVITE version πŸ“ž A call starts at UA1, the lawyer, and ends up at UA2, the customer, but it goes through HOME.EXAMPLE.COM's outbound services on the way. UA1 already registered and got told about a service route through HSP.HOME.EXAMPLE.COM πŸ›£οΈ The service here is a "logging" one that keeps a record of the call for UA1 (maybe the lawyer bills customers by the call, which is so real πŸ’Ό).

Also, UA1 and UA2 are both registered with the same network (HOME.EXAMPLE.COM) in this example. That's not a must for using service routes though, so don't think it's the only way πŸ™ƒ

Here's the message sequence for an INVITE using Service-Route:

F1 Invite UA1 -> P1

INVITE sip:UA2@HOME.EXAMPLE.COM SIP/2.0
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKnashds7
To: Customer <sip:UA2@HOME.EXAMPLE.COM>
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=456248
Call-ID: 38615183343@s1i1l2j6u
CSeq: 18 INVITE
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
Route: <sip:P2.HOME.EXAMPLE.COM;lr>,
       <sip:HSP.HOME.EXAMPLE.COM;lr>
 . . .

Note: P1 is selected using the "outbound proxy" rule in UA1.

F2 Invite P1 -> P2

INVITE sip:UA2@HOME.EXAMPLE.COM SIP/2.0
Via: SIP/2.0/UDP P1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bK34ghi7ab04
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKnashds7
To: Customer <sip:UA2@HOME.EXAMPLE.COM>
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=456248
Call-ID: 38615183343@s1i1l2j6u
CSeq: 18 INVITE
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
Record-Route: <sip:P1.VISITED.EXAMPLE.ORG;lr>
Route: <sip:P2.HOME.EXAMPLE.COM;lr>,
       <sip:HSP.HOME.EXAMPLE.COM;lr>
 . . .

Note: P1 has added itself to the Record Route.

F3 Invite P2 -> HSP

INVITE sip:UA2@HOME.EXAMPLE.COM SIP/2.0
Via: SIP/2.0/UDP P2.HOME.EXAMPLE.COM:5060;branch=z9hG4bKiokioukju908
Via: SIP/2.0/UDP P1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bK34ghi7ab04
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKnashds7
To: Customer <sip:UA2@HOME.EXAMPLE.COM>
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=456248
Call-ID: 38615183343@s1i1l2j6u
CSeq: 18 INVITE
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
Record-Route: <sip:P2.HOME.EXAMPLE.COM;lr>
Record-Route: <sip:P1.VISITED.EXAMPLE.ORG;lr>
Route: <sip:HSP.HOME.EXAMPLE.COM;lr>
 . . .

Note: HSP is selected using a DNS lookup for HSP within
HOME.EXAMPLE.COM.
P2 has added itself to the Record-Route.
P2 has removed itself from the Route.

F4 HSP executes service

HSP looks up which service to run from UA1's stored profile πŸ—‚οΈ How that works is out of scope for this document, so we're not going there. In this example, HSP writes a record to "Lawyer's log book" πŸ“– and then looks up the AOR sip:UA2@HOME.EXAMPLE.COM. It finds that UA2's current contact is at UAADDR2.HOME.EXAMPLE.COM, and that becomes the Request-URI of the next-hop INVITE 🎯

F5 Invite HSP -> P2

INVITE sip:UA2@UAADDR2.HOME.EXAMPLE.COM SIP/2.0
Via: SIP/2.0/USP HSP.HOME.EXAMPLE.COM:5060;branch=z9hG4bKHSP10120323
Via: SIP/2.0/UDP P2.HOME.EXAMPLE.COM:5060;branch=z9hG4bKiokioukju908
Via: SIP/2.0/UDP P1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bK34ghi7ab04
Via: SIP/2.0/UDP UADDR1.VISITED.EXAMPLE.ORG:5060;branch=z9hG4bKnashds7
To: Customer <sip:UA2@HOME.EXAMPLE.COM>
From: Lawyer <sip:UA1@HOME.EXAMPLE.COM>;tag=456248
Call-ID: 38615183343@s1i1l2j6u
CSeq: 18 INVITE
Contact: <sip:UA1@UADDR1.VISITED.EXAMPLE.ORG>
Record-Route: <sip:HSP.HOME.EXAMPLE.COM;lr>
Record-Route: <sip:P2.HOME.EXAMPLE.COM;lr>
Record-Route: <sip:P1.VISITED.EXAMPLE.ORG;lr>

 . . .

Note: P2 selected by outbound proxy rule on HSP.
HSP has removed itself from the Route.

The INVITE then carries on toward UA2 as usual πŸ’–


7. Security Considerations πŸ”

okay this section is serious, so I'm gonna keep it real 😭 Proxies sitting between the UA and the registrar during the REGISTER transaction could change the Service-Route value the registrar sends back. They could also add a Service-Route even when the registrar didn't send one at all πŸ’€ The result is that the UA's future requests using that service route could get sent to a node nobody meant to visit. Proxies on the INVITE path can also pull off lots of different attacks 🚨 So it's really desirable to use transitive mutual authentication, either with sips: or some other mechanism that's available, to stop this stuff.

The sips: URI, as defined in [3], is a way for a UA to ask for transport-level message integrity and mutual authentication. Proxies aren't required to modify messages, so S/MIME signed bodies can give end-to-end protection for the returned value πŸŽ€

Now the actual rules. Systems using Service-Route SHOULD provide hop-by-hop message integrity and mutual authentication. UAs SHOULD ask for this by using a sips: URI 🫢 Registrars that return a Service-Route MUST implement end-to-end protection using S/MIME, and they SHOULD use S/MIME to protect all of those responses πŸ”’ UAs that receive a Service-Route SHOULD authenticate any attached S/MIME bodies if they're there ✨


8. IANA Considerations πŸ“‹

This document defines the SIP extension header field "Service-Route", and it's been added to the registry of SIP header fields defined in [3] πŸŽ‰ The change process for SIP, [5], says general SIP extension header fields have to be defined by a standards-track RFC. This document is what provides that definition πŸ’…

Here's the registration for the Service-Route header field:

RFC Number: RFC 3608

Header Field Name: Service-Route

Compact Form: none

9. Normative References πŸ“š

  • [1] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [2] Postel, J. and J. Reynolds, "Instructions to RFC Authors", RFC 2223, October 1997.
  • [3] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M. and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, June 2002.
  • [4] Willis, D. and B. Hoeneisen, "Session Initiation Protocol (SIP) Extension Header Field for Registering Non-Adjacent Contacts", RFC 3327, December 2002.
  • [5] Mankin, A., Bradner, S., Mahy, R., Willis, D., Ott, J. and B. Rosen, "Change Process for the Session Initiation Protocol (SIP)", BCP 67, RFC 3427, December 2002.

10. Informative References 🧠

  • [6] Garcia-Martin, M., "3rd-Generation Partnership Project (3GPP) Release 5 requirements on the Session Initiation Protocol (SIP)", Work in Progress, October 2002.

11. Intellectual Property Statement βš–οΈ

The legal text in this section has to stay exact, so here it is word for word 🫑

The IETF takes no position regarding 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 the extent to which any license under such rights
might or might not be available; neither does it represent that it
has made any effort to identify any such rights. Information on the
IETF's procedures with respect to 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 made 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 address the information to the IETF Executive
Director.

12. Authors' Addresses πŸ–‹οΈ

Dean Willis
dynamicsoft Inc.
3100 Independence Parkway
#311-164
Plano, TX  75075
US

Phone: +1 972 473 5455
EMail: dean.willis@softarmor.com


Bernie Hoeneisen
Switch
Limmatquai 138
CH-8001 Zuerich
Switzerland

Phone: +41 1 268 1515
EMail: hoeneisen@switch.ch, b.hoeneisen@ieee.org
URI:   http://www.switch.ch/

The copyright notice and the permissions are a legal thing, so they're kept exactly as written πŸ“œ

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