RFC 8043
Source-Address-Dependent Routing and Source Address Selection for IPv6 Hosts: Overview of the Problem Space
π RFC 8043: Source-Address-Dependent Routing and Source Address Selection for IPv6 Hosts β¨
Okay bestie, let's get into it π This one's an Informational doc (so it's not a Standards Track spec, just a super useful overview π ) that was submitted independently, which means it's not part of any IETF working group's output. It's from January 2017, and it has two authors: B. Sarikaya from Huawei USA and M. Boucadair from Orange π«Ά. It doesn't obsolete or update any other RFCs, so it's just vibing on its own π¦. The ISSN is 2070-1721 if you ever need to look it up πΈ.
The whole point of this doc is to map out the source-address-dependent routing (SADR) problem space from the host's side π§. It looks at both multihomed hosts and hosts with multiple interfaces, shows a bunch of network setups to explain why source address selection and next-hop resolution matter here π, and lays out a set of scenarios and solutions. It does NOT recommend any particular solution, which is honestly so mature of them π.
Status of This Memo β¨
This document is not an Internet Standards Track specification; it is published for informational purposes π.
This is a contribution to the RFC Series, independently of any other RFC stream. The RFC Editor chose to publish it at their discretion and makes no statement about its value for implementation or deployment. Documents approved for publication by the RFC Editor are not a candidate for any level of Internet Standard; see Section 2 of RFC 7841 π .
Info about the current status, any errata, and how to give feedback is at http://www.rfc-editor.org/info/rfc8043 π₯.
Copyright Notice β¨
Copyright (c) 2017 IETF Trust and the persons identified as the document authors. All rights reserved π.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication. Please read these carefully, since they spell out your rights and restrictions with respect to this document πΈ.
1. Introduction π¦
1.1. Overall Context π
Okay so BCP 38 recommends ingress traffic filtering to stop Denial-of-Service (DoS) attacks π‘οΈ. That means datagrams with source addresses that don't match the network the host is attached to get thrown out [RFC2827]. The tricky part is that it's hard to keep packets from getting dropped by ingress filtering, especially in multihomed networks π. In those, the host gets more than one prefix from the networks it's connected to, so it can end up with more than one source address π. BCP 84 then built on BCP 38 and introduced recommendations for the routing system in multihomed networks [RFC3704] π«Ά.
Routing recommendations like the ones in BCP 84 basically always involve source address checks, and that leads to source-address-dependent-routing (SADR) π . SADR can get messy, especially when a host on a multihomed network is talking to another host on another multihomed network π. In that case, the communication can break in both directions if Network Providers apply ingress filtering and the datagrams carry the wrong source addresses. (See [INGRESS_FIL] if you want the deep dive π.)
Hosts with simultaneously active interfaces get multiple prefixes and end up with multiple source addresses π§. Their datagrams are likely to get filtered because of ingress filtering policies π. The source address selection algorithm has to be careful to avoid ingress filtering on the next-hop router [RFC6724] β¨.
There are a lot of use cases for source/destination routing, and you can find them in [SD_RTG] π. They all point to the same thing: the multihomed host or Customer Premises Equipment (CPE) router needs the correct source prefixes/addresses configured so it can forward packets upstream properly. That way, an upstream Network Provider's ingress filtering doesn't drop them π.
Basically, in multihomed networks there's a need to enforce source-address-based routing when some providers do ingress filtering π. This means routers have to look at the source addresses as well as the destination addresses when figuring out a packet's next hop π₯.
1.2. Scope πΈ
Based on the use cases in [SD_RTG], routers may be told which source addresses to use for forwarding through extensions to routing protocols like IS-IS [ISO.10589.1992] [SD_RTG_ISIS] and OSPF [RFC5340] [SD_RTG_OSPF] π§.
In this document, we describe the scenarios for source-address-dependent routing from the host's perspective. There are two flavors π:
- A host may have a single interface with multiple addresses (from different prefixes or /64s). Each prefix is delegated from a different exit router, and this is called "multihomed with multi-prefix" (MHMP) π. Here, the host does the source address selection, and an upstream router enforces the source-dependent routing π¦.
- A host may have multiple interfaces connected at the same time, with each interface connected to a different exit router. This is called "multi-prefix multiple interface" (MPMI) β¨. In this case, the host is required to support both source address selection and source-dependent routing, so an upstream router doesn't have to rewrite the IPv6 prefix π₯.
Several limitations come up in multihoming setups based on NAT and IPv6-to-IPv6 Network Prefix Translation (NPTv6) [RFC6296]. See, for example, [RFC4116] π. NPTv6 is out of scope for this doc, so we're not covering it here π .
This document was first written to inform the community about the SADR problem space π. It was later updated to record the different sets of alternate solutions for that problem space π«Ά. The 6man WG consensus is documented in [RFC8028] π.
2. Source-Address-Dependent Routing (SADR) Scenarios π¦
This section walks through a set of scenarios to illustrate the SADR problem π. They're listed in order of increasing complexity, so it builds up nicely π.
2.1. Multi-Prefix Multihoming β¨
Figure 1 shows a multi-prefix multihoming use case πΈ. "rtr" is a CPE router connected to two Network Providers, and each one advertises its own prefixes π§. In this setup, the host might have a single interface, but it still gets multiple prefixes from the upstream Network Providers π. If providers apply ingress filtering, external traffic from the host should follow source-address-dependent routing or it gets dropped π.
In this scenario, the host doesn't need to do source-dependent routing π«Ά. It only needs to do source address selection π .
+------+ |
| | | (Network)
| | |=====|(Provider 1)|=====
| | +------+ |
| | | | |
| |=====| rtr |=====|
| host | | | |
| | +------+ |
| | |
| | | (Network)
| | |=====|(Provider 2)|=====
| | |
+------+ |
Figure 1: Multihomed Host with Multiple CPE Routers
2.2. Multi-Prefix Multi-Interface
okay so this one is the multi-prefix multi-interface scenario π "rtr1" and "rtr2" are CPE routers, and there are exit routers in both "network 1" and "network 2" πΈ if the packets from the host talking to a remote destination get routed to the wrong exit router, i.e., they carry the wrong source address, they get dropped because of ingress filtering π the host MUST perform both source address selection and source-dependent routing so the right next hop gets picked while taking the source address into account π«Ά that way we avoid complications when sending packets and don't have to rewrite the source IPv6 prefix β¨
+------+ +------+ ___________
| | | | / \
| |-----| rtr1 |=====/ network \
| | | | \ 1 /
| | +------+ \___________/
| |
| host |
| |
| | +------+ ___________
| | | | / \
| |=====| rtr2 |=====/ network \
| | | | \ 2 /
+------+ +------+ \___________/
Figure 2: Multiple Interfaced Host with Two CPE Routers
there's a variant of Figure 2 that people call a corporate VPN π₯ basically a secure tunnel from the host to a router attached to a corporate network π¦ here "rtr2" gives access straight to the corporate network, and the link from the host to "rtr2" is a secure tunnel (like an IPsec tunnel) π so the interface is a virtual interface with its own IP address/prefix assigned by the corporate network π
+------+ +------+ ___________
| |-----| rtr1 | / \
| ==========\\ |=====/ network \
| |-----| || | \ 1 /
| | +--||--+ \___________/
| | ||
| host | ||
| | ||
| | +--||--+ ___________
| | | | / corporate \
| | | rtr2 |=====/ network \
| | | | \ 2 /
+------+ +------+ \___________/
Figure 3: VPN Case
there are at least two sub-cases π§
a. dedicated forwarding entries get created in the host so only traffic aimed at the corporate network goes to "rtr2", and everything else goes to "rtr1" π
b. all traffic goes to "rtr2" and then gets routed to the Internet if needed π this doesn't need host routes, but it causes unnecessary traffic and latency because of the path stretch via "rtr2" π©
2.3. Home Network (Homenet)
in the homenet scenario from Figure 4 π (a simple home network), there's a host connected to a local network that's served by two CPEs, connected to Providers 1 and 2 π each network delegates a different prefix, and each router gives the host a different prefix too π the problem here is that every provider uses ingress filtering π this scenario can be seen as a variation of the one in Section 2.2 π
+------+
| | +------+
| | | | (Network)
| |==+==| rtr1 |====|(Provider 1)|=====
| | | | |
| | | +------+
| host | |
| | |
| | | +------+
| | | | | (Network)
| | +==| rtr2 |====|(Provider 2)|=====
| | | |
+------+ +------+
Figure 4: Simple Home Network with Two CPE Routers
the host has to pick a source address from the prefixes of Providers 1 or 2 when it talks to other hosts in Provider 1 or 2 β¨ the next issue is picking the correct next-hop router, "rtr1" or "rtr2", that can reach the correct provider (Network Provider 1 or 2) π
2.4. Service-Specific Egress Routing
this one's a variation of the Section 2.1 scenario, called specialized egress routing π¦ upstream networks offer different services with specific requirements, like Voice over IP (VoIP) or IPTV π hosts using these services need to use the service's source and destination addresses π«Ά no other service will accept that source address, so those packets get dropped [SD_RTG] π
both source address selection and source-dependent routing are REQUIRED to be performed by the host π
___________ +------+
/ \ +------+ | |
/ network \ | | | |
\ 1 /--| rtr1 |----| |
\___________/ | | | | +------+ ___________
+------+ | host | | | / \
| |=====| rtr3 |=====/ network \
___________ | | | | \ 3 /
/ \ +------+ | | +------+ \___________/
/ network \ | | | |
\ 2 /--| rtr2 |----| |
\___________/ | | | |
+------+ | |
+------+
Figure 5: Multi-Interfaced Host with Three CPE Routers
the scenario in Figure 5 is a variation of the multi-prefix multi-interface scenario (Section 2.2) πΈ "rtr1", "rtr2", and "rtr3" are CPE routers π the networks apply ingress routing π€ source-address-dependent routing SHOULD be used to avoid dropping any external communications π
3. Analysis of Source-Address-Dependent Routing β¨
okay this is where it gets juicy π SADR can be facilitated at the host with proper source address and next-hop selection π¦ for this, each router connected to a different interface of the host uses Router Advertisements (RAs) [RFC4861] to distribute a default route, the next hop, and the source address/prefix information to the host π as a reminder, the Prefix Information Option (PIO) is defined in [RFC4861], while the Route Information Option (RIO) is defined in [RFC4191] π§
Section 3.1 analyzes the scenarios from Section 2, and Section 3.2 talks about how relevant SADR is to provisioning domains π
3.1. Scenarios Analysis
as in [RFC7157], we assume the routers in Section 2 use RAs to distribute the default route and the source address prefixes supported at each next hop to the hosts, or that the gateway/CPE router relays this info to the hosts π
referring to Section 2.1, source address selection is handled by the host while source-dependent routing MUST be followed by "rtr" so packets don't get dropped π no particular modification is REQUIRED for next-hop selection at the host π
referring to the scenario in Figure 2, source-address-dependent routing can solve the problem of when the host wants to reach a destination in network 2 and the host picks "rtr1" as the default router π«Ά the solution assumes the host is correctly configured π the host SHOULD be configured with the prefixes supported at these next hops π that way the host, having received many prefixes, will have the correct info for selecting the right source address and next hop when sending packets to remote destinations π
note that similar considerations apply to the scenario in Figure 5 πΈ
in the configuration of the scenario (Figure 1), it's also useful to configure the host with the prefixes and source address prefixes it supports β¨ this lets the host select the right prefix when sending packets to the right next hop and avoids any issues with ingress filtering π
let's analyze the scenario in Section 2.3 π if a source-address-dependent routing protocol is used, the two routers ("rtr1" and "rtr2") can both route traffic correctly, no matter which next-hop router and source address the host picks π¦ if the host picks the wrong next-hop router, e.g., "rtr1" is selected for Provider 2, "rtr1" will forward the traffic to "rtr2" to be sent to Network Provider 2 and no ingress filtering will happen π
note that home networks are expected to comply with requirements for source-address-dependent routing, and the routers will be configured accordingly no matter which routing protocol is used [RFC7788] π
this would work, but with some issues π¬ host traffic to Provider 2 has to go over two links instead of one, so the link bandwidth gets halved π another possibility is that "rtr1" can send an ICMPv6 Redirect message to the host to direct the traffic to "rtr2" π§ the host would then redirect Provider 2 traffic to "rtr2" π
the problem with redirects is that the ICMPv6 Redirect message can only convey two addresses π in this case that's either the router address (or the "rtr2" address) and the destination address (or the destination host in Provider 2) π that means the source address won't be communicated π as a result, the host would send packets to the same destination using both source addresses, which causes "rtr2" to send a redirect message to "rtr1", resulting in ping-pong redirects sent by "rtr1" and "rtr2" π
a solution to these issues is to configure the host with the source address prefixes that the next hop supports π in a homenet context, each interface of the host can be configured by its next-hop router, so all that's needed is adding the info about source address prefixes β¨ this results in the hosts selecting the right router, no matter what π
source-address-dependent routing in the use case of specialized egress routing (Section 2.4) may work as follows π¦ the specialized service router advertises one or more specific prefixes with appropriate source prefixes, e.g., to the CPE router, "rtr" in Figure 1 π the CPE router then advertises the specific service's prefixes and source prefixes to the host π«Ά this lets the host get properly configured so it can use the service by sending packets with the correct source and destination addresses π₯
3.2. Provisioning Domains and SADR πΈ
okay so bestie, a provisioning domain (PvD) is basically just a neat bundle of network configuration info that goes together π. when you're in the multi-prefix multihoming (MHMP) situation, there's more than one PvD sitting on a single link π. and in multi-prefix multiple interface (MPMI) environments, bits of the same domain can be spread across multiple links π¦. PvD-aware nodes group the config info into PvDs and then use those PvDs to handle connection requests, like picking the right source address for your packets β¨. PvDs can be built from one or more DHCP or Router Advertisement (RA) options that carry stuff like the PvD identity and PvD container [MPvD_NDP] [MPvD_DHCP] π . PvDs made from that kind of info are called explicit PvDs [RFC7556] π.
apart from the PvD identity, the rest of the PvD content can get wrapped up in separate RA or DHCP options called the PvD Container Option π. those options live in the container options of an explicit PvD π.
explicit PvDs can come in from different interfaces π§. one PvD might be reachable over one interface, or over multiple interfaces at the same time π. explicit PvDs may be scoped to config tied to one particular interface, but honestly, in general, that doesn't apply π. the real main character moment is this: the node has to authenticate the PvD identity even when it only has one connected interface π₯. how strong that authentication needs to be is up to the node policy π . and a single PvD's info can show up over multiple interfaces, as long as the PvD ID is the same β¨.
this part is about RAs specifically π. a multihomed host (that's a host with multiple interfaces) should trust a message from a router on one interface so it can install a route to a different router on another interface π«Ά. the SHOULD there is doing a lot of work, bestie π.
4. Discussion of Alternate Solutions π¦
okay so this section is where we look at the other ways to fix the problem. we've got a bunch of topologies where a host with multiple interfaces (or a multihomed host) is hooked up to different networks or Network Providers, and those can apply ingress routing π. the scenario analysis in Section 3.1 shows that to stop packets getting dropped because of ingress routing, you NEED source-address-dependent routing π. and source-address-dependent routing should also be supported by routers all over a site that has multiple egress points π .
in this section we check out some alternate solutions for the scenarios from Section 2 π. we start with Rule 5.5 in [RFC6724] for source address selection and the scenarios it handles πΈ, then we move on to solutions that spell out exactly what info hosts need from new Router Advertisement options so they can pick the correct source address π§. no recommendation is made in this section, just so you know π«Ά.
4.1. Router Advertisement Option π
hosts need to be configured not just with prefixes, but also with the source prefixes that the next-hop routers support π . doing this can stop the host from getting ingress/egress policy error messages, like ICMP source address failure messages π.
if host configuration is done using Router Advertisement messages, then we need to define new Router Advertisement options for source-address-dependent routing β¨. these include the Route Prefix with Source Address/Prefix Option π. other options, like the Next-Hop Address with the Route Prefix Option and the Next-Hop Address with the Source Address and Route Prefix Option, get covered in Section 4.2 π¦.
as discussed in Section 3.1, the scenario in Figure 4 can be solved by defining a new Router Advertisement option π.
if host configuration is done using DHCP, then we need to define new DHCP options for Route Prefix with Source Address/Prefix π. as mentioned above, DHCP server configuration is interface specific π₯, so new DHCP options for source-address-dependent routing (route prefix and source prefix) need to be configured separately for each interface π .
the scenario in Figure 4 can be solved by defining a new DHCP option π.
4.2. Router Advertisement Option Set πΈ
Rule 5.5 for source address selection may be a solution for picking the right source addresses for each next hop π§. but there are cases where the host doesn't know the next-hop routers on each of its interfaces at the start π. those use cases are out of scope π. guidelines for use cases that need the Router Advertisement option set with third-party next-hop addresses are also out of scope π«Ά.
4.3. Rule 5.5 for Source Address Selection π
one possible solution is Rule 5.5 in [RFC6724], the default rule for source address selection, which recommends selecting the source addresses advertised by the next hop π . looking at the scenarios above, this rule can solve the problem in Figures 1, 2, and 5 β¨.
source address selection rules can be distributed by the DHCP server using the DHCP option OPTION_ADDRSEL_TABLE defined in [RFC7078] π.
with DHCP-based host configuration, the DHCP server can only configure the interface of the host that it's directly connected to π¦. for Rule 5.5 to apply on other interfaces, the option has to be sent on those interfaces too, using the DHCPv6 address selection policy option defined in [RFC7078] π.
Rule 5.5, the default rule for source address selection, solves that problem when an application sends a packet with an unspecified source address π. when there are two default routes, one route gets chosen, and Rule 5.5 makes sure the right source address gets used π.
now here's where it gets messy π. when the application selects a source address (so the source address is picked before next-hop selection), that source address is supposed to be how the application picks the exit point πͺ. in this case, that purpose doesn't get served π. with multiple default routes, one gets picked and the source address the application chose is ignored, because IPv6 implementations are not required to remember which next hops advertised which prefixes π. so the next-hop router might not be the correct one, and the packets may get filtered π₯.
this means hosts SHOULD register which next-hop router announced each prefix π. it is required that RAs be sent by the routers and that they contain PIO on all links π. it is also required that hosts remember the source addresses of the routers that sent PIOs, along with the prefixes they advertised π«Ά. this can be achieved by updating the redirect rules specified in [RFC4861] πΈ. [RFC8028] goes further and specifies which router a host should send its transmission to π§.
the source-address-dependent routing solution isn't complete without support from the edge routers π . all routers in edge networks need to be required to support routing based on the source address as well as the destination address π . all edge routers need to be required to satisfy the filters defined in BCP 38 π.
5. Security Considerations π₯
okay bestie, this document only describes some use cases, so it doesn't add any new security risks on its own π. but solution documents should go deeper into specific security considerations, so keep an eye out for those ππ.
6. References π
6.1. Normative References π
[RFC2827] Ferguson, P. and D. Senie, "Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing", BCP 38, RFC 2827, DOI 10.17487/RFC2827, May 2000, <http://www.rfc-editor.org/info/rfc2827>.
[RFC3704] Baker, F. and P. Savola, "Ingress Filtering for Multihomed Networks", BCP 84, RFC 3704, DOI 10.17487/RFC3704, March 2004, <http://www.rfc-editor.org/info/rfc3704>.
[RFC4861] Narten, T., Nordmark, E., Simpson, W., and H. Soliman, "Neighbor Discovery for IP version 6 (IPv6)", RFC 4861, DOI 10.17487/RFC4861, September 2007, <http://www.rfc-editor.org/info/rfc4861>.
[RFC5340] Coltun, R., Ferguson, D., Moy, J., and A. Lindem, "OSPF for IPv6", RFC 5340, DOI 10.17487/RFC5340, July 2008, <http://www.rfc-editor.org/info/rfc5340>.
[RFC6296] Wasserman, M. and F. Baker, "IPv6-to-IPv6 Network Prefix Translation", RFC 6296, DOI 10.17487/RFC6296, June 2011, <http://www.rfc-editor.org/info/rfc6296>.
[RFC6724] Thaler, D., Ed., Draves, R., Matsumoto, A., and T. Chown, "Default Address Selection for Internet Protocol Version 6 (IPv6)", RFC 6724, DOI 10.17487/RFC6724, September 2012, <http://www.rfc-editor.org/info/rfc6724>.
[RFC7078] Matsumoto, A., Fujisaki, T., and T. Chown, "Distributing Address Selection Policy Using DHCPv6", RFC 7078, DOI 10.17487/RFC7078, January 2014, <http://www.rfc-editor.org/info/rfc7078>.
[RFC8028] Baker, F. and B. Carpenter, "First-Hop Router Selection by Hosts in a Multi-Prefix Network", RFC 8028, DOI 10.17487/RFC8028, November 2016, <http://www.rfc-editor.org/info/rfc8028>.
6.2. Informative References β¨
okay bestie, these are the background reads π the spec points to but doesn't need you to follow to implement it. They're the receipts π§Ύ
[INGRESS_FIL]: Huitema, C., Draves, R., and M. Bagnulo, "Ingress filtering compatibility for IPv6 multihomed sites", Work in Progress, draft-huitema-multi6-ingress-filtering-00, October 2004.[ISO.10589.1992]: International Organization for Standardization, "Intermediate system to intermediate system intra-domain-routing routine information exchange protocol for use in conjunction with the protocol for providing the connectionless-mode Network Service (ISO 8473), ISO Standard 10589", ISO ISO.10589.1992, 1992. ποΈ[MPvD_DHCP]: Krishnan, S., Korhonen, J., and S. Bhandari, "Support for multiple provisioning domains in DHCPv6", Work in Progress, draft-ietf-mif-mpvd-dhcp-support-02, October 2015. π»[MPvD_NDP]: Korhonen, J., Krishnan, S., and S. Gundavelli, "Support for multiple provisioning domains in IPv6 Neighbor Discovery Protocol", Work in Progress, draft-ietf-mif-mpvd-ndp-support-03, February 2016. π»[RFC4116]: Abley, J., Lindqvist, K., Davies, E., Black, B., and V. Gill, "IPv4 Multihoming Practices and Limitations", RFC 4116, DOI 10.17487/RFC4116, July 2005,<http://www.rfc-editor.org/info/rfc4116>. πΈ[RFC4191]: Draves, R. and D. Thaler, "Default Router Preferences and More-Specific Routes", RFC 4191, DOI 10.17487/RFC4191, November 2005,<http://www.rfc-editor.org/info/rfc4191>. π¦[RFC7157]: Troan, O., Ed., Miles, D., Matsushima, S., Okimoto, T., and D. Wing, "IPv6 Multihoming without Network Address Translation", RFC 7157, DOI 10.17487/RFC7157, March 2014,<http://www.rfc-editor.org/info/rfc7157>. π§[RFC7556]: Anipko, D., Ed., "Multiple Provisioning Domain Architecture", RFC 7556, DOI 10.17487/RFC7556, June 2015,<http://www.rfc-editor.org/info/rfc7556>. π[RFC7788]: Stenberg, M., Barth, S., and P. Pfister, "Home Networking Control Protocol", RFC 7788, DOI 10.17487/RFC7788, April 2016,<http://www.rfc-editor.org/info/rfc7788>. π[SD_RTG]: Baker, F., Xu, M., Yang, S., and J. Wu, "Requirements and Use Cases for Source/Destination Routing", Work in Progress, draft-baker-rtgwg-src-dst-routing-use-cases-02, April 2016. π₯[SD_RTG_ISIS]: Baker, F. and D. Lamparter, "IPv6 Source/Destination Routing using IS-IS", Work in Progress, draft-baker-ipv6-isis-dst-src-routing-06, October 2016. π[SD_RTG_OSPF]: Baker, F., "IPv6 Source/Destination Routing using OSPFv3", Work in Progress, draft-baker-ipv6-ospf-dst-src-routing-03, August 2013. π
Acknowledgements π«Ά
bestie, shoutout to everyone who helped make this happen π In writing this document, we were inspired by the ideas shared on the electronic mail discussion list of the 6man Working Group, from Brian Carpenter, Ole Troan, Pierre Pfister, Alex Petrescu, Ray Hunter, Lorenzo Colitti, and others. π
Pierre Pfister came up with the scenario in Figure 4, plus some of the text for Rule 5.5. π
The text on corporate VPN in Section 2 came from Brian Carpenter. β¨
Authors' Addresses π
Here's where you can find the authors π§
Behcet Sarikaya
Huawei USA
5340 Legacy Dr. Building 175
Plano, TX 75024
United States of America
Email: sarikaya@ieee.org
Mohamed Boucadair
Orange
Rennes 35000
France
Email: mohamed.boucadair@orange.com
π¦ where this page comes from
- ietf: rfc8043 2017-01
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms