RFC 4117
Transcoding Services Invocation in the Session Initiation Protocol (SIP) Using Third Party Call Control (3pcc)
RFC 4117: Transcoding Services Invocation in the Session Initiation Protocol (SIP) Using Third Party Call Control (3pcc) π
(Part 1 of 4)
- Series: Network Working Group β¨
- Number: RFC 4117
- Authors: G. Camarillo (Ericsson), E. Burger (Brooktrout), H. Schulzrinne (Columbia University), and A. van Wijk (Viataal) π―ββοΈ
- Category: Informational π¦
- Date: June 2005 π
- Obsoletes / Updates: the header doesn't list anything this RFC obsoletes or updates π
Status of This Memo π
bestie, this memo is just giving information for the Internet community π It does not specify an Internet standard of any kind, so it's not a standard. Distribution of this memo is unlimited π
Copyright Notice Β©οΈ
Copyright (C) The Internet Society (2005).
Abstract πΈ
okay so this doc explains how to invoke transcoding services using Session Initiation Protocol (SIP) and third party call control π§ This way of invocation meets the requirements for SIP about transcoding services invocation to support deaf, hard of hearing and speech-impaired individuals π«Ά that's so important, not gonna lie π
Table of Contents π
1. Introduction ....................................................2
2. General Overview ................................................2
3. Third Party Call Control Flows ..................................2
3.1. Terminology ................................................3
3.2. Callee's Invocation ........................................3
3.3. Caller's Invocation ........................................8
3.4. Receiving the Original Stream ..............................8
3.5. Transcoding Services in Parallel ..........................10
3.6. Multiple Transcoding Services in Series ...................14
4. Security Considerations ........................................16
5. Normative References ...........................................17
6. Informative References .........................................17
1. Introduction π
so the framework for transcoding with SIP [4] explains how two SIP [1] UAs (User Agents) can figure out when they're incompatible and can't set up a session together π© (like if they don't both support a common codec or a common media type). When that happens, the UAs need to invoke transcoding services so they can actually establish the session β¨ 3pcc (third party call control) [2] is one way to do that invocation π
2. General Overview π¦
in the 3pcc model for transcoding invocation, there's a transcoding server that offers a particular transcoding service (e.g., speech-to-text), and that server is identified by a URI π A UA that wants that service sends an INVITE request to that URI, which sets up a bunch of media streams π How the transcoder handles and manages what's inside those streams (e.g., the text coming in over the text stream gets turned into speech and sent out over the audio stream) depends on the service itself π§
all the call flows in this doc use SDP π The same call flows could work with another session description protocol that has similar session description capabilities π
3. Third Party Call Control Flows π
okay this is the main event π₯ Say we have two UAs (A and B) and a transcoding server (T). Invoking a transcoding service means setting up two sessions: A-T and T-B π¦ How those sessions get set up depends on who invokes the service, the caller (A) or the callee (B) π Section 3.2 covers callee invocation and Section 3.3 covers caller invocation π
in all our 3pcc flows, we followed one main rule: a 200 (OK) response from the transcoding service has to come back before we contact the callee π«Ά This tries to make sure the transcoding service is actually available when the callee accepts the session π
ngl, there's a catch π¬ The transcoding service doesn't know exactly what kind of transcoding it'll be doing until the callee accepts the session. So there's always a chance it fails to provide transcoding after the callee has already accepted π A system with stricter requirements could use preconditions to avoid that situation π₯ When preconditions are used, the callee doesn't get alerted until everything is ready for the session β¨
3.1. Terminology π
all the flows in this document follow the naming convention below π
SDP A:a session description generated by A π¨ It contains, among other things, the transport address/es (IP address and port number) where A wants to receive media for each particular stream π§SDP B:a session description generated by B π¨ It contains, among other things, the transport address/es where B wants to receive media for each particular stream πΆSDP A+B:a session description that contains, among other things, the transport address/es where A wants to receive media and the transport address/es where B wants to receive media π€SDP TA:a session description generated by T and intended for A π¨ It contains, among other things, the transport address/es where T wants to receive media from A πΈSDP TB:a session description generated by T and intended for B π¨ It contains, among other things, the transport address/es where T wants to receive media from B πSDP TA+TB:a session description generated by T that contains, among other things, the transport address/es where T wants to receive media from A and the transport address/es where T wants to receive media from B π§ββοΈ
3.2. Callee's Invocation π
okay so in this scenario, B gets an INVITE from A and decides to bring in T π¦ Figure 1 shows the call flow.
In Figure 1, A can both hear and speak π§, and B is a deaf user with a speech impairment π«Ά. A proposes a session with an audio stream (1). B only wants to send and receive text, so B calls on a transcoding service T that does both speech-to-text and text-to-speech conversions (2). The session descriptions for Figure 1 are partially shown below β¨
A T B
| | |
|--------------------(1) INVITE SDP A-------------------->|
| | |
| |<---(2) INVITE SDP A+B------|
| | |
| |---(3) 200 OK SDP TA+TB---->|
| | |
| |<---------(4) ACK-----------|
| | |
|<-------------------(5) 200 OK SDP TA--------------------|
| | |
|------------------------(6) ACK------------------------->|
| | |
| ************************** | ************************** |
|* MEDIA *|* MEDIA *|
| ************************** | ************************** |
| | |
Figure 1: Callee's Invocation of a Transcoding Service
(1) INVITE SDP A πΈ
m=audio 20000 RTP/AVP 0
c=IN IP4 A.example.com
(2) INVITE SDP A+B π
m=audio 20000 RTP/AVP 0
c=IN IP4 A.example.com
m=text 40000 RTP/AVP 96
c=IN IP4 B.example.com
a=rtpmap:96 t140/1000
(3) 200 OK SDP TA+TB π§
m=audio 30000 RTP/AVP 0
c=IN IP4 T.example.com
m=text 30002 RTP/AVP 96
c=IN IP4 T.example.com
a=rtpmap:96 t140/1000
(5) 200 OK SDP TA π
m=audio 30000 RTP/AVP 0
c=IN IP4 T.example.com
Four media streams (aka two bi-directional streams) are set up at this point, and honestly this is so iconic π
- Audio from A to T.example.com:30000
- Text from T to B.example.com:40000
- Text from B to T.example.com:30002
- Audio from T to A.example.com:20000
When either A or B decides to end the session, they send a BYE saying the session is over π bye bestie π
If the first INVITE (1) that B gets is empty (no session description), the call flow is a little different π Figure 2 shows the messages involved.
B might have different reasons for calling on T before knowing A's session description π€ Maybe B wants to hide the fact that it lacks native capabilities, so it returns a session description with all the codecs B supports plus all the codecs T supports π Or T might offer recording services (on top of transcoding), and B wants T to record the conversation no matter whether transcoding is needed ποΈ
This scenario (Figure 2) is a bit more complex than the last one π In INVITE (2), B still doesn't have SDP A, so it can't give that info to T. When B finally gets SDP A in (6), it has to send it to T. B sends an empty INVITE to T (7) and gets back a 200 OK with SDP TA+TB (8). Generally, this SDP TA+TB can be different from the one sent in (3) π¦ That's why B needs to send the updated SDP TA to A in (9). Then A sends a possibly updated SDP A (10), and B sends it to T in (12). On the other hand, if T returns the same SDP TA+TB in (8) as it did in (3), B can skip messages (9), (10), and (11) β¨ So implementors of transcoding services are encouraged to return the same session description in (8) as in (3) in this type of scenario π The session descriptions for this flow are shown below:
A T B
| | |
|----------------------(1) INVITE------------------------>|
| | |
| |<-----(2) INVITE SDP B------|
| | |
| |---(3) 200 OK SDP TA+TB---->|
| | |
| |<---------(4) ACK-----------|
| | |
|<-------------------(5) 200 OK SDP TA--------------------|
| | |
|-----------------------(6) ACK SDP A-------------------->|
| | |
| |<-------(7) INVITE----------|
| | |
| |---(8) 200 OK SDP TA+TB---->|
| | |
|<-----------------(9) INVITE SDP TA----------------------|
| | |
|------------------(10) 200 OK SDP A--------------------->|
| | |
|<-----------------------(11) ACK-------------------------|
| | |
| |<-----(12) ACK SDP A+B------|
| | |
| ************************** | ************************** |
|* MEDIA *|* MEDIA *|
| ************************** | ************************** |
Figure 2: Callee's invocation after initial INVITE without SDP
(2) INVITE SDP A+B π
m=audio 20000 RTP/AVP 0
c=IN IP4 0.0.0.0
m=text 40000 RTP/AVP 96
c=IN IP4 B.example.com
a=rtpmap:96 t140/1000
(3) 200 OK SDP TA+TB β
m=audio 30000 RTP/AVP 0
c=IN IP4 T.example.com
m=text 30002 RTP/AVP 96
c=IN IP4 T.example.com
a=rtpmap:96 t140/1000
(5) 200 OK SDP TA π
m=audio 30000 RTP/AVP 0
c=IN IP4 T.example.com
(6) ACK SDP A π§
m=audio 20000 RTP/AVP 0
c=IN IP4 A.example.com
(8) 200 OK SDP TA+TB π
m=audio 30004 RTP/AVP 0
c=IN IP4 T.example.com
m=text 30006 RTP/AVP 96
c=IN IP4 T.example.com
a=rtpmap:96 t140/1000
(9) INVITE SDP TA πΈ
m=audio 30004 RTP/AVP 0
c=IN IP4 T.example.com
(10) 200 OK SDP A π
m=audio 20002 RTP/AVP 0
c=IN IP4 A.example.com
(12) ACK SDP A+B π¦
m=audio 20002 RTP/AVP 0
c=IN IP4 A.example.com
m=text 40000 RTP/AVP 96
c=IN IP4 B.example.com
a=rtpmap:96 t140/1000
Four media streams (aka two bi-directional streams) are set up at this point too π
- Audio from A to T.example.com:30004
- Text from T to B.example.com:40000
- Text from B to T.example.com:30006
- Audio from T to A.example.com:20002
3.3. Caller's Invocation π
okay this one is giving caller energy π In this scenario, A wants to set up a session with B using a transcoding service. A uses 3pcc to set up the session between T and B. The call flow here is a little different from the ones in [2] π In [2], the controller sets up a session between two user agents, and those are the ones deciding what the streams look like. Here, A wants a session between T and B, but A also wants to decide how many streams and which types of streams get set up π«Ά That's why A sends its session description in the first INVITE (1) to T, instead of the media-less initial INVITE recommended by [2]. Figure 3 shows the call flow for this scenario π§
We don't include the session descriptions for this flow, since they're very similar to the ones in Figure 2 π In this flow, if T returns the same SDP TA+TB in (8) as in (2), messages (9), (10), and (11) can be skipped β¨
3.4. Receiving the Original Stream
okay so bestie, this is where things get spicy πΆοΈβ¨ sometimes (and the SIP requirements for deaf, hard of hearing, and speech-impaired folks [5] call this out) a user wants to receive BOTH the original stream (like audio) AND the transcoded one (like the speech-to-text output). there are a few ways to make this happen π¦ one option is the SDP group attribute with Flow Identification (FID) semantics [3]. FID lets you ask for one stream to be sent to two different transport addresses at the same time, and it looks like this π
A T B
| | |
|-------(1) INVITE SDP A---->| |
| | |
|<----(2) 200 OK SDP TA+TB---| |
| | |
|----------(3) ACK---------->| |
| | |
|--------------------(4) INVITE SDP TA------------------->|
| | |
|<--------------------(5) 200 OK SDP B--------------------|
| | |
|-------------------------(6) ACK------------------------>|
| | |
|--------(7) INVITE--------->| |
| | |
|<---(8) 200 OK SDP TA+TB --| |
| | |
|--------------------(9) INVITE SDP TA------------------->|
| | |
|<-------------------(10) 200 OK SDP B--------------------|
| | |
|-------------------------(11) ACK----------------------->|
| | |
|------(12) ACK SDP A+B----->| |
| | |
| ************************** | ************************** |
|* MEDIA *|* MEDIA *|
| ************************** | ************************** |
| | |
Figure 3: Caller's invocation of a transcoding service
a=group:FID 1 2
m=audio 20000 RTP/AVP 0
c=IN IP4 A.example.com
a=mid:1
m=audio 30000 RTP/AVP 0
c=IN IP4 T.example.com
a=mid:2
the catch? π most SIP user agents don't support FID at all. and of the tiny handful that DO support FID, only a few can send simultaneous copies of the same media stream at once. plus FID forces both copies to use the SAME codec, which is giving very little flexibility π
so we recommend that T (the transcoder, not a user agent) does the replicating instead π§ T gets the session description below and does speech-to-text and text-to-speech between the first audio stream and the text stream. T also copies the first audio stream into the second audio stream and sends it to A. slay π
m=audio 40000 RTP/AVP 0
c=IN IP4 B.example.com
m=audio 20000 RTP/AVP 0
c=IN IP4 A.example.com
a=recvonly
m=text 20002 RTP/AVP 96
c=IN IP4 A.example.com
a=rtpmap:96 t140/1000
3.5. Transcoding Services in Parallel
okay this one is a whole vibe π transcoding services are sometimes human relays, like a real person doing speech-to-text and text-to-speech for a call. if the SAME person handles both directions (A to B and B to A), they can hear the entire conversation π so for some privacy, two different people get assigned to the job, one for A->B and one for B->A. this setup is also handy for automated services, where one machine turns text into synthetic speech (text-to-speech) and another does voice recognition (speech-to-text) π€π
the scenario has four separate sessions: A-T1, T1-B, B-T2 and T2-A. Figure 4 shows the call flow where A invokes T1 and T2 π¦
note that this example uses unidirectional media streams (sendonly or recvonly) so it's crystal clear which transcoder handles which direction π but nothing stops you from using bidirectional streams here π a human relay could use them to ask for clarifications (like "I did not get that, could you repeat, please?") back to whoever they're getting media from π«Ά
(1) INVITE SDP AT1
m=text 20000 RTP/AVP 96
c=IN IP4 A.example.com
a=rtpmap:96 t140/1000
a=sendonly
m=audio 20000 RTP/AVP 0
c=IN IP4 0.0.0.0
a=recvonly
(2) INVITE SDP AT2
m=text 20002 RTP/AVP 96
c=IN IP4 A.example.com
a=rtpmap:96 t140/1000
a=recvonly
m=audio 20000 RTP/AVP 0
c=IN IP4 0.0.0.0
a=sendonly
(3) 200 OK SDP T1A+T1B
m=text 30000 RTP/AVP 96
c=IN IP4 T1.example.com
a=rtpmap:96 t140/1000
a=recvonly
m=audio 30002 RTP/AVP 0
c=IN IP4 T1.example.com
a=sendonly
(5) 200 OK SDP T2A+T2B
m=text 40000 RTP/AVP 96
c=IN IP4 T2.example.com
a=rtpmap:96 t140/1000
a=sendonly
m=audio 40002 RTP/AVP 0
c=IN IP4 T2.example.com
a=recvonly
(7) INVITE SDP T1B+T2B
m=audio 30002 RTP/AVP 0
c=IN IP4 T1.example.com
a=sendonly
m=audio 40002 RTP/AVP 0
c=IN IP4 T2.example.com
a=recvonly
A T1 T2 B
| | | |
|----(1) INVITE SDP AT1--->| | |
| | | |
|----------------(2) INVITE SDP AT2-------------->| |
| | | |
|<-(3) 200 OK SDP T1A+T1B--| | |
| | | |
|---------(4) ACK--------->| | |
| | | |
|<---------------(5) 200 OK SDP T2A+T2B-----------| |
| | | |
|----------------------(6) ACK------------------->| |
| | | |
|-----------------------(7) INVITE SDP T1B+T2B----------------->|
| | | |
|<----------------------(8) 200 OK SDP BT1+BT2------------------|
| | | |
|------(9) INVITE--------->| | |
| | | |
|-------------------(10) INVITE------------------>| |
| | | |
|<-(11) 200 OK SDP T1A+T1B-| | |
| | | |
|<------------(12) 200 OK SDP T2A+T2B-------------| |
| | | |
|------------------(13) INVITE SDP T1B+T2B--------------------->|
| | | |
|<-----------------(14) 200 OK SDP BT1+BT2----------------------|
| | | |
|--------------------------(15) ACK---------------------------->|
| | | |
|---(16) ACK SDP AT1+BT1-->| | |
| | | |
|------------(17) ACK SDP AT2+BT2---------------->| |
| | | |
| ************************ | ******************************** |
|* MEDIA *|* MEDIA *|
| ************************ | ******************************** |
| | | |
| *********************************************** ***********
|* MEDIA *|* MEDIA *|
| *********************************************** | *********** |
| | | |
Figure 4: Transcoding services in parallel
(8) 200 OK SDP BT1+BT2
m=audio 50000 RTP/AVP 0
c=IN IP4 B.example.com
a=recvonly
m=audio 50002 RTP/AVP 0
c=IN IP4 B.example.com
a=sendonly
(11) 200 OK SDP T1A+T1B
m=text 30000 RTP/AVP 96
c=IN IP4 T1.example.com
a=rtpmap:96 t140/1000
a=recvonly
m=audio 30002 RTP/AVP 0
c=IN IP4 T1.example.com
a=sendonly
(12) 200 OK SDP T2A+T2B
m=text 40000 RTP/AVP 96
c=IN IP4 T2.example.com
a=rtpmap:96 t140/1000
a=sendonly
m=audio 40002 RTP/AVP 0
c=IN IP4 T2.example.com
a=recvonly
since T1 returned the same SDP in (11) as in (3), and T2 returned the same SDP in (12) as in (5), messages (13), (14) and (15) can be skipped π
(16) ACK SDP AT1+BT1
m=text 20000 RTP/AVP 96
c=IN IP4 A.example.com
a=rtpmap:96 t140/1000
a=sendonly
m=audio 50000 RTP/AVP 0
c=IN IP4 B.example.com
a=recvonly
(17) ACK SDP AT2+BT2
m=text 20002 RTP/AVP 96
c=IN IP4 A.example.com
a=rtpmap:96 t140/1000
a=recvonly
m=audio 50002 RTP/AVP 0
c=IN IP4 B.example.com
a=sendonly
at this point FOUR media streams are up and running π
- Text from A to T1.example.com:30000
- Audio from T1 to B.example.com:50000
- Audio from B to T2.example.com:40002
- Text from T2 to A.example.com:20002
heads up: B, the user agent server, needs to support two media streams: sendonly and recvonly π¨ right now some user agents support a single sendrecv media stream but NOT a different media line per direction. implementers are encouraged to build support for this feature π β¨
3.6. Multiple Transcoding Services in Series β¨
okay so bestie, in a distributed setup, a fancy transcoding service (think English text to Spanish speech πͺπΈπ€) is often run by several servers working together π«Ά. One server does English text to Spanish text translation, and then its output gets fed into a server that does text-to-speech. Figure 5 shows how A invokes T1 and T2, and it's giving serious choreography π
A T1 T2 B
| | | |
|----(1) INVITE SDP A-----> | | |
| | | |
|<-(2) 200 OK SDP T1A+T1T2- | | |
| | | |
|----------(3) ACK--------> | | |
| | | |
|-----------(4) INVITE SDP T1T2------------------>| |
| | | |
|<-----------(5) 200 OK SDP T2T1+T2B--------------| |
| | | |
|---------------------(6) ACK-------------------->| |
| | | |
|---------------------------(7) INVITE SDP T2B----------------->|
| | | |
|<--------------------------(8) 200 OK SDP B--------------------|
| | | |
|--------------------------------(9) ACK----------------------->|
| | | |
|---(10) INVITE-----------> | | |
| | | |
|------------------(11) INVITE------------------->| |
| | | |
|<-(12) 200 OK SDP T1A+T1T2-| | |
| | | |
|<-------------(13) 200 OK SDP T2T1+T2B-----------| |
| | | |
|---(14) ACK SDP T1T2+B---> | | |
| | | |
|-----------------------(15) INVITE SDP T2B-------------------->|
| | | |
|<----------------------(16) 200 OK SDP B-----------------------|
| | | |
|----------------(17) ACK SDP T1T2+B------------->| |
| | | |
|----------------------------(18) ACK-------------------------->|
| | | |
| ************************* | ******************* *********** |
|* MEDIA *|* MEDIA *|* MEDIA *|
| ************************* | ******************* | *********** |
| | | |
Figure 5: Transcoding services in serial π
4. Security Considerations ππ
okay the security part is where things get dramatic π RFC 3725 [2] talks about security considerations for using third party call control in SIP. These considerations apply to this document too, because this document explains how to use third party call control to invoke a transcoding service π§
Here's the tea: RFC 3725 says end-to-end media security is built on swapping keying material inside SDP, and it depends on the controller behaving properly π. The controller should not try to disable the security mechanisms offered by the other parties. And because of that, it's trivially possible for the controller to insert itself as an intermediary on the media exchange, if it should so desire π
Now, in this document, the controller is the UA invoking the transcoder, and there's a media session set up with third party call control between the remote UA and the transcoder. So the attack described in RFC 3725 isn't really a threat here, because the controller is the UA that invoked the transcoding service and it already has access to the media by definition π . So it seems unlikely that a UA would try to attack its own session by disabling security between the transcoder and the remote UA π
From the UAs' point of view, the transcoder needs access to the media in order to do its job. So, by definition, the transcoder acts as a man in the middle π΅οΈββοΈ UAs that don't want a particular transcoder to have access to all the media exchanged between them can use a different transcoder for each direction. UAs can also use different transcoders for different media types π
5. 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] 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.
- [3] Camarillo, G., Eriksson, G., Holler, J., and H. Schulzrinne, "Grouping of Media Lines in the Session Description Protocol (SDP)", RFC 3388, December 2002.
6. Informative References π§
- [4] Camarillo, G., "Framework for transcoding with the session initiation protocol", August 2003, Work in Progress.
- [5] Charlton, N., Gasson, M., Gybels, G., Spanner, M., and A. van Wijk, "User Requirements for the Session Initiation Protocol (SIP) in Support of Deaf, Hard of Hearing and Speech-impaired Individuals", RFC 3351, August 2002.
Authors' Addresses π¦
Gonzalo Camarillo
Ericsson
Advanced Signalling Research Lab.
FIN-02420 Jorvas
Finland
EMail: Gonzalo.Camarillo@ericsson.com
Eric Burger
Brooktrout Technology, Inc.
18 Keewaydin Way
Salem, NH 03079
USA
EMail: eburger@brooktrout.com
Henning Schulzrinne
Dept. of Computer Science
Columbia University
1214 Amsterdam Avenue, MC 0401
New York, NY 10027
USA
EMail: schulzrinne@cs.columbia.edu
Arnoud van Wijk
Viataal
Research & Development
Afdeling RDS
Theerestraat 42
5271 GD Sint-Michielsgestel
The Netherlands
EMail: a.vwijk@viataal.nl
Full Copyright Statement Β©οΈ
Copyright (C) The Internet Society (2005).
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 procedures with respect to rights in RFC 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
- ietf: rfc4117 2005-06
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms