| rfc9170.original | rfc9170.txt | |||
|---|---|---|---|---|
| Network Working Group M. Thomson | Internet Architecture Board (IAB) M. Thomson | |||
| Internet-Draft Mozilla | Request for Comments: 9170 | |||
| Intended status: Informational T. Pauly | Category: Informational T. Pauly | |||
| Expires: 16 April 2022 Apple | ISSN: 2070-1721 December 2021 | |||
| 13 October 2021 | ||||
| Long-term Viability of Protocol Extension Mechanisms | Long-Term Viability of Protocol Extension Mechanisms | |||
| draft-iab-use-it-or-lose-it-04 | ||||
| Abstract | Abstract | |||
| The ability to change protocols depends on exercising the extension | The ability to change protocols depends on exercising the extension | |||
| and version negotiation mechanisms that support change. This | and version-negotiation mechanisms that support change. This | |||
| document explores how regular use of new protocol features can ensure | document explores how regular use of new protocol features can ensure | |||
| that it remains possible to deploy changes to a protocol. Examples | that it remains possible to deploy changes to a protocol. Examples | |||
| are given where lack of use caused changes to be more difficult or | are given where lack of use caused changes to be more difficult or | |||
| costly. | costly. | |||
| Discussion Venues | ||||
| This note is to be removed before publishing as an RFC. | ||||
| Discussion of this document takes place on the EDM Program mailing | ||||
| list (edm@iab.org), which is archived at | ||||
| https://mailarchive.ietf.org/arch/browse/edm/. | ||||
| Source for this draft and an issue tracker can be found at | ||||
| https://github.com/intarchboard/use-it-or-lose-it. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This document is not an Internet Standards Track specification; it is | |||
| provisions of BCP 78 and BCP 79. | published for informational purposes. | |||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Architecture Board (IAB) | |||
| and may be updated, replaced, or obsoleted by other documents at any | and represents information that the IAB has deemed valuable to | |||
| time. It is inappropriate to use Internet-Drafts as reference | provide for permanent record. It represents the consensus of the | |||
| material or to cite them other than as "work in progress." | Internet Architecture Board (IAB). Documents approved for | |||
| publication by the IAB are not candidates for any level of Internet | ||||
| Standard; see Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on 16 April 2022. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9170. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
| license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
| extracted from this document must include Simplified BSD License text | to this document. | |||
| as described in Section 4.e of the Trust Legal Provisions and are | ||||
| provided without warranty as described in the Simplified BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
| 2. Imperfect Implementations Limit Protocol Evolution . . . . . 3 | 2. Imperfect Implementations Limit Protocol Evolution | |||
| 2.1. Good Protocol Design is Not Itself Sufficient . . . . . . 4 | 2.1. Good Protocol Design Is Not Itself Sufficient | |||
| 2.2. Disuse Can Hide Problems . . . . . . . . . . . . . . . . 5 | 2.2. Disuse Can Hide Problems | |||
| 2.3. Multi-Party Interactions and Middleboxes . . . . . . . . 5 | 2.3. Multi-party Interactions and Middleboxes | |||
| 3. Active Use . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 3. Active Use | |||
| 3.1. Dependency is Better . . . . . . . . . . . . . . . . . . 7 | 3.1. Dependency Is Better | |||
| 3.2. Version Negotiation . . . . . . . . . . . . . . . . . . . 7 | 3.2. Version Negotiation | |||
| 3.3. Falsifying Active Use . . . . . . . . . . . . . . . . . . 8 | 3.3. Falsifying Active Use | |||
| 3.4. Examples of Active Use . . . . . . . . . . . . . . . . . 9 | 3.4. Examples of Active Use | |||
| 3.5. Restoring Active Use . . . . . . . . . . . . . . . . . . 10 | 3.5. Restoring Active Use | |||
| 4. Complementary Techniques . . . . . . . . . . . . . . . . . . 10 | 4. Complementary Techniques | |||
| 4.1. Fewer Extension Points . . . . . . . . . . . . . . . . . 10 | 4.1. Fewer Extension Points | |||
| 4.2. Invariants . . . . . . . . . . . . . . . . . . . . . . . 11 | 4.2. Invariants | |||
| 4.3. Limiting Participation . . . . . . . . . . . . . . . . . 11 | 4.3. Limiting Participation | |||
| 4.4. Effective Feedback . . . . . . . . . . . . . . . . . . . 12 | 4.4. Effective Feedback | |||
| 5. Security Considerations . . . . . . . . . . . . . . . . . . . 12 | 5. Security Considerations | |||
| 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 13 | 6. IANA Considerations | |||
| 7. Informative References . . . . . . . . . . . . . . . . . . . 13 | 7. Informative References | |||
| Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 17 | Appendix A. Examples | |||
| A.1. DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 | A.1. DNS | |||
| A.2. HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . 18 | A.2. HTTP | |||
| A.3. IP . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 | A.3. IP | |||
| A.4. SNMP . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | A.4. SNMP | |||
| A.5. TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | A.5. TCP | |||
| A.6. TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | A.6. TLS | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 20 | IAB Members at the Time of Approval | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 20 | Acknowledgments | |||
| Authors' Addresses | ||||
| 1. Introduction | 1. Introduction | |||
| A successful protocol [SUCCESS] needs to change in ways that allow it | A successful protocol [SUCCESS] needs to change in ways that allow it | |||
| to continue to fulfill the changing needs of its users. New use | to continue to fulfill the changing needs of its users. New use | |||
| cases, conditions and constraints on the deployment of a protocol can | cases, conditions, and constraints on the deployment of a protocol | |||
| render a protocol that does not change obsolete. | can render a protocol that does not change obsolete. | |||
| Usage patterns and requirements for a protocol shift over time. In | Usage patterns and requirements for a protocol shift over time. In | |||
| response, implementations might adjust usage patterns within the | response, implementations might adjust usage patterns within the | |||
| constraints of the protocol, the protocol could be extended, or a | constraints of the protocol, the protocol could be extended, or a | |||
| replacement protocol might be developed. Experience with Internet- | replacement protocol might be developed. Experience with Internet- | |||
| scale protocol deployment shows that each option comes with different | scale protocol deployment shows that each option comes with different | |||
| costs. [TRANSITIONS] examines the problem of protocol evolution more | costs. [TRANSITIONS] examines the problem of protocol evolution more | |||
| broadly. | broadly. | |||
| An extension point is a mechanism that allows a protocol to be | An extension point is a mechanism that allows a protocol to be | |||
| changed or enhanced. This document examines the specific conditions | changed or enhanced. This document examines the specific conditions | |||
| that determine whether protocol maintainers have the ability to | that determine whether protocol maintainers have the ability to | |||
| design and deploy new or modified protocols via their specified | design and deploy new or modified protocols via their specified | |||
| extension points. Section 2 highlights some historical examples of | extension points. Section 2 highlights some historical examples of | |||
| difficulties in transitions to new protocol features. Section 3 | difficulties in transitions to new protocol features. Section 3 | |||
| argues that ossified protocols are more difficult to update and | argues that ossified protocols are more difficult to update and | |||
| describes how successful protocols make frequent use of new | describes how successful protocols make frequent use of new | |||
| extensions and code-points. Section 4 outlines several additional | extensions and code points. Section 4 outlines several additional | |||
| strategies that might aid in ensuring that protocol changes remain | strategies that might aid in ensuring that protocol changes remain | |||
| possible over time. | possible over time. | |||
| The experience that informs this document is predominantly at | The experience that informs this document is predominantly at | |||
| "higher" layers of the network stack, in protocols with limited | "higher" layers of the network stack, in protocols with limited | |||
| numbers of participants. Though similar issues are present in many | numbers of participants. Though similar issues are present in many | |||
| protocols that operate at scale, the tradeoffs involved with applying | protocols that operate at scale, the trade-offs involved with | |||
| some of the suggested techniques can be more complex when there are | applying some of the suggested techniques can be more complex when | |||
| many participants, such as at the network layer or in routing | there are many participants, such as at the network layer or in | |||
| systems. | routing systems. | |||
| 2. Imperfect Implementations Limit Protocol Evolution | 2. Imperfect Implementations Limit Protocol Evolution | |||
| It can be extremely difficult to deploy a change to a protocol if | It can be extremely difficult to deploy a change to a protocol if | |||
| implementations with which the new deployment needs to interoperate | implementations with which the new deployment needs to interoperate | |||
| do not operate predictably. Variation in how new codepoints or | do not operate predictably. Variation in how new code points or | |||
| extensions are handled can be the result of bugs in implementation or | extensions are handled can be the result of bugs in implementation or | |||
| specifications. Unpredictability can manifest as abrupt termination | specifications. Unpredictability can manifest as errors, crashes, | |||
| of sessions, errors, crashes, or disappearances of endpoints and | timeouts, abrupt termination of sessions, or disappearances of | |||
| timeouts. | endpoints. | |||
| The risk of interoperability problems can in turn make it infeasible | The risk of interoperability problems can in turn make it infeasible | |||
| to deploy certain protocol changes. If deploying a new codepoint or | to deploy certain protocol changes. If deploying a new code point or | |||
| extension makes an implementation less reliable than others, even if | extension makes an implementation less reliable than others, even if | |||
| only in rare cases, it is far less likely that implementations will | only in rare cases, it is far less likely that implementations will | |||
| adopt the change. | adopt the change. | |||
| Deploying a change to a protocol could require implementations to fix | Deploying a change to a protocol could require implementations to fix | |||
| a substantial proportion of the bugs that the change exposes. This | a substantial proportion of the bugs that the change exposes. This | |||
| can involve a difficult process that includes identifying the cause | can involve a difficult process that includes identifying the cause | |||
| of these errors, finding the responsible implementation(s), | of these errors, finding the responsible implementation(s), | |||
| coordinating a bug fix and release plan, contacting users and/or the | coordinating a bug fix and release plan, contacting users and/or the | |||
| operator of affected services, and waiting for the fix to be | operator of affected services, and waiting for the fix to be | |||
| skipping to change at page 4, line 37 ¶ | skipping to change at line 155 ¶ | |||
| deliberately blocked. Some deployments or implementations apply | deliberately blocked. Some deployments or implementations apply | |||
| policies that explicitly prohibit the use of unknown capabilities. | policies that explicitly prohibit the use of unknown capabilities. | |||
| This is especially true of functions that seek to make security | This is especially true of functions that seek to make security | |||
| guarantees, like firewalls. | guarantees, like firewalls. | |||
| The set of interoperable features in a protocol is often the subset | The set of interoperable features in a protocol is often the subset | |||
| of its features that have some value to those implementing and | of its features that have some value to those implementing and | |||
| deploying the protocol. It is not always the case that future | deploying the protocol. It is not always the case that future | |||
| extensibility is in that set. | extensibility is in that set. | |||
| 2.1. Good Protocol Design is Not Itself Sufficient | 2.1. Good Protocol Design Is Not Itself Sufficient | |||
| It is often argued that the careful design of a protocol extension | It is often argued that the careful design of a protocol extension | |||
| point or version negotiation capability is critical to the freedom | point or version-negotiation capability is critical to the freedom | |||
| that it ultimately offers. | that it ultimately offers. | |||
| RFC 6709 [EXTENSIBILITY] contains a great deal of well-considered | RFC 6709 [EXTENSIBILITY] contains a great deal of well-considered | |||
| advice on designing for extension. It includes the following advice: | advice on designing for extensions. It includes the following | |||
| advice: | ||||
| This means that, to be useful, a protocol version-negotiation | | This means that, to be useful, a protocol version-negotiation | |||
| mechanism should be simple enough that it can reasonably be | | mechanism should be simple enough that it can reasonably be | |||
| assumed that all the implementers of the first protocol version at | | assumed that all the implementers of the first protocol version at | |||
| least managed to implement the version-negotiation mechanism | | least managed to implement the version-negotiation mechanism | |||
| correctly. | | correctly. | |||
| There are a number of protocols for which this has proven to be | There are a number of protocols for which this has proven to be | |||
| insufficient in practice. These protocols have imperfect | insufficient in practice. These protocols have imperfect | |||
| implementations of these mechanisms. Mechanisms that aren't used are | implementations of these mechanisms. Mechanisms that aren't used are | |||
| the ones that fail most often. The same paragraph from RFC 6709 | the ones that fail most often. The same paragraph from RFC 6709 | |||
| acknowledges the existence of this problem, but does not offer any | acknowledges the existence of this problem but does not offer any | |||
| remedy: | remedy: | |||
| The nature of protocol version-negotiation mechanisms is that, by | | The nature of protocol version-negotiation mechanisms is that, by | |||
| definition, they don't get widespread real-world testing until | | definition, they don't get widespread real-world testing until | |||
| _after_ the base protocol has been deployed for a while, and its | | *after* the base protocol has been deployed for a while, and its | |||
| deficiencies have become evident. | | deficiencies have become evident. | |||
| Indeed, basic interoperability is considered critical early in the | Indeed, basic interoperability is considered critical early in the | |||
| deployment of a protocol. A desire to deploy can result in early | deployment of a protocol. A desire to deploy can result in early | |||
| focus on a reduced feature set, which could result in deferring | focus on a reduced feature set, which could result in deferring | |||
| implementation of version negotiation and extension mechanisms. This | implementation of version-negotiation and extension mechanisms. This | |||
| leads to these mechanisms being particularly affected by this | leads to these mechanisms being particularly affected by this | |||
| problem. | problem. | |||
| 2.2. Disuse Can Hide Problems | 2.2. Disuse Can Hide Problems | |||
| There are many examples of extension points in protocols that have | There are many examples of extension points in protocols that have | |||
| been either completely unused, or their use was so infrequent that | been either completely unused or their use was so infrequent that | |||
| they could no longer be relied upon to function correctly. | they could no longer be relied upon to function correctly. | |||
| Appendix A includes examples of disuse in a number of widely deployed | Appendix A includes examples of disuse in a number of widely deployed | |||
| Internet protocols. | Internet protocols. | |||
| Even where extension points have multiple valid values, if the set of | Even where extension points have multiple valid values, if the set of | |||
| permitted values does not change over time, there is still a risk | permitted values does not change over time, there is still a risk | |||
| that new values are not tolerated by existing implementations. If | that new values are not tolerated by existing implementations. If | |||
| the set of values for a particular field or the order in which these | the set of values for a particular field of a protocol or the order | |||
| values appear of a protocol remains fixed over a long period, some | in which these values appear remains fixed over a long period, some | |||
| implementations might not correctly handle a new value when it is | implementations might not correctly handle a new value when it is | |||
| introduced. For example, implementations of TLS broke when new | introduced. For example, implementations of TLS broke when new | |||
| values of the signature_algorithms extension were introduced. | values of the signature_algorithms extension were introduced. | |||
| 2.3. Multi-Party Interactions and Middleboxes | 2.3. Multi-party Interactions and Middleboxes | |||
| One of the key challenges in deploying new features is ensuring | One of the key challenges in deploying new features is ensuring | |||
| compatibility with all actors that could be involved in the protocol. | compatibility with all actors that could be involved in the protocol. | |||
| Even the most superficially simple protocols can often involve more | Even the most superficially simple protocols can often involve more | |||
| actors than is immediately apparent. | actors than is immediately apparent. | |||
| The design of extension points needs to consider what actions | The design of extension points needs to consider what actions | |||
| middleboxes might take in response to a protocol change, as well as | middleboxes might take in response to a protocol change as well as | |||
| the effect those actions could have on the operation of the protocol. | the effect those actions could have on the operation of the protocol. | |||
| Deployments of protocol extensions also need to consider the impact | Deployments of protocol extensions also need to consider the impact | |||
| of the changes on entities beyond protocol participants and | of the changes on entities beyond protocol participants and | |||
| middleboxes. Protocol changes can affect the behavior of | middleboxes. Protocol changes can affect the behavior of | |||
| applications or systems that don't directly interact with the | applications or systems that don't directly interact with the | |||
| protocol, such as when a protocol change modifies the formatting of | protocol, such as when a protocol change modifies the formatting of | |||
| data delivered to an application. | data delivered to an application. | |||
| 3. Active Use | 3. Active Use | |||
| skipping to change at page 6, line 37 ¶ | skipping to change at line 251 ¶ | |||
| protocol that only rarely uses a mechanism, could lead to that | protocol that only rarely uses a mechanism, could lead to that | |||
| mechanism being unreliable. | mechanism being unreliable. | |||
| Implementations that routinely see new values are more likely to | Implementations that routinely see new values are more likely to | |||
| correctly handle new values. More frequent changes will improve the | correctly handle new values. More frequent changes will improve the | |||
| likelihood that incorrect handling or intolerance is discovered and | likelihood that incorrect handling or intolerance is discovered and | |||
| rectified. The longer an intolerant implementation is deployed, the | rectified. The longer an intolerant implementation is deployed, the | |||
| more difficult it is to correct. | more difficult it is to correct. | |||
| Protocols that routinely add new extensions and code points rarely | Protocols that routinely add new extensions and code points rarely | |||
| have trouble adding additional ones, especially when the handling of | have trouble adding additional ones especially when the handling of | |||
| new versions or extensions are well defined. The definition of | new versions or extensions are well defined. The definition of | |||
| mechanisms alone is insufficient; it is the assured implementation | mechanisms alone is insufficient; it is the assured implementation | |||
| and active use of those mechanisms that determines their | and active use of those mechanisms that determines their | |||
| availability. | availability. | |||
| What constitutes "active use" can depend greatly on the environment | What constitutes "active use" can depend greatly on the environment | |||
| in which a protocol is deployed. The frequency of changes necessary | in which a protocol is deployed. The frequency of changes necessary | |||
| to safeguard some mechanisms might be slow enough to attract | to safeguard some mechanisms might be slow enough to attract | |||
| ossification in another protocol deployment, while being excessive in | ossification in another protocol deployment, while being excessive in | |||
| others. | others. | |||
| 3.1. Dependency is Better | 3.1. Dependency Is Better | |||
| The easiest way to guarantee that a protocol mechanism is used is to | The easiest way to guarantee that a protocol mechanism is used is to | |||
| make the handling of it critical to an endpoint participating in that | make the handling of it critical to an endpoint participating in that | |||
| protocol. This means that implementations must rely on both the | protocol. This means that implementations must rely on both the | |||
| existence of extension mechanisms and their continued, repeated | existence of extension mechanisms and their continued, repeated | |||
| expansion over time. | expansion over time. | |||
| For example, the message format in SMTP relies on header fields for | For example, the message format in SMTP relies on header fields for | |||
| most of its functions, including the most basic delivery functions. | most of its functions, including the most basic delivery functions. | |||
| A deployment of SMTP cannot avoid including an implementation of | A deployment of SMTP cannot avoid including an implementation of | |||
| skipping to change at page 7, line 38 ¶ | skipping to change at line 296 ¶ | |||
| Caution is advised to avoid assuming that building a dependency on an | Caution is advised to avoid assuming that building a dependency on an | |||
| extension mechanism is sufficient to ensure availability of that | extension mechanism is sufficient to ensure availability of that | |||
| mechanism in the long term. If the set of possible uses is narrowly | mechanism in the long term. If the set of possible uses is narrowly | |||
| constrained and deployments do not change over time, implementations | constrained and deployments do not change over time, implementations | |||
| might not see new variations or assume a narrower interpretation of | might not see new variations or assume a narrower interpretation of | |||
| what is possible. Those implementations might still exhibit errors | what is possible. Those implementations might still exhibit errors | |||
| when presented with new variations. | when presented with new variations. | |||
| 3.2. Version Negotiation | 3.2. Version Negotiation | |||
| As noted in Section 2.1, protocols that provide version negotiation | As noted in Section 2.1, protocols that provide version-negotiation | |||
| mechanisms might not be able to test that feature until a new version | mechanisms might not be able to test that feature until a new version | |||
| is deployed. One relatively successful design approach has been to | is deployed. One relatively successful design approach has been to | |||
| use the protocol selection mechanisms built into a lower-layer | use the protocol selection mechanisms built into a lower-layer | |||
| protocol to select the protocol. This could allow a version | protocol to select the protocol. This could allow a version- | |||
| negotiation mechanism to benefit from active use of the extension | negotiation mechanism to benefit from active use of the extension | |||
| point by other protocols. | point by other protocols. | |||
| For instance, all published versions of IP contain a version number | For instance, all published versions of IP contain a version number | |||
| as the four high bits of the first header byte. However, version | as the four high bits of the first header byte. However, version | |||
| selection using this field proved to be unsuccessful. Ultimately, | selection using this field proved to be unsuccessful. Ultimately, | |||
| successful deployment of IPv6 over Ethernet [RFC2464] required a | successful deployment of IPv6 over Ethernet [RFC2464] required a | |||
| different EtherType from IPv4. This change took advantage of the | different EtherType from IPv4. This change took advantage of the | |||
| already-diverse usage of EtherType. | already diverse usage of EtherType. | |||
| Other examples of this style of design include Application-Layer | Other examples of this style of design include Application-Layer | |||
| Protocol Negotiation ([ALPN]) and HTTP content negotiation | Protocol Negotiation ([ALPN]) and HTTP content negotiation | |||
| (Section 12 of [HTTP]). | (Section 12 of [HTTP]). | |||
| This technique relies on the codepoint being usable. For instance, | This technique relies on the code point being usable. For instance, | |||
| the IP protocol number is known to be unreliable and therefore not | the IP protocol number is known to be unreliable and therefore not | |||
| suitable [NEW-PROTOCOLS]. | suitable [NEW-PROTOCOLS]. | |||
| 3.3. Falsifying Active Use | 3.3. Falsifying Active Use | |||
| "Grease" was originally defined for TLS [GREASE], but has been | "Grease" was originally defined for TLS [GREASE] but has been adopted | |||
| adopted by other protocols, such as QUIC [QUIC]. Grease identifies | by other protocols such as QUIC [QUIC]. Grease identifies lack of | |||
| lack of use as an issue (protocol mechanisms "rusting" shut) and | use as an issue (protocol mechanisms "rusting" shut) and proposes | |||
| proposes reserving values for extensions that have no semantic value | reserving values for extensions that have no semantic value attached. | |||
| attached. | ||||
| The design in [GREASE] is aimed at the style of negotiation most used | The design in [GREASE] is aimed at the style of negotiation most used | |||
| in TLS, where one endpoint offers a set of options and the other | in TLS, where one endpoint offers a set of options and the other | |||
| chooses the one that it most prefers from those that it supports. An | chooses the one that it most prefers from those that it supports. An | |||
| endpoint that uses grease randomly offers options - usually just one | endpoint that uses grease randomly offers options, usually just one, | |||
| - from a set of reserved values. These values are guaranteed to | from a set of reserved values. These values are guaranteed to never | |||
| never be assigned real meaning, so its peer will never have cause to | be assigned real meaning, so its peer will never have cause to | |||
| genuinely select one of these values. | genuinely select one of these values. | |||
| More generally, greasing is used to refer to any attempt to exercise | More generally, greasing is used to refer to any attempt to exercise | |||
| extension points without changing endpoint behavior, other than to | extension points without changing endpoint behavior other than to | |||
| encourage participants to tolerate new or varying values of protocol | encourage participants to tolerate new or varying values of protocol | |||
| elements. | elements. | |||
| The principle that grease operates on is that an implementation that | The principle that grease operates on is that an implementation that | |||
| is regularly exposed to unknown values is less likely to be | is regularly exposed to unknown values is less likely to be | |||
| intolerant of new values when they appear. This depends largely on | intolerant of new values when they appear. This depends largely on | |||
| the assumption that the difficulty of implementing the extension | the assumption that the difficulty of implementing the extension | |||
| mechanism correctly is as easy or easier than implementing code to | mechanism correctly is as easy or easier than implementing code to | |||
| identify and filter out reserved values. Reserving random or | identify and filter out reserved values. Reserving random or | |||
| unevenly distributed values for this purpose is thought to further | unevenly distributed values for this purpose is thought to further | |||
| discourage special treatment. | discourage special treatment. | |||
| Without reserved greasing codepoints, an implementation can use code | Without reserved greasing code points, an implementation can use code | |||
| points from spaces used for private or experimental use if such a | points from spaces used for private or experimental use if such a | |||
| range exists. In addition to the risk of triggering participation in | range exists. In addition to the risk of triggering participation in | |||
| an unwanted experiment, this can be less effective. Incorrect | an unwanted experiment, this can be less effective. Incorrect | |||
| implementations might still be able to identify these code points and | implementations might still be able to identify these code points and | |||
| ignore them. | ignore them. | |||
| In addition to advertising bogus capabilities, an endpoint might also | In addition to advertising bogus capabilities, an endpoint might also | |||
| selectively disable non-critical protocol elements to test the | selectively disable noncritical protocol elements to test the ability | |||
| ability of peers to handle the absence of certain capabilities. | of peers to handle the absence of certain capabilities. | |||
| This style of defensive design is limited because it is only | This style of defensive design is limited because it is only | |||
| superficial. As greasing only mimics active use of an extension | superficial. As greasing only mimics active use of an extension | |||
| point, it only exercises a small part of the mechanisms that support | point, it only exercises a small part of the mechanisms that support | |||
| extensibility. More critically, it does not easily translate to all | extensibility. More critically, it does not easily translate to all | |||
| forms of extension points. For instance, HMSV negotiation cannot be | forms of extension points. For instance, highest mutually supported | |||
| greased in this fashion. Other techniques might be necessary for | version (HMSV) negotiation cannot be greased in this fashion. Other | |||
| protocols that don't rely on the particular style of exchange that is | techniques might be necessary for protocols that don't rely on the | |||
| predominant in TLS. | particular style of exchange that is predominant in TLS. | |||
| Grease is deployed with the intent of quickly revealing errors in | Grease is deployed with the intent of quickly revealing errors in | |||
| implementing the mechanisms it safeguards. Though it has been | implementing the mechanisms it safeguards. Though it has been | |||
| effective at revealing problems in some cases with TLS, the efficacy | effective at revealing problems in some cases with TLS, the efficacy | |||
| of greasing isn't proven more generally. Where implementations are | of greasing isn't proven more generally. Where implementations are | |||
| able to tolerate a non-zero error rate in their operation, greasing | able to tolerate a non-zero error rate in their operation, greasing | |||
| offers a potential option for safeguarding future extensibility. | offers a potential option for safeguarding future extensibility. | |||
| However, this relies on there being a sufficient proportion of | However, this relies on there being a sufficient proportion of | |||
| participants that are willing to invest the effort and tolerate the | participants that are willing to invest the effort and tolerate the | |||
| risk of interoperability failures. | risk of interoperability failures. | |||
| 3.4. Examples of Active Use | 3.4. Examples of Active Use | |||
| Header fields in email [SMTP], HTTP [HTTP] and SIP [SIP] all derive | Header fields in email [SMTP], HTTP [HTTP], and SIP [SIP] all derive | |||
| from the same basic design, which amounts to a list name/value pairs. | from the same basic design, which amounts to a list of name/value | |||
| There is no evidence of significant barriers to deploying header | pairs. There is no evidence of significant barriers to deploying | |||
| fields with new names and semantics in email and HTTP as clients and | header fields with new names and semantics in email and HTTP as | |||
| servers generally ignore headers they do not understand or need. The | clients and servers generally ignore headers they do not understand | |||
| widespread deployment of SIP B2BUAs, which generally do not ignore | or need. The widespread deployment of SIP back-to-back user agents | |||
| unknown fields, means that new SIP header fields do not reliably | (B2BUAs), which generally do not ignore unknown fields, means that | |||
| reach peers. This does not necessarily cause interoperability issues | new SIP header fields do not reliably reach peers. This does not | |||
| in SIP but rather causes features to remain unavailable until the | necessarily cause interoperability issues in SIP but rather causes | |||
| B2BUA is updated. All three protocols are still able to deploy new | features to remain unavailable until the B2BUA is updated. All three | |||
| features reliably, but SIP features are deployed more slowly due to | protocols are still able to deploy new features reliably, but SIP | |||
| the larger number of active participants that need to support new | features are deployed more slowly due to the larger number of active | |||
| features. | participants that need to support new features. | |||
| As another example, the attribute-value pairs (AVPs) in Diameter | As another example, the attribute-value pairs (AVPs) in Diameter | |||
| [DIAMETER] are fundamental to the design of the protocol. Any use of | [DIAMETER] are fundamental to the design of the protocol. Any use of | |||
| Diameter requires exercising the ability to add new AVPs. This is | Diameter requires exercising the ability to add new AVPs. This is | |||
| routinely done without fear that the new feature might not be | routinely done without fear that the new feature might not be | |||
| successfully deployed. | successfully deployed. | |||
| These examples show extension points that are heavily used are also | These examples show extension points that are heavily used are also | |||
| being relatively unaffected by deployment issues preventing addition | being relatively unaffected by deployment issues preventing addition | |||
| of new values for new use cases. | of new values for new use cases. | |||
| These examples show that a good design is not required for success. | These examples show that a good design is not required for success. | |||
| On the contrary, success is often despite shortcomings in the design. | On the contrary, success is often despite shortcomings in the design. | |||
| For instance, the shortcomings of HTTP header fields are significant | For instance, the shortcomings of HTTP header fields are significant | |||
| enough that there are ongoing efforts to improve the syntax | enough that there are ongoing efforts to improve the syntax | |||
| [HTTP-HEADERS]. | [HTTP-HEADERS]. | |||
| 3.5. Restoring Active Use | 3.5. Restoring Active Use | |||
| With enough effort, active use can be used to restore capabililities. | With enough effort, active use can be used to restore capabilities. | |||
| EDNS [EDNS] was defined to provide extensibility in DNS. Intolerance | Extension Mechanisms for DNS ([EDNS]) was defined to provide | |||
| of the extension in DNS servers resulted in a fallback method being | extensibility in DNS. Intolerance of the extension in DNS servers | |||
| widely deployed (see Section 6.2.2 of [EDNS]). This fallback | resulted in a fallback method being widely deployed (see | |||
| resulted in EDNS being disabled for affected servers. Over time, | Section 6.2.2 of [EDNS]). This fallback resulted in EDNS being | |||
| greater support for EDNS and increased reliance on it for different | disabled for affected servers. Over time, greater support for EDNS | |||
| features motivated a flag day [DNSFLAGDAY] where the workaround was | and increased reliance on it for different features motivated a flag | |||
| removed. | day [DNSFLAGDAY] where the workaround was removed. | |||
| The EDNS example shows that effort can be used to restore | The EDNS example shows that effort can be used to restore | |||
| capabilities. This is in part because EDNS was actively used with | capabilities. This is in part because EDNS was actively used with | |||
| most resolvers and servers. It was therefore possible to force a | most resolvers and servers. It was therefore possible to force a | |||
| change to ensure that extension capabilities would always be | change to ensure that extension capabilities would always be | |||
| available. However, this required an enormous coordination effort. | available. However, this required an enormous coordination effort. | |||
| A small number of incompatible servers and the names they serve also | A small number of incompatible servers and the names they serve also | |||
| became inaccessible to most clients. | became inaccessible to most clients. | |||
| 4. Complementary Techniques | 4. Complementary Techniques | |||
| The protections to protocol evolution that come from active use | The protections to protocol evolution that come from active use | |||
| (Section 3) can be improved through the use of other defensive | (Section 3) can be improved through the use of other defensive | |||
| techniques. The techniques listed here might not prevent | techniques. The techniques listed here might not prevent | |||
| ossification on their own, but can make active use more effective. | ossification on their own, but they can make active use more | |||
| effective. | ||||
| 4.1. Fewer Extension Points | 4.1. Fewer Extension Points | |||
| A successful protocol will include many potential types of extension. | A successful protocol will include many potential types of | |||
| Designing multiple types of extension mechanism, each suited to a | extensions. Designing multiple types of extension mechanisms, each | |||
| specific purpose, might leave some extension points less heavily used | suited to a specific purpose, might leave some extension points less | |||
| than others. | heavily used than others. | |||
| Disuse of a specialized extension point might render it unusable. In | Disuse of a specialized extension point might render it unusable. In | |||
| contrast, having a smaller number of extension points with wide | contrast, having a smaller number of extension points with wide | |||
| applicability could improve the use of those extension points. Use | applicability could improve the use of those extension points. Use | |||
| of a shared extension point for any purpose can protect rarer or more | of a shared extension point for any purpose can protect rarer or more | |||
| specialized uses. | specialized uses. | |||
| Both extensions and core protocol elements use the same extension | Both extensions and core protocol elements use the same extension | |||
| points in protocols like HTTP [HTTP] and DIAMETER [DIAMETER]; see | points in protocols like HTTP [HTTP] and DIAMETER [DIAMETER]; see | |||
| Section 3.4. | Section 3.4. | |||
| 4.2. Invariants | 4.2. Invariants | |||
| Documenting aspects of the protocol that cannot or will not change as | Documenting aspects of the protocol that cannot or will not change as | |||
| extensions or new versions are added can be a useful exercise. | extensions or new versions are added can be a useful exercise. | |||
| Section 2.2 of [RFC5704] defines invariants as: | Section 2.2 of [RFC5704] defines invariants as: | |||
| Invariants are core properties that are consistent across the | | Invariants are core properties that are consistent across the | |||
| network and do not change over extremely long time-scales. | | network and do not change over extremely long time-scales. | |||
| Understanding what aspects of a protocol are invariant can help guide | Understanding what aspects of a protocol are invariant can help guide | |||
| the process of identifying those parts of the protocol that might | the process of identifying those parts of the protocol that might | |||
| change. [QUIC-INVARIANTS] and Section 9.3 of [TLS13] are both | change. [QUIC-INVARIANTS] and Section 9.3 of [TLS13] are both | |||
| examples of documented invariants. | examples of documented invariants. | |||
| As a means of protecting extensibility, a declaration of protocol | As a means of protecting extensibility, a declaration of protocol | |||
| invariants is useful only to the extent that protocol participants | invariants is useful only to the extent that protocol participants | |||
| are willing to allow new uses for the protocol. A protocol that | are willing to allow new uses for the protocol. A protocol that | |||
| declares protocol invariants relies on implementations understanding | declares protocol invariants relies on implementations understanding | |||
| skipping to change at page 12, line 10 ¶ | skipping to change at line 501 ¶ | |||
| protection to limit participation. For example, encryption is used | protection to limit participation. For example, encryption is used | |||
| by the QUIC protocol [QUIC] to limit the information that is | by the QUIC protocol [QUIC] to limit the information that is | |||
| available to middleboxes and integrity protection prevents | available to middleboxes and integrity protection prevents | |||
| modification. | modification. | |||
| 4.4. Effective Feedback | 4.4. Effective Feedback | |||
| While not a direct means of protecting extensibility mechanisms, | While not a direct means of protecting extensibility mechanisms, | |||
| feedback systems can be important to discovering problems. | feedback systems can be important to discovering problems. | |||
| Visibility of errors is critical to the success of techniques like | The visibility of errors is critical to the success of techniques | |||
| grease (see Section 3.3). The grease design is most effective if a | like grease (see Section 3.3). The grease design is most effective | |||
| deployment has a means of detecting and reporting errors. Ignoring | if a deployment has a means of detecting and reporting errors. | |||
| errors could allow problems to become entrenched. | Ignoring errors could allow problems to become entrenched. | |||
| Feedback on errors is more important during the development and early | Feedback on errors is more important during the development and early | |||
| deployment of a change. It might also be helpful to disable | deployment of a change. It might also be helpful to disable | |||
| automatic error recovery methods during development. | automatic error recovery methods during development. | |||
| Automated feedback systems are important for automated systems, or | Automated feedback systems are important for automated systems, or | |||
| where error recovery is also automated. For instance, connection | where error recovery is also automated. For instance, connection | |||
| failures with HTTP alternative services [ALT-SVC] are not permitted | failures with HTTP alternative services [ALT-SVC] are not permitted | |||
| to affect the outcome of transactions. An automated feedback system | to affect the outcome of transactions. An automated feedback system | |||
| for capturing failures in alternative services is therefore necessary | for capturing failures in alternative services is therefore necessary | |||
| for failures to be detected. | for failures to be detected. | |||
| How errors are gathered and reported will depend greatly on the | How errors are gathered and reported will depend greatly on the | |||
| nature of the protocol deployment and the entity that receives the | nature of the protocol deployment and the entity that receives the | |||
| report. For instance, end users, developers, and network operations | report. For instance, end users, developers, and network operations | |||
| each have different requirements for how error reports are created, | each have different requirements for how error reports are created, | |||
| managed, and acted upon. | managed, and acted upon. | |||
| Automated delivery of error reports can be critical for rectifying | Automated delivery of error reports can be critical for rectifying | |||
| deployment errors as early as possible, such as seen in [DMARC] and | deployment errors as early as possible, as seen in [DMARC] and | |||
| [SMTP-TLS-Reporting]. | [SMTP-TLS-REPORTING]. | |||
| 5. Security Considerations | 5. Security Considerations | |||
| Many of the problems identified in this document are not the result | Many of the problems identified in this document are not the result | |||
| of deliberate actions by an adversary, but more the result of | of deliberate actions by an adversary but more the result of | |||
| mistakes, decisions made without sufficient context, or simple | mistakes, decisions made without sufficient context, or simple | |||
| neglect. Problems therefore not the result of opposition by an | neglect, i.e., problems therefore not the result of opposition by an | |||
| adversary. In response, the recommended measures generally assume | adversary. In response, the recommended measures generally assume | |||
| that other protocol participants will not take deliberate action to | that other protocol participants will not take deliberate action to | |||
| prevent protocol evolution. | prevent protocol evolution. | |||
| The use of cryptographic techniques to exclude potential participants | The use of cryptographic techniques to exclude potential participants | |||
| is the only strong measure that the document recommends. However, | is the only strong measure that the document recommends. However, | |||
| authorized protocol peers are most often responsible for the | authorized protocol peers are most often responsible for the | |||
| identified problems, which can mean that cryptography is insufficient | identified problems, which can mean that cryptography is insufficient | |||
| to exclude them. | to exclude them. | |||
| The ability to design, implement, and deploy new protocol mechanisms | The ability to design, implement, and deploy new protocol mechanisms | |||
| can be critical to security. In particular, it is important to be | can be critical to security. In particular, it is important to be | |||
| able to replace cryptographic algorithms over time [AGILITY]. For | able to replace cryptographic algorithms over time [AGILITY]. For | |||
| example, preparing for replacement of weak hash algorithms was made | example, preparing for the replacement of weak hash algorithms was | |||
| more difficult through misuse [HASH]. | made more difficult through misuse [HASH]. | |||
| 6. IANA Considerations | 6. IANA Considerations | |||
| This document makes no request of IANA. | This document has no IANA actions. | |||
| 7. Informative References | 7. Informative References | |||
| [AGILITY] Housley, R., "Guidelines for Cryptographic Algorithm | [AGILITY] Housley, R., "Guidelines for Cryptographic Algorithm | |||
| Agility and Selecting Mandatory-to-Implement Algorithms", | Agility and Selecting Mandatory-to-Implement Algorithms", | |||
| BCP 201, RFC 7696, DOI 10.17487/RFC7696, November 2015, | BCP 201, RFC 7696, DOI 10.17487/RFC7696, November 2015, | |||
| <https://www.rfc-editor.org/rfc/rfc7696>. | <https://www.rfc-editor.org/info/rfc7696>. | |||
| [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/rfc/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| April 2016, <https://www.rfc-editor.org/rfc/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| [DIAMETER] Fajardo, V., Ed., Arkko, J., Loughney, J., and G. Zorn, | [DIAMETER] Fajardo, V., Ed., Arkko, J., Loughney, J., and G. Zorn, | |||
| Ed., "Diameter Base Protocol", RFC 6733, | Ed., "Diameter Base Protocol", RFC 6733, | |||
| DOI 10.17487/RFC6733, October 2012, | DOI 10.17487/RFC6733, October 2012, | |||
| <https://www.rfc-editor.org/rfc/rfc6733>. | <https://www.rfc-editor.org/info/rfc6733>. | |||
| [DMARC] Kucherawy, M., Ed. and E. Zwicky, Ed., "Domain-based | [DMARC] Kucherawy, M., Ed. and E. Zwicky, Ed., "Domain-based | |||
| Message Authentication, Reporting, and Conformance | Message Authentication, Reporting, and Conformance | |||
| (DMARC)", RFC 7489, DOI 10.17487/RFC7489, March 2015, | (DMARC)", RFC 7489, DOI 10.17487/RFC7489, March 2015, | |||
| <https://www.rfc-editor.org/rfc/rfc7489>. | <https://www.rfc-editor.org/info/rfc7489>. | |||
| [DNSFLAGDAY] | [DNSFLAGDAY] | |||
| "DNS Flag Day 2019", May 2019, | "DNS Flag Day 2019", May 2019, | |||
| <https://dnsflagday.net/2019/>. | <https://dnsflagday.net/2019/>. | |||
| [EDNS] Damas, J., Graff, M., and P. Vixie, "Extension Mechanisms | [EDNS] Damas, J., Graff, M., and P. Vixie, "Extension Mechanisms | |||
| for DNS (EDNS(0))", STD 75, RFC 6891, | for DNS (EDNS(0))", STD 75, RFC 6891, | |||
| DOI 10.17487/RFC6891, April 2013, | DOI 10.17487/RFC6891, April 2013, | |||
| <https://www.rfc-editor.org/rfc/rfc6891>. | <https://www.rfc-editor.org/info/rfc6891>. | |||
| [EXT-TCP] Honda, M., Nishida, Y., Raiciu, C., Greenhalgh, A., | [EXT-TCP] Honda, M., Nishida, Y., Raiciu, C., Greenhalgh, A., | |||
| Handley, M., and H. Tokuda, "Is it still possible to | Handley, M., and H. Tokuda, "Is it still possible to | |||
| extend TCP?", Proceedings of the 2011 ACM SIGCOMM | extend TCP?", IMC '11: Proceedings of the 2011 ACM SIGCOMM | |||
| conference on Internet measurement conference - IMC '11, | conference on Internet measurement conference, | |||
| DOI 10.1145/2068816.2068834, 2011, | DOI 10.1145/2068816.2068834, November 2011, | |||
| <https://doi.org/10.1145/2068816.2068834>. | <https://doi.org/10.1145/2068816.2068834>. | |||
| [EXTENSIBILITY] | [EXTENSIBILITY] | |||
| Carpenter, B., Aboba, B., Ed., and S. Cheshire, "Design | Carpenter, B., Aboba, B., Ed., and S. Cheshire, "Design | |||
| Considerations for Protocol Extensions", RFC 6709, | Considerations for Protocol Extensions", RFC 6709, | |||
| DOI 10.17487/RFC6709, September 2012, | DOI 10.17487/RFC6709, September 2012, | |||
| <https://www.rfc-editor.org/rfc/rfc6709>. | <https://www.rfc-editor.org/info/rfc6709>. | |||
| [GREASE] Benjamin, D., "Applying Generate Random Extensions And | [GREASE] Benjamin, D., "Applying Generate Random Extensions And | |||
| Sustain Extensibility (GREASE) to TLS Extensibility", | Sustain Extensibility (GREASE) to TLS Extensibility", | |||
| RFC 8701, DOI 10.17487/RFC8701, January 2020, | RFC 8701, DOI 10.17487/RFC8701, January 2020, | |||
| <https://www.rfc-editor.org/rfc/rfc8701>. | <https://www.rfc-editor.org/info/rfc8701>. | |||
| [HASH] Bellovin, S. and E. Rescorla, "Deploying a New Hash | [HASH] Bellovin, S. and E. Rescorla, "Deploying a New Hash | |||
| Algorithm", Proceedings of NDSS '06 , 2006, | Algorithm", Proceedings of NDSS, 2006, | |||
| <https://www.cs.columbia.edu/~smb/papers/new-hash.pdf>. | <https://www.cs.columbia.edu/~smb/papers/new-hash.pdf>. | |||
| [HTTP] Fielding, R. T., Nottingham, M., and J. Reschke, "HTTP | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Semantics", Work in Progress, Internet-Draft, draft-ietf- | Ed., "HTTP Semantics", Work in Progress, Internet-Draft, | |||
| httpbis-semantics-19, 12 September 2021, | draft-ietf-httpbis-semantics-19, September 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| semantics-19>. | semantics-19>. | |||
| [HTTP-HEADERS] | [HTTP-HEADERS] | |||
| Nottingham, M. and P-H. Kamp, "Structured Field Values for | Nottingham, M. and P-H. Kamp, "Structured Field Values for | |||
| HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | HTTP", RFC 8941, DOI 10.17487/RFC8941, February 2021, | |||
| <https://www.rfc-editor.org/rfc/rfc8941>. | <https://www.rfc-editor.org/info/rfc8941>. | |||
| [HTTP11] Fielding, R. T., Nottingham, M., and J. Reschke, | [HTTP11] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| "HTTP/1.1", Work in Progress, Internet-Draft, draft-ietf- | Ed., "HTTP/1.1", Work in Progress, Internet-Draft, draft- | |||
| httpbis-messaging-19, 12 September 2021, | ietf-httpbis-messaging-19, September 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | |||
| messaging-19>. | messaging-19>. | |||
| [INTOLERANCE] | [INTOLERANCE] | |||
| Kario, H., "Re: [TLS] Thoughts on Version Intolerance", 20 | Kario, H., "Re: [TLS] Thoughts on Version Intolerance", | |||
| July 2016, <https://mailarchive.ietf.org/arch/msg/tls/ | July 2016, <https://mailarchive.ietf.org/arch/msg/tls/ | |||
| bOJ2JQc3HjAHFFWCiNTIb0JuMZc>. | bOJ2JQc3HjAHFFWCiNTIb0JuMZc>. | |||
| [MPTCP] Ford, A., Raiciu, C., Handley, M., and O. Bonaventure, | [MPTCP] Ford, A., Raiciu, C., Handley, M., Bonaventure, O., and C. | |||
| "TCP Extensions for Multipath Operation with Multiple | Paasch, "TCP Extensions for Multipath Operation with | |||
| Addresses", RFC 6824, DOI 10.17487/RFC6824, January 2013, | Multiple Addresses", RFC 8684, DOI 10.17487/RFC8684, March | |||
| <https://www.rfc-editor.org/rfc/rfc6824>. | 2020, <https://www.rfc-editor.org/info/rfc8684>. | |||
| [MPTCP-HOW-HARD] | [MPTCP-HOW-HARD] | |||
| Raiciu, C., Paasch, C., Barre, S., Ford, A., Honda, M., | Raiciu, C., Paasch, C., Barre, S., Ford, A., Honda, M., | |||
| Duchene, F., Bonaventure, O., and M. Handley, "How Hard | Duchene, F., Bonaventure, O., and M. Handley, "How Hard | |||
| Can It Be? Designing and Implementing a Deployable | Can It Be? Designing and Implementing a Deployable | |||
| Multipath TCP", April 2012, | Multipath TCP", April 2012, | |||
| <https://www.usenix.org/conference/nsdi12/technical- | <https://www.usenix.org/conference/nsdi12/technical- | |||
| sessions/presentation/raiciu>. | sessions/presentation/raiciu>. | |||
| [NEW-PROTOCOLS] | [NEW-PROTOCOLS] | |||
| Barik, R., Welzl, M., Fairhurst, G., Elmokashfi, A., | Barik, R., Welzl, M., Fairhurst, G., Elmokashfi, A., | |||
| Dreibholz, T., and S. Gjessing, "On the usability of | Dreibholz, T., and S. Gjessing, "On the usability of | |||
| transport protocols other than TCP: A home gateway and | transport protocols other than TCP: A home gateway and | |||
| internet path traversal study", Computer Networks Vol. | internet path traversal study", Computer Networks, Vol. | |||
| 173, pp. 107211, DOI 10.1016/j.comnet.2020.107211, May | 173, pp. 107211, DOI 10.1016/j.comnet.2020.107211, May | |||
| 2020, <https://doi.org/10.1016/j.comnet.2020.107211>. | 2020, <https://doi.org/10.1016/j.comnet.2020.107211>. | |||
| [PATH-SIGNALS] | [PATH-SIGNALS] | |||
| Hardie, T., Ed., "Transport Protocol Path Signals", | Hardie, T., Ed., "Transport Protocol Path Signals", | |||
| RFC 8558, DOI 10.17487/RFC8558, April 2019, | RFC 8558, DOI 10.17487/RFC8558, April 2019, | |||
| <https://www.rfc-editor.org/rfc/rfc8558>. | <https://www.rfc-editor.org/info/rfc8558>. | |||
| [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
| DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
| <https://www.rfc-editor.org/rfc/rfc9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
| [QUIC-INVARIANTS] | [QUIC-INVARIANTS] | |||
| Thomson, M., "Version-Independent Properties of QUIC", | Thomson, M., "Version-Independent Properties of QUIC", | |||
| RFC 8999, DOI 10.17487/RFC8999, May 2021, | RFC 8999, DOI 10.17487/RFC8999, May 2021, | |||
| <https://www.rfc-editor.org/rfc/rfc8999>. | <https://www.rfc-editor.org/info/rfc8999>. | |||
| [RAv4] Katz, D., "IP Router Alert Option", RFC 2113, | [RAv4] Katz, D., "IP Router Alert Option", RFC 2113, | |||
| DOI 10.17487/RFC2113, February 1997, | DOI 10.17487/RFC2113, February 1997, | |||
| <https://www.rfc-editor.org/rfc/rfc2113>. | <https://www.rfc-editor.org/info/rfc2113>. | |||
| [RAv6] Partridge, C. and A. Jackson, "IPv6 Router Alert Option", | [RAv6] Partridge, C. and A. Jackson, "IPv6 Router Alert Option", | |||
| RFC 2711, DOI 10.17487/RFC2711, October 1999, | RFC 2711, DOI 10.17487/RFC2711, October 1999, | |||
| <https://www.rfc-editor.org/rfc/rfc2711>. | <https://www.rfc-editor.org/info/rfc2711>. | |||
| [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, | [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, | |||
| DOI 10.17487/RFC0791, September 1981, | DOI 10.17487/RFC0791, September 1981, | |||
| <https://www.rfc-editor.org/rfc/rfc791>. | <https://www.rfc-editor.org/info/rfc791>. | |||
| [RFC0988] Deering, S., "Host extensions for IP multicasting", | [RFC1112] Deering, S., "Host extensions for IP multicasting", STD 5, | |||
| RFC 988, DOI 10.17487/RFC0988, July 1986, | RFC 1112, DOI 10.17487/RFC1112, August 1989, | |||
| <https://www.rfc-editor.org/rfc/rfc988>. | <https://www.rfc-editor.org/info/rfc1112>. | |||
| [RFC2464] Crawford, M., "Transmission of IPv6 Packets over Ethernet | [RFC2464] Crawford, M., "Transmission of IPv6 Packets over Ethernet | |||
| Networks", RFC 2464, DOI 10.17487/RFC2464, December 1998, | Networks", RFC 2464, DOI 10.17487/RFC2464, December 1998, | |||
| <https://www.rfc-editor.org/rfc/rfc2464>. | <https://www.rfc-editor.org/info/rfc2464>. | |||
| [RFC5704] Bryant, S., Ed., Morrow, M., Ed., and IAB, "Uncoordinated | [RFC5704] Bryant, S., Ed., Morrow, M., Ed., and IAB, "Uncoordinated | |||
| Protocol Development Considered Harmful", RFC 5704, | Protocol Development Considered Harmful", RFC 5704, | |||
| DOI 10.17487/RFC5704, November 2009, | DOI 10.17487/RFC5704, November 2009, | |||
| <https://www.rfc-editor.org/rfc/rfc5704>. | <https://www.rfc-editor.org/info/rfc5704>. | |||
| [RRTYPE] Gustafsson, A., "Handling of Unknown DNS Resource Record | [RRTYPE] Gustafsson, A., "Handling of Unknown DNS Resource Record | |||
| (RR) Types", RFC 3597, DOI 10.17487/RFC3597, September | (RR) Types", RFC 3597, DOI 10.17487/RFC3597, September | |||
| 2003, <https://www.rfc-editor.org/rfc/rfc3597>. | 2003, <https://www.rfc-editor.org/info/rfc3597>. | |||
| [SIP] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | [SIP] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, | |||
| A., Peterson, J., Sparks, R., Handley, M., and E. | A., Peterson, J., Sparks, R., Handley, M., and E. | |||
| Schooler, "SIP: Session Initiation Protocol", RFC 3261, | Schooler, "SIP: Session Initiation Protocol", RFC 3261, | |||
| DOI 10.17487/RFC3261, June 2002, | DOI 10.17487/RFC3261, June 2002, | |||
| <https://www.rfc-editor.org/rfc/rfc3261>. | <https://www.rfc-editor.org/info/rfc3261>. | |||
| [SMTP] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | [SMTP] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | |||
| DOI 10.17487/RFC5321, October 2008, | DOI 10.17487/RFC5321, October 2008, | |||
| <https://www.rfc-editor.org/rfc/rfc5321>. | <https://www.rfc-editor.org/info/rfc5321>. | |||
| [SMTP-TLS-Reporting] | [SMTP-TLS-REPORTING] | |||
| Margolis, D., Brotman, A., Ramakrishnan, B., Jones, J., | Margolis, D., Brotman, A., Ramakrishnan, B., Jones, J., | |||
| and M. Risher, "SMTP TLS Reporting", RFC 8460, | and M. Risher, "SMTP TLS Reporting", RFC 8460, | |||
| DOI 10.17487/RFC8460, September 2018, | DOI 10.17487/RFC8460, September 2018, | |||
| <https://www.rfc-editor.org/rfc/rfc8460>. | <https://www.rfc-editor.org/info/rfc8460>. | |||
| [SNI] Langley, A., "Accepting that other SNI name types will | [SNI] Langley, A., "[TLS] Accepting that other SNI name types | |||
| never work", 3 March 2016, | will never work.", March 2016, | |||
| <https://mailarchive.ietf.org/arch/msg/ | <https://mailarchive.ietf.org/arch/msg/ | |||
| tls/1t79gzNItZd71DwwoaqcQQ_4Yxc>. | tls/1t79gzNItZd71DwwoaqcQQ_4Yxc>. | |||
| [SNMPv1] Case, J., Fedor, M., Schoffstall, M., and J. Davin, | [SNMPv1] Case, J., Fedor, M., Schoffstall, M., and J. Davin, | |||
| "Simple Network Management Protocol (SNMP)", RFC 1157, | "Simple Network Management Protocol (SNMP)", RFC 1157, | |||
| DOI 10.17487/RFC1157, May 1990, | DOI 10.17487/RFC1157, May 1990, | |||
| <https://www.rfc-editor.org/rfc/rfc1157>. | <https://www.rfc-editor.org/info/rfc1157>. | |||
| [SPF] Kitterman, S., "Sender Policy Framework (SPF) for | [SPF] Kitterman, S., "Sender Policy Framework (SPF) for | |||
| Authorizing Use of Domains in Email, Version 1", RFC 7208, | Authorizing Use of Domains in Email, Version 1", RFC 7208, | |||
| DOI 10.17487/RFC7208, April 2014, | DOI 10.17487/RFC7208, April 2014, | |||
| <https://www.rfc-editor.org/rfc/rfc7208>. | <https://www.rfc-editor.org/info/rfc7208>. | |||
| [SUCCESS] Thaler, D. and B. Aboba, "What Makes for a Successful | [SUCCESS] Thaler, D. and B. Aboba, "What Makes for a Successful | |||
| Protocol?", RFC 5218, DOI 10.17487/RFC5218, July 2008, | Protocol?", RFC 5218, DOI 10.17487/RFC5218, July 2008, | |||
| <https://www.rfc-editor.org/rfc/rfc5218>. | <https://www.rfc-editor.org/info/rfc5218>. | |||
| [TCP] Postel, J., "Transmission Control Protocol", STD 7, | [TCP] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/rfc/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [TFO] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | [TFO] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | |||
| Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | |||
| <https://www.rfc-editor.org/rfc/rfc7413>. | <https://www.rfc-editor.org/info/rfc7413>. | |||
| [TLS-EXT] Eastlake 3rd, D., "Transport Layer Security (TLS) | [TLS-EXT] Eastlake 3rd, D., "Transport Layer Security (TLS) | |||
| Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
| DOI 10.17487/RFC6066, January 2011, | DOI 10.17487/RFC6066, January 2011, | |||
| <https://www.rfc-editor.org/rfc/rfc6066>. | <https://www.rfc-editor.org/info/rfc6066>. | |||
| [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security | [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
| (TLS) Protocol Version 1.2", RFC 5246, | (TLS) Protocol Version 1.2", RFC 5246, | |||
| DOI 10.17487/RFC5246, August 2008, | DOI 10.17487/RFC5246, August 2008, | |||
| <https://www.rfc-editor.org/rfc/rfc5246>. | <https://www.rfc-editor.org/info/rfc5246>. | |||
| [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://www.rfc-editor.org/rfc/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| [TRANSITIONS] | [TRANSITIONS] | |||
| Thaler, D., Ed., "Planning for Protocol Adoption and | Thaler, D., Ed., "Planning for Protocol Adoption and | |||
| Subsequent Transitions", RFC 8170, DOI 10.17487/RFC8170, | Subsequent Transitions", RFC 8170, DOI 10.17487/RFC8170, | |||
| May 2017, <https://www.rfc-editor.org/rfc/rfc8170>. | May 2017, <https://www.rfc-editor.org/info/rfc8170>. | |||
| Appendix A. Examples | Appendix A. Examples | |||
| This appendix contains a brief study of problems in a range of | This appendix contains a brief study of problems in a range of | |||
| Internet protocols at different layers of the stack. | Internet protocols at different layers of the stack. | |||
| A.1. DNS | A.1. DNS | |||
| Ossified DNS code bases and systems resulted in new Resource Record | Ossified DNS code bases and systems resulted in new Resource Record | |||
| Codes (RRCodes) being unusable. A new codepoint would take years of | Codes (RRCodes) being unusable. A new code point would take years of | |||
| coordination between implementations and deployments before it could | coordination between implementations and deployments before it could | |||
| be relied upon. Consequently, overloading use of the TXT record was | be relied upon. Consequently, use of the TXT record was overloaded | |||
| used to avoid effort and delays involved, a method used in the Sender | in order to avoid the effort and delays involved in allocating new | |||
| Policy Framework [SPF] and other protocols. | code points; this approach was used in the Sender Policy Framework | |||
| [SPF] and other protocols. | ||||
| It was not until after the standard mechanism for dealing with new | It was not until after the standard mechanism for dealing with new | |||
| RRCodes [RRTYPE] was considered widely deployed that new RRCodes can | RRCodes [RRTYPE] was considered widely deployed that new RRCodes | |||
| be safely created and used. | could be safely created and used. | |||
| A.2. HTTP | A.2. HTTP | |||
| HTTP has a number of very effective extension points in addition to | HTTP has a number of very effective extension points in addition to | |||
| the aforementioned header fields. It also has some examples of | the aforementioned header fields. It also has some examples of | |||
| extension points that are so rarely used that it is possible that | extension points that are so rarely used that it is possible that | |||
| they are not at all usable. | they are not at all usable. | |||
| Extension points in HTTP that might be unwise to use include the | Extension points in HTTP that might be unwise to use include the | |||
| extension point on each chunk in the chunked transfer coding | extension point on each chunk in the chunked transfer coding | |||
| Section 7.1 of [HTTP11], the ability to use transfer codings other | (Section 7.1 of [HTTP11]), the ability to use transfer codings other | |||
| than the chunked coding, and the range unit in a range request | than the chunked coding, and the range unit in a range request | |||
| Section 14 of [HTTP]. | (Section 14 of [HTTP]). | |||
| A.3. IP | A.3. IP | |||
| The version field in IP was rendered useless when encapsulated over | The version field in IP was rendered useless when encapsulated over | |||
| Ethernet, requring a new ethertype with IPv6 [RFC2464], due in part | Ethernet, requiring a new EtherType with IPv6 [RFC2464], due in part | |||
| to layer 2 devices making version-independent assumptions about the | to Layer 2 devices making version-independent assumptions about the | |||
| structure of the IPv4 header. | structure of the IPv4 header. | |||
| Protocol identifiers or codepoints that are reserved for future use | Protocol identifiers or code points that are reserved for future use | |||
| can be especially problematic. Reserving values without attributing | can be especially problematic. Reserving values without attributing | |||
| semantics to their use can result in diverse or conflicting semantics | semantics to their use can result in diverse or conflicting semantics | |||
| being attributed without any hope of interoperability. An example of | being attributed without any hope of interoperability. An example of | |||
| this is the 224/3 "class E" address space in IPv4 [RFC0988]. This | this is the 224/3 address space in IPv4 that [RFC0791] reserved | |||
| space was originally reserved in [RFC0791] without assigning any | without assigning any semantics. [RFC1112] partially reclaimed that | |||
| semantics and has since been partially reclaimed for use in multicast | reserved address space for use in multicast (224/4), but the | |||
| (224/4), but otherwise has not been successfully reclaimed for any | remaining address space (240/4) has not been successfully reclaimed | |||
| purpose (240/4) [RFC0988]. | for any purpose. | |||
| For protocols that can use negotiation to attribute semantics to | For protocols that can use negotiation to attribute semantics to | |||
| values, it is possible that unused codepoints can be reclaimed for | values, it is possible that unused code points can be reclaimed for | |||
| active use, though this requires that the negotiation include all | active use, though this requires that the negotiation include all | |||
| protocol participants. For something as fundamental as addressing, | protocol participants. For something as fundamental as addressing, | |||
| negotiation is difficult or even impossible, as all nodes on the | negotiation is difficult or even impossible, as all nodes on the | |||
| network path plus potential alternative paths would need to be | network path plus potential alternative paths would need to be | |||
| involved. | involved. | |||
| IP Router Alerts [RAv4][RAv6] use IP options or extension headers to | IP Router Alerts [RAv4][RAv6] use IP options or extension headers to | |||
| indicate that data is intended for consumption by the next hop router | indicate that data is intended for consumption by the next-hop router | |||
| rather than the addressed destination. In part, the deployment of | rather than the addressed destination. In part, the deployment of | |||
| router alerts was unsuccessful due to the realities of processing IP | router alerts was unsuccessful due to the realities of processing IP | |||
| packets at line rates, combined with bad assumptions in the protocol | packets at line rates, combined with bad assumptions in the protocol | |||
| design about these performance constraints. However, this was not | design about these performance constraints. However, this was not | |||
| exclusively down to design problems or bugs as the capability was | exclusively down to design problems or bugs, as the capability was | |||
| also deliberately blocked at some routers. | also deliberately blocked at some routers. | |||
| A.4. SNMP | A.4. SNMP | |||
| As a counter example, the first version of the Simple Network | As a counter example, the first version of the Simple Network | |||
| Management Protocol (SNMP) [SNMPv1] defines that unparseable or | Management Protocol (SNMP) [SNMPv1] states that unparseable or | |||
| unauthenticated messages are simply discarded without response: | unauthenticated messages are simply discarded without response: | |||
| It then verifies the version number of the SNMP message. If there | | It then verifies the version number of the SNMP message. If there | |||
| is a mismatch, it discards the datagram and performs no further | | is a mismatch, it discards the datagram and performs no further | |||
| actions. | | actions. | |||
| When SNMP versions 2, 2c and 3 came along, older agents did exactly | When SNMP versions 2, 2c, and 3 came along, older agents did exactly | |||
| what the protocol specifies. Deployment of new versions was likely | what the protocol specifies. Deployment of new versions was likely | |||
| successful because the handling of newer versions was both clear and | successful because the handling of newer versions was both clear and | |||
| simple. | simple. | |||
| A.5. TCP | A.5. TCP | |||
| Extension points in TCP [TCP] have been rendered difficult to use, | Extension points in TCP [TCP] have been rendered difficult to use | |||
| largely due to middlebox interactions; see [EXT-TCP]. | largely due to middlebox interactions; see [EXT-TCP]. | |||
| For instance, multipath TCP [MPTCP] can only be deployed | For instance, multipath TCP ([MPTCP]) can only be deployed | |||
| opportunistically; see [MPTCP-HOW-HARD]. As multipath TCP enables | opportunistically; see [MPTCP-HOW-HARD]. Since MPTCP is a protocol | |||
| progressive enhancement of the protocol, this largely only causes the | enhancement that doesn't impair the connection if it is blocked, | |||
| feature to not be available if the path is intolerant of the | network path intolerance of the extension only results in the | |||
| extension. | multipath functionality becoming unavailable. | |||
| In comparison, the deployment of Fast Open [TFO] critically depends | In comparison, the deployment of TCP Fast Open ([TFO]) critically | |||
| on extension capability being widely available. Though very few | depends on extension capability being widely available. Though very | |||
| network paths were intolerant of the extension in absolute terms, TCP | few network paths were intolerant of the extension in absolute terms, | |||
| Fast Open could not be deployed as a result. | TCP Fast Open could not be deployed as a result. | |||
| A.6. TLS | A.6. TLS | |||
| Transport Layer Security (TLS) [TLS12] provides examples of where a | Transport Layer Security (TLS) [TLS12] provides examples of where a | |||
| design that is objectively sound fails when incorrectly implemented. | design that is objectively sound fails when incorrectly implemented. | |||
| TLS provides examples of failures in protocol version negotiation and | TLS provides examples of failures in protocol version negotiation and | |||
| extensibility. | extensibility. | |||
| Version negotiation in TLS 1.2 and earlier uses the "Highest mutually | Version negotiation in TLS 1.2 and earlier uses the "Highest mutually | |||
| supported version (HMSV)" scheme exactly as it is described in | supported version (HMSV)" scheme exactly as it is described in | |||
| [EXTENSIBILITY]. However, clients are unable to advertise a new | [EXTENSIBILITY]. However, clients are unable to advertise a new | |||
| version without causing a non-trivial proportion of sessions to fail | version without causing a non-trivial proportion of sessions to fail | |||
| due to bugs in server and middlebox implementations. | due to bugs in server and middlebox implementations. | |||
| Intolerance to new TLS versions is so severe [INTOLERANCE] that TLS | Intolerance to new TLS versions is so severe [INTOLERANCE] that TLS | |||
| 1.3 [TLS13] abandoned HMSV version negotiation for a new mechanism. | 1.3 [TLS13] abandoned HMSV version negotiation for a new mechanism. | |||
| The server name indication (SNI) [TLS-EXT] in TLS is another | The server name indication (SNI) [TLS-EXT] in TLS is another | |||
| excellent example of the failure of a well-designed extensibility | excellent example of the failure of a well-designed extensibility | |||
| point. SNI uses the same technique for extension that is used | point. SNI uses the same technique for extensions that is used | |||
| successfully in other parts of the TLS protocol. The original design | successfully in other parts of the TLS protocol. The original design | |||
| of SNI anticipated the ability to include multiple names of different | of SNI anticipated the ability to include multiple names of different | |||
| types. | types. | |||
| SNI was originally defined with just one type of name: a domain name. | SNI was originally defined with just one type of name: a domain name. | |||
| No other type has ever been standardized, though several have been | No other type has ever been standardized, though several have been | |||
| proposed. Despite an otherwise exemplary design, SNI is so | proposed. Despite an otherwise exemplary design, SNI is so | |||
| inconsistently implemented that any hope for using the extension | inconsistently implemented that any hope for using the extension | |||
| point it defines has been abandoned [SNI]. | point it defines has been abandoned [SNI]. | |||
| IAB Members at the Time of Approval | ||||
| Internet Architecture Board members at the time this document was | ||||
| approved for publication were: | ||||
| Jari Arkko | ||||
| Deborah Brungard | ||||
| Ben Campbell | ||||
| Lars Eggert | ||||
| Wes Hardaker | ||||
| Cullen Jennings | ||||
| Mirja Kühlewind | ||||
| Zhenbin Li | ||||
| Jared Mauch | ||||
| Tommy Pauly | ||||
| David Schinazi | ||||
| Russ White | ||||
| Jiankang Yao | ||||
| Acknowledgments | Acknowledgments | |||
| Toerless Eckert, Wes Hardaker, Mirja Kuehlewind, Eliot Lear, Mark | Toerless Eckert, Wes Hardaker, Mirja Kühlewind, Eliot Lear, Mark | |||
| Nottingham, and Brian Trammell made significant contributions to this | Nottingham, and Brian Trammell made significant contributions to this | |||
| document. | document. | |||
| Authors' Addresses | Authors' Addresses | |||
| Martin Thomson | Martin Thomson | |||
| Mozilla | ||||
| Email: mt@lowentropy.net | Email: mt@lowentropy.net | |||
| Tommy Pauly | Tommy Pauly | |||
| Apple | ||||
| Email: tpauly@apple.com | Email: tpauly@apple.com | |||
| End of changes. 112 change blocks. | ||||
| 248 lines changed or deleted | 252 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||