RFC 3911

The Session Initiation Protocol (SIP) "Join" Header

πŸ“… published October 2004, from ietf

RFC 3911: The Session Initiation Protocol (SIP) "Join" Header πŸŽ€

okay bestie, RFC 3911 is a Standards Track doc from the Network Working Group πŸ’… It came out in October 2004, written by R. Mahy (Airespace) and D. Petrie (Pingtel). It doesn't obsolete or update anything, since the title block doesn't list any. It's all about a brand new SIP header called Join πŸ¦‹


Status of This Memo ✨

okay so this doc is an Internet standards track protocol for the whole Internet community, and it's basically asking everyone to talk about it and suggest improvements 🫢 For the official standardization state and status of this protocol, check the current edition of the "Internet Official Protocol Standards" (STD 1). And the memo can be distributed with no limits, which is so generous πŸ’–

Copyright (C) The Internet Society (2004).

Abstract πŸ¦‹

this doc defines a brand new header for SIP multi-party apps and call control πŸ‘‘ The Join header is how you logically join an existing SIP dialog with a new SIP dialog. It's lowkey the primitive behind a bunch of features, like "Barge-In", answering-machine-style "Message Screening" and "Call Center Monitoring" 🎧 Just a heads up that the definitions of these example features are non-normative, so they're just examples and not rules πŸ™ˆ

Table of Contents 🧚

   1.   Introduction . . . . . . . . . . . . . . . . . . . . . . . .   2
   2.   Conventions  . . . . . . . . . . . . . . . . . . . . . . . .   3
   3.   Applicability of RFC 2804 ("Raven"). . . . . . . . . . . . .   3
   4.   User Agent Server Behavior: Receiving a Join Header  . . . .   4
   5.   User Agent Client Behavior: Sending a Join header  . . . . .   6
   6.   Proxy behavior . . . . . . . . . . . . . . . . . . . . . . .   7
   7.   Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . .   7
        7.1.  The Join Header  . . . . . . . . . . . . . . . . . . .   7
        7.2.  New option tag for Require and Supported headers . . .   8
   8.   Usage Examples . . . . . . . . . . . . . . . . . . . . . . .   8
        8.1.  Join accepted and transitioned to central conference .   9
        8.2.  Join rejected  . . . . . . . . . . . . . . . . . . . .  12
   9.   Security Considerations  . . . . . . . . . . . . . . . . . .  13
   10.  IANA Considerations  . . . . . . . . . . . . . . . . . . . .  14
        10.1. Registration of "Join" SIP header. . . . . . . . . . .  14
        10.2. Registration of "join" SIP Option-tag. . . . . . . . .  14
   11.  Acknowledgments  . . . . . . . . . . . . . . . . . . . . . .  14
   12.  References . . . . . . . . . . . . . . . . . . . . . . . . .  14
        12.1. Normative References . . . . . . . . . . . . . . . . .  14
        12.2. Informative References . . . . . . . . . . . . . . . .  15
   13.  Authors' Addresses . . . . . . . . . . . . . . . . . . . . .  16
   14.  Full Copyright Statement . . . . . . . . . . . . . . . . . .  17

1. Introduction ✨

okay so this doc describes a SIP [1] extension header field, and it's part of the SIP multiparty applications architecture framework [12] πŸ’… The Join header is used to logically join an existing SIP dialog with a new SIP dialog. This is especially useful in peer-to-peer call control environments 🫢

one main use of the "Join" header is inserting a new participant into a multimedia conversation. That conversation could be a two-party call or a SIP conference [15] πŸ“ž Now, this is already possible with 3rd party call control [17] (the "3pcc" model), but 3pcc needs a central point of control, and that's not always desirable in lots of environments 😬 So a way to do these same call control primitives in a distributed, peer-to-peer way is very desirable, honestly πŸ”₯

using an explicit Join header is needed in some cases, instead of addressing an INVITE to a conference URI, for these reasons:

  • A conference may not yet exist, because the new invitation may be trying to join an ordinary two-party call πŸ™ˆ
  • The party joining may not know if the dialog it wants to join is part of a conference.
  • The party joining may not know the conference URI.

the Join header enables services like barge-in, real-time message screening, and call center monitoring, all in a distributed peer-to-peer way πŸ¦‹ This list of services is not exhaustive, so there's more where that came from ✨

for example, the Boss has an established 2-party conversation with a Customer πŸ’Ό Using some out-of-band mechanism (like voice, gestures, or email), the Boss asks an Assistant to join the conversation. The Assistant sends an INVITE with a Join header to the Boss, with the dialog information for the established dialog. The Assistant got this info from some other mechanism, like a web-page, an instant message, or the SIP session dialog package [13] 🧚

   Assistant     Boss        Customer
   | callid: 4@A |  callid: 7@c |
   |             |              |
   |             |<============>|
   |             |              |
   |INVITE------>|              |
   |Join: 7@c    |              |
   |             |reINVITE----->|
   |<----200-----|<----200------|
   |-----ACK---->|<----ACK------|
   |             |              |
   |   .. begins mixing ..      |
   |             |              |
   |<===========>|<============>|
   |<::::::::::::::::::::::::::>|

note that this operation effectively creates a new conference πŸ‘‘ The Boss needs to cause a new conference to start, which means creating or getting a new conference URI. In this example, the Boss mixes all media locally, so the Boss needs to generate a new conference URI and return it as the Contact to the Join INVITE (with the "isfocus" Contact header field parameter as defined in [6]). Then the Boss reINVITEs or UPDATEs [22] the Customer with the conference URI as the new Contact. This scenario is also discussed in more detail in [16] πŸ’–

2. Conventions 🌈

the key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this doc are to be interpreted as described in RFC 2119 [2] πŸ“ These are the official BCP 14 key words, so they're serious business 😀

this doc refers a lot to the terms "confirmed dialog" and "early dialog" 🫢 Those are defined in Section 12 of SIP [1] πŸ’…

3. Applicability of RFC 2804 ("Raven") πŸ¦‹

this primitive can be used to create services for monitoring purposes, but those services don't meet the definition of a wiretap according to RFC 2804 [14] πŸ‘€ Here's the RFC 2804 definition, word for word:

      Wiretapping is what occurs when information passed across the
      Internet from one party to one or more other parties is delivered
      to a third party:

      1. Without the sending party knowing about the third party
      2. Without any of the recipient parties knowing about the delivery
         to the third party

      3. When the normal expectation of the sender is that the
         transmitted information will only be seen by the recipient
         parties or parties obliged to keep the information in
         confidence

      4. When the third party acts deliberately to target the
         transmission of the first party, either because he is of
         interest, or because the second party's reception is of
         interest.

so here's the tea πŸ“ item 2 of that definition does not apply to this extension, because one party is always aware of a Join request and can even decline it πŸ™…β€β™€οΈ On top of that, lots of applications of this primitive might not hit some of the other items either. For example, in many call centers that handle financial transactions, every conversation is recorded with the full knowledge and expectation of all the parties involved πŸŽ™οΈπŸ’œ

4. User Agent Server Behavior: Receiving a Join Header ✨

okay so the Join header carries the info needed to find an existing SIP dialog: the call-id, the to-tag, and the from-tag πŸ¦‹ when a UA gets an INVITE with a Join header, it tries to match that info against a confirmed or early dialog. the to-tag and from-tag get matched as if they were tags sitting in an incoming request, so the to-tag gets compared to the local tag and the from-tag gets compared to the remote tag πŸ’…

if there's more than one Join header field in an INVITE, or a Join header shows up in any request that isn't an INVITE, the UAS MUST reject it with a 400 Bad Request response πŸ™…β€β™€οΈ the Join header also has its own call control vibe, so if it shows up alongside another header with clashing semantics (like a Replaces [8] header field), the request MUST be rejected with a 400 "Bad Request" response. no mixing energy allowed πŸ’€

if the Join header field matches more than one dialog, the UA MUST act as if no match was found. too many matches is giving confusion πŸŒ€

if there's no match but the Request-URI in the INVITE points to a conference URI, the UAS MUST ignore the Join header and keep processing the INVITE like the Join header never existed πŸŽ€ this is what lets a UA that gets an INVITE with Join send the request straight to a conference URI, which is honestly iconic πŸ‘‘

otherwise, if there's no match at all, the UAS rejects the INVITE and returns a 481 Call/Transaction Does Not Exist response 🫠 same deal if the Join header field matches a dialog that wasn't created with an INVITE: the UAS MUST reject it with a 481 response.

if the Join header field matches a dialog that has already terminated, the UA SHOULD decline the request with a 603 Declined response πŸ₯€

now the main event πŸ“ if the Join header field matches an active dialog (n.b. unlike the Replaces header, the Join header has no limitation on its use with early dialogs!), the UA MUST verify that the initiator of the new INVITE is authorized to join the matched dialog. the join is authorized if the initiator has authenticated successfully as equivalent to the user being joined. for example, if the user being joined and the initiator share the same credentials for Digest authentication [4], or they sign the join request with S/MIME [5] using the same private key and present the (same) matching certificate from the original dialog, then the join is authorized πŸ”

there's also the Referred-By mechanism [9], which the UAS can use to check that a join request was sent on behalf of the other participant in the matched dialog (in this case, triggered by a REFER request). if the join request has a Referred-By header that corresponds to the user being joined, the UA SHOULD treat the join as if the joined party authorized it. the Referred-By header MUST reference a corresponding, valid Referred-By Authenticated Identity Body [10]. the UA MAY apply other local policy to authorize the rest of the request. in other words, the UAS may apply different policy to the joined dialog than was applied to the target dialog 🧚

the UA MAY also keep a list of authorized entities who are allowed to join any dialog with certain characteristics (for example, all dialogs placed in the call center context of the UA) πŸ“‹ and it MAY use other authorization mechanisms defined for this purpose in standards track extensions. for example, an extension could define a way to transitively assert that a join is authorized 🌈

if authorization succeeds, the UA attempts to accept the new INVITE and assigns any mixing or conferencing resources needed to complete the join ✨ but if the UA can't accept the new INVITE (for example, it can't establish required QoS or keying, or it has incompatible media), the UA MUST return an appropriate error response and MUST leave the matched dialog unchanged. the matched dialog stays exactly as it was, no drama 🫢

a User Agent that accepts a Join header needs to set up dialogs or conferences so that the requesting UAC gets logically added to the conversation space linked to the matched dialog. any dialogs already logically associated with the matched dialog in that same conversation space get included too πŸ’œ for a detailed rundown of the conferencing mechanisms that could handle a Join, check out the SIP conferencing framework [15] πŸ“š

if the UAS has enough resources to handle the Join request locally, the UAS SHOULD accept it and do the appropriate media mixing or combining 🎢 the UAS MAY rearrange the appropriate dialogs instead, as described below, based on some local policy.

if the UAS doesn't have enough resources locally, or doesn't want to use them, but knows about other resources that could satisfy the request (e.g., a centralized conference server), the UA SHOULD create a conference using that resource (e.g., INVITE the conference server to get a conference URI), redirect the requestor to that resource, and ask the other participants in the same conversation space to use it too 🌸 the UA MAY use any appropriate mechanism to move participants over to the new resource (e.g., 3xx response, 3rd-party call control reinvitations, REFER requests, or reinvitations to a multicast group). the UA SHOULD only use mechanisms that are expected to be acceptable to the other participants. for example, the UA SHOULD NOT try to move participants to a multicast group unless it can reasonably expect that all of them can support multicast πŸ™ˆ

and if the UAS is incapable of satisfying the Join request, it MUST return a 488 "Not Acceptable Here" response 😭


5. User Agent Client Behavior: Sending a Join header πŸ¦‹

a User Agent that wants to add a new dialog of its own to a single existing early or confirmed dialog, along with any associated dialogs or conferences, MAY send the target User Agent an INVITE request containing a Join header field πŸ’– the UAC puts the Call-ID, to-tag, and from-tag info for the target dialog into a single Join header field and sends the new INVITE to the target.

if the User Agent gets a 300-class response and acts on it by sending an INVITE to a Contact in that response, this redirected INVITE MUST contain the same Join header that was in the original request. it's kind of unusual, but it means an INVITE with a Join header can get redirected before it reaches the target UAS 🧭

heads up: using the Join mechanism doesn't give you a way to match multiple dialogs, and it doesn't let you match an entire call, an entire transaction, or follow a chain of proxy forking logic πŸ™…β€β™€οΈ


6. Proxy behavior ⭐

Proxy Servers don't need any new behavior to support this extension. they just pass the Join header field along transparently, as described in the SIP specification 🫢

but here's a plot twist 😳 a proxy (especially one forking based on application layer logic, like caller screening or time-of-day routing) can forward an INVITE with a Join header field to a completely unrelated set of Contacts, compared to the original request it was supposed to replace. when that happens, the INVITE with the Join header field will fail πŸ’€


7. Syntax πŸŽ€

7.1. The Join Header πŸ’…

the Join header field says that a new dialog (created by the INVITE the Join header field is in) should be joined with the dialog identified by the header field, plus any associated dialogs or conferences 🌈 it's a request header only, and it's only defined for INVITE requests. the Join header field MAY be encrypted as part of end-to-end encryption. only a single Join header field value may be present in a SIP request

this document adds the following entry to Table 3 of [1] πŸ“‹ extra entries for extension methods defined at publication time are also included, as a courtesy to you. none of it is normative. MESSAGE, SUBSCRIBE and NOTIFY, REFER, INFO, UPDATE, PRACK, and PUBLISH are defined respectively in [19], [20], [7], [21], [22], [23], and [24].

Header field    where   proxy   ACK  BYE  CAN  INV  OPT  REG  MSG
------------    -----   -----   ---  ---  ---  ---  ---  ---  ---
Join              R              -    -    -    o    -    -    -


                                SUB  NOT  REF  INF  UPD  PRA  PUB
                                ---  ---  ---  ---  ---  ---  ---
Join              R              -    -    -    -    -    -    -

the following syntax specification uses the augmented Backus-Naur Form (BNF) as described in RFC 2234 [3] πŸ”€

   Join            = "Join" HCOLON callid *(SEMI join-param)
   join-param      = to-tag / from-tag / generic-param
   to-tag          = "to-tag" EQUAL token
   from-tag        = "from-tag" EQUAL token

a Join header MUST contain exactly one to-tag and exactly one from-tag, because they're required for unique dialog matching πŸ”‘ for compatibility with dialogs started by RFC 2543 [11] compliant UAs, a to-tag of zero matches both a to-tag value of zero and a null to-tag. likewise, a from-tag of zero matches both a to-tag value of zero and a null from-tag.

examples, bestie πŸ“

   Join: 98732@sip.example.com
         ;from-tag=r33th4x0r
         ;to-tag=ff87ff

   Join: 12adf2f34456gs5;to-tag=12345;from-tag=54321

   Join: 87134@192.0.2.23;to-tag=24796;from-tag=0

7.2. New option tag for Require and Supported headers 🏷️

this spec defines a new Require/Supported header option tag, "join". UAs that support the Join header MUST include the "join" option tag in a Supported header field. UAs that want explicit failure notification if Join isn't supported MAY include the "join" option in a Require header field.

example, periodt πŸ’œ

   Require: join, 100rel

8. Usage Examples 🌟

the following non-normative examples aren't meant to list every possible way to use this extension. they're more like examples or ideas to get you thinking πŸ’­ for more examples, check out service-examples [18] ✨

8.1. Join accepted and transitioned to central conference πŸŽ€

Okay bestie, this is the happy path and it's sooo satisfying πŸ’– Carol (C) is already on a call with Bob (B), and there's a conference (conf) she's in. Alice (A) sends B an INVITE with a Join header, and B does all the juggling so that by the end, A, B and C are mixed together πŸ¦‹

   A             B              C            conf
   |             |  callid: 7@c |              |
   |             |              |              |
   |             |<-INVITE------|              | *1
   |             |-----200----->|              | *2
   |             |<----ACK------|              | *3
   |             |<============>|              |
   |             |              |              |
   |INVITE------>|              |              | *4
   |Join: 7@c    |--INVITE-------------------->| *5
   |             |<----200---------------------| *6
   |             |-----ACK-------------------->|
   |<----302-----|              |              | *7
   |-----ACK---->|              |              |
   |INVITE------------------------------------>| *8
   |<--200-------------------------------------| *9
   |---ACK------------------------------------>|
   |             |--REFER------>|              | *10
   |             |<---202-------|              |
   |             |<--NOTIFY-----|--INVITE-*11->|
   |             |------200---->|<----200-*12--|
   |             |<--NOTIFY-----|-----ACK----->|
   |             |------200---->|              |
   |             |---BYE------->|              |
   |             |<--200--------|              |
   |             |              |              |
   |<=========================================>| mixes the
   |             |<===========================>| three sessions
   |             |              |<============>| together

The conversation now looks exactly like the locally mixed one from the example in the Introduction 🌸 A doesn't see any of the Join machinery, so the details are totally transparent to A ✨ B could also have used 3rd party call control to move the necessary sessions instead, which is a whole other vibe πŸ’…

Message *1: C -> B

INVITE sip:bob@example.org SIP/2.0
To: <bob@example.org>
From: <carol@example.org>;tag=xyz
Call-Id: 7@c.example.org
CSeq 1 INVITE
Contact: <sip:carol@c.example.org>

Message *2: B -> C

SIP/2.0 200 OK
To: <bob@example.org>;tag=pdq
From: <carol@example.org>;tag=xyz
Call-Id: 7@c.example.org
CSeq 1 INVITE
Contact: <sip:bob@b.example.org>

Message *3: C -> B

ACK sip:carol@c.example.org SIP/2.0
To: <bob@example.org>;tag=pdq
From: <carol@example.org>;tag=xyz
Call-Id: 7@c.example.org
CSeq 1 INVITE

Message *4: A -> B

INVITE sip:bob@b.example.org SIP/2.0
To: <sip:bob@example.org>
From: <sip:alice@example.org>;tag=iii
Call-Id: 777@a.example.org
CSeq: 1 INVITE
Contact: <sip:alice@a.example.org>
Join: 7@c.example.org;to-tag=xyz;from-tag=pdq

Message *5: B -> conf

INVITE sip:conf-factory@example.org SIP/2.0
To: <sip:conf-factory@example.org>
From: <sip:bob@example.org>;tag=abc
Call-Id: 999@b.example.org
CSeq: 1INVITE
Contact: <sip:bob@b.example.org>

Message *6: conf -> B

SIP/2.0 200 OK
To: <sip:conf-factory@example.org>;tag=def
From: <sip:bob@example.org>;tag=abc
Call-Id: 999@b.example.org
CSeq: 1INVITE
Contact: <sip:conf456@conf-srv2.example.org>;isfocus

Message *7: B -> A

SIP/2.0 302 Moved Temporarily
To: <sip:bob@example.org>
From: <sip:alice@example.org>;tag=iii
Call-Id: 777@a.example.org
CSeq: 1 INVITE
Contact: <sip:conf456@conf-srv2.example.org>;isfocus

Message *8: A -> conf

INVITE sip:conf456@conf-srv2.example.org SIP/2.0
To: <sip:bob@example.org>
From: <sip:alice@example.org>;tag=iii
Call-Id: 777@a.example.org
CSeq: 2 INVITE
Contact: <sip:alice@a.example.org>
Join: 7@c.example.org;to-tag=xyz;from-tag=pdq

Message *9: conf ->A

SIP/2.0 200 OK
To: <sip:bob@example.org>;tag=jjj
From: <sip:alice@example.org>;tag=iii
Call-Id: 777@a.example.org
CSeq: 2 INVITE
Contact: <sip:conf456@conf-srv2.example.org>;isfocus

Message *10: B -> C

REFER sip:carol@c.example.org SIP/2.0
To: <carol@example.org>;tag=xyz
From: <bob@example.org>;tag=pdq
Call-Id: 7@c.example.org
CSeq: 1 REFER
Contact: <sip:bob@b.example.org>
Refer-To: <sip:conf456@conf-srv2.example.org>
Referred-By: <sip:bob@b.example.org>

Message *11: C -> conf

INVITE sip:conf456@conf-srv2.example.org SIP/2.0
To: <sip:conf456@conf-srv2.example.org>
From: <carol@example.org>;tag=mmm
Call-Id: 34343@c.example.com
CSeq: 1 INVITE
Contact: <sip:carol@c.example.com>
Referred-By: <sip:bob@b.example.org>

Message *12: C -> conf

SIP/2.0 200 OK
To: <sip:conf456@conf-srv2.example.org>
From: <carol@example.org>;tag=mmm
Call-Id: 34343@c.example.com
CSeq: 1 INVITE
Contact: <sip:conf456@conf-srv2.example.org>;isfocus
Referred-By: <sip:bob@b.example.org>

8.2. Join rejected πŸ™…β€β™€οΈ

Sometimes B just isn't up for it, and that's valid πŸ’… Here's the flow where the Join gets turned down:

   A             B              C
   |             |  callid: 7@c |
   |             |              |
   |             |<============>|
   |             |              |
   |INVITE------>|  *1          |
   |Join: 7@c    |              |
   |             |              |
   |<----486-----|  *2          |
   |-----ACK---->|              |
   |             |              |

In this example B is Busy (does not want to be disturbed), and therefore does not wish to add A πŸ“΅ B could also decline the request with a 603 response 🌈

Message *1: A -> B

INVITE sip:bob@b.example.org SIP/2.0
To: <sip:bob@example.org>
From: <sip:alice@example.org>;tag=iii
Call-Id: 777@a.example.org
CSeq: 1 INVITE
Contact: <sip:alice@a.example.org>
Join: 7@c.example.org;to-tag=xyz;from-tag=pdq

Message *2: B -> A

SIP/2.0 486 Busy
To: <sip:bob@example.org>
From: <sip:alice@example.org>;tag=iii
Call-Id: 777@a.example.org
CSeq: 1 INVITE

9. Security Considerations πŸ”

Okay this section is serious, so read it with your whole chest 😭

The extension specified in this document significantly changes the relative security of SIP devices πŸ’€ Right now in SIP, even if an eavesdropper learns the Call-ID, To, and From headers of a dialog, they can't easily modify or destroy that dialog as long as Digest authentication or end-to-end message integrity is being used πŸ›‘οΈ

This extension can be used to insert or monitor potentially sensitive content in a multimedia conversation πŸ‘€ So invitations with the Join header MUST only be accepted if the peer requesting the join has been properly authenticated using a standard SIP mechanism (Digest or S/MIME), and authorized to be joined with the target dialog. (All SIP implementations are already required to support Digest Authentication.) Generally, authorization for joins is configured as a matter of local policy, as long-duration persistent relationships 🧚

For example, the UAs used by call center agents might be configured with a list of identities who could join their calls (supervisors and any call center monitoring User Agents) 🎧 Alternatively, the call center agents might rely on transitive authorization assertions from a (shorter) list of authorized hosts (e.g., a certificate authority). For answering-machine-style message screening this is even easier πŸ“Ό Presumably the user screening their messages already has some credentials with their messaging server πŸ“±

Some mechanisms for obtaining the dialog information needed by the Join header (Call-ID, to-tag, and from-tag) include URIs on a web page, subscriptions to an appropriate event package, and notifications after a REFER request πŸ”— Use of end-to-end security mechanisms to integrity protect and encrypt this information is also RECOMMENDED πŸ”’

This extension was designed to take advantage of future signature or authorization schemes defined by standards track extensions ⭐ In general, call control features would benefit a lot from that work πŸŽ€

Section 4 describes specific mechanisms for authorization using Digest Authentication and S/MIME (RFC 3261) and Referred-by [9], the currently available capabilities in SIP πŸ’–

10. IANA Considerations πŸ“‹

10.1. Registration of "Join" SIP header

Name of Header:          Join

Short form:              none

Normative description:   section 7.1 of this document

10.2. Registration of "join" SIP Option-tag

Name of option:          join

Description:             Support for the SIP Join header

SIP headers defined:     Join

Normative description:   This document

11. Acknowledgments 🫢

Thanks to Robert Sparks, Alan Johnston, and Ben Campbell, and many other members of the SIP WG, for their continued support of the cause of distributed call control in SIP 🌸

12. References πŸ“š

12.1. Normative References

[1]   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.

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

[3]   Crocker, D. and P. Overell, "Augmented BNF for Syntax
      Specifications: ABNF", RFC 2234, November 1997.

[4]   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.

[5]   Ramsdell, B., "Secure/Multipurpose Internet Mail Extensions
      (S/MIME) Version 3.1 Message Specification", RFC 3851, July
      2004.

[6]   Rosenberg, J., "Indicating User Agent Capabilities in the
      Session Initiation Protocol  (SIP)", RFC 3840, August 2004.

12.2. Informative References πŸ“šβœ¨

okay so these are the bonus reads, the stuff the doc points to for context but doesn't make you follow πŸ’…

[7] Sparks, R., "The Session Initiation Protocol (SIP) Refer Method", RFC 3515, April 2003. πŸ¦‹

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

[9] Sparks, R., "The Session Initiation Protocol (SIP) Referred-By Mechanism", RFC 3892, September 2004. πŸŽ€

[10] Peterson, J., "Session Initiation Protocol (SIP) Authenticated Identity Body (AIB) Format", RFC 3893, September 2004. πŸ”₯

[11] Handley, M., Schulzrinne, H., Schooler, E., and J. Rosenberg, "SIP: Session Initiation Protocol", RFC 2543, March 1999. πŸ‘‘

[12] Mahy, R., "A Call Control and Multi-party usage framework for the Session Initiation Protocol (SIP)", Work in Progress, March 2003. 🧚

[13] Rosenberg, J. and H. Schulzrinne, "An INVITE Initiated Dialog Event Package for the Session Initiation Protocol (SIP)", Work in Progress, March 2003. πŸ’œ

[14] IAB and IESG, "IETF Policy on Wiretapping", RFC 2804, May 2000. 🌈

[15] Rosenberg, J., "A Framework for Conferencing with the Session Initiation Protocol", Work in Progress, May 2003. πŸ“

[16] Johnston, A. and O. Levin, "Session Initiation Protocol Call Control - Conferencing for User Agents", Work in Progress, April 2003. ⭐

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

[18] Johnston, A. and S. Donovan, "Session Initiation Protocol Service Examples", Work in Progress, March 2003. πŸ™ˆ

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

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

[21] Donovan, S., "The SIP INFO Method", RFC 2976, October 2000. πŸ¦‹

[22] Rosenberg, J., "The Session Initiation Protocol (SIP) UPDATE Method", RFC 3311, October 2002. πŸ”₯

[23] Rosenberg, J. and H. Schulzrinne, "Reliability of Provisional Responses in Session Initiation Protocol (SIP)", RFC 3262, June 2002. πŸ‘‘

[24] Campbell, B., "SIMPLE Presence Publication Mechanism", Work in Progress, February 2003. 🌸


13. Authors' Addresses πŸŽ€

these are the lovely people who wrote it, so you know exactly who to thank 🫢

Rohan Mahy
Airespace
110 Nortech Parkway
San Jose, CA 95134
USA

EMail: rohan@airespace.com


Dan Petrie
Pingtel
400 West Cummings Park, Suite 2200
Woburn, MA  01801
USA

EMail: dpetrie@pingtel.com

Copyright (C) The Internet Society (2004).

This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM 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.

Intellectual Property 🧾

The IETF takes no position regarding the validity or scope of any Intellectual Property Rights 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; nor does it represent that it has made any independent effort to identify any such rights. Information on the IETF's procedures with respect to rights in IETF Documents can be found in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat 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 implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.

Acknowledgement 🌷

Funding for the RFC Editor function is currently provided by the Internet Society. πŸ’œ

πŸ“¦ where this page comes from