From 4bfd864f10b68b71482b35c818559068ef8d5797 Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Wed, 27 Nov 2024 20:54:24 +0100 Subject: doc: Add RFC documents --- doc/rfc/rfc1143.txt | 563 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 563 insertions(+) create mode 100644 doc/rfc/rfc1143.txt (limited to 'doc/rfc/rfc1143.txt') diff --git a/doc/rfc/rfc1143.txt b/doc/rfc/rfc1143.txt new file mode 100644 index 0000000..fc4d635 --- /dev/null +++ b/doc/rfc/rfc1143.txt @@ -0,0 +1,563 @@ + + + + + + +Network Working Group D. Bernstein +Request for Comments: 1143 NYU + February 1990 + + + The Q Method of Implementing TELNET Option Negotiation + + +Status of This Memo + + This is RFC discusses an implementation approach to option + negotiation in the Telnet protocol (RFC 854). It does not propose + any changes to the TELNET protocol. Rather, it discusses the + implementation of the protocol of one feature, only. This is not a + protocol specification. This is an experimental method of + implementing a protocol. This memo is not a recommendation of the + Telnet Working Group of the Internet Engineering Task Force (IETF). + This RFC is Copyright 1990, Daniel J. Bernstein. However, + distribution of this memo in original form is unlimited. + +1. Introduction + + This RFC amplifies, supplements, and extends the RFC 854 [7] option + negotiation rules and guidelines, which are insufficient to prevent + all option negotiation loops. This RFC also presents an example of + correct implementation. + + DISCUSSION: + + The two items in this RFC of the most interest to implementors are + 1. the examples of option negotiation loops given below; and 2. the + example of a TELNET state machine preventing loops. + + 1. Implementors of TELNET should read the examples of option + negotiation loops and beware that preventing such loops is a + nontrivial task. + + 2. Section 7 of this RFC shows by example a working method + of avoiding loops. It prescribes the state information that + you must keep about each side of each option; it shows what + to do in each state when you receive WILL/WONT/DO/DONT from + the network, and when the user or process requests that an + option be enabled or disabled. An implementor who uses the + procedures given in that example need not worry about + compliance with this RFC or with a large chunk of RFC 854. + + In short, all implementors should be familiar with TELNET loops, and + some implementors may wish to use the pre-written example here in + + + +Bernstein [Page 1] + +RFC 1143 Q Method February 1990 + + + writing a new TELNET implementation. + + NOTE: Reading This Document + + A TELNET implementation is not compliant with this RFC if it fails + to satisfy all rules marked MUST. It is compliant if it satisfies + all rules marked MUST. If it is compliant, it is unconditionally + compliant if it also satisfies all rules marked SHOULD and + conditionally compliant otherwise. Rules marked MAY are optional. + + Options are in almost all cases negotiated separately for each + side of the connection. The option on one side is separate from + the option on the other side. In this document, "the" option + referred to by a DONT/WONT or DO/WILL is really two options, + combined only for semantic convenience. Each sentence could be + split into two, one with the words before the slash and one with + the words after the slash. + + An implementor should be able to determine whether or not an + implementation complies with this RFC without reading any text + marked DISCUSSION. An implementor should be able to implement + option negotiation machinery compliant with both this RFC and RFC + 854 using just the information in Section 7. + +2. RFC 854 Option Negotiation Requirements + + As specified by RFC 854: A TELNET implementation MUST obey a refusal + to enable an option; i.e., if it receives a DONT/WONT in response to + a WILL/DO, it MUST NOT enable the option. + + DISCUSSION: + + Where RFC 854 implies that the other side may reject a request to + enable an option, it means that you must accept such a rejection. + + It MUST therefore remember that it is negotiating a WILL/DO, and this + negotiation state MUST be separate from the enabled state and from + the disabled state. During the negotiation state, any effects of + having the option enabled MUST NOT be used. + + If it receives WONT/DONT and the option is enabled, it MUST respond + DONT/WONT repectively and disable the option. It MUST NOT initiate a + DO/WILL negotiation for an already enabled option or a DONT/WONT + negotiation for a disabled option. It MUST NOT respond to receipt of + such a negotiation. It MUST respond to receipt of a negotiation that + does propose to change the status quo. + + + + + +Bernstein [Page 2] + +RFC 1143 Q Method February 1990 + + + DISCUSSION: + + Many existing implementations respond to rejection by confirming + the rejection; i.e., if they send WILL and receive DONT, they send + WONT. This has been construed as acceptable behavior under a + certain (strained) interpretation of RFC 854. However, to allow + this possibility severely complicates later rules; there seems to + be no use for the wasted bandwidth and processing. Note that an + implementation compliant with this RFC will simply ignore the + extra WONT if the other side sends it. + + The implementation MUST NOT automatically respond to the rejection of + a request by submitting a new request. As a rule of thumb, new + requests should be sent either at the beginning of a connection or in + response to an external stimulus, i.e., input from the human user or + from the process behind the server. + + A TELNET implementation MUST refuse (DONT/WONT) a request to enable + an option for which it does not comply with the appropriate protocol + specification. + + DISCUSSION: + + This is not stated as strongly in RFC 854. However, any other + action would be counterproductive. This rule appears in + Requirements for Internet Hosts [6, Section 3.2.2]; it appears + here for completeness. + +3. Rule: Remember DONT/WONT requests + + A TELNET implementation MUST remember starting a DONT/WONT + negotiation. + + DISCUSSION: + + It is not clear from RFC 854 whether or not TELNET must remember + beginning a DONT/WONT negotiation. There seem to be no reasons to + remember starting a DONT/WONT negotiation: 1. The argument for + remembering a DO/WILL negotiation (viz., the state of negotiating + for enabling means different things for the data stream than the + state of having the option enabled) does not apply. 2. There is + no choice for the other side in responding to a DONT/WONT; the + option is going to end up disabled. 3. If we simply disable the + option immediately and forget negotiating, we will ignore the + WONT/DONT response since the option is disabled. + + Unfortunately, that conclusion is wrong. Consider the following + TELNET conversation between two parties, "us" and "him". (The + + + +Bernstein [Page 3] + +RFC 1143 Q Method February 1990 + + + reader of this RFC may want to sort the steps into chronological + order for a different view.) + + LOOP EXAMPLE 1 + + Both sides know that the option is on. + + On his side: + 1 He decides to disable. He sends DONT and disables the option. + 2 He decides to reenable. He sends DO and remembers he is + negotiating. + 5 He receives WONT and gives up on negotiation. + 6 He decides to try once again to reenable. He sends DO and + remembers he is negotiating. + 7 He receives WONT and gives up on negotiation. + For whatever reason, he decides to agree with future requests. + 10 He receives WILL and agrees. He responds DO and enables the + option. + 11 He receives WONT and sighs. He responds DONT and disables the + option. + (repeat 10 and then 11, forever) + + On our side: + 3 We receive DONT and sigh. We respond WONT and disable the + option. + 4 We receive DO but disagree. We respond WONT. + 8 We receive DO and decide to agree. We respond WILL and enable + the option. + 9 We decide to disable. We send WONT and disable the option. + For whatever reason, we decide to agree with future requests. + 12 We receive DO and agree. We send WILL and enable the option. + 13 We receive DONT and sigh. We send WONT and disable the option. + (repeat 12 and then 13, forever) + + Both sides have followed RFC 854; but we end in an option + negotiation loop, as DONT DO DO and then DO DONT forever travel + through the network one way, and WONT WONT followed by WILL WONT + forever travel through the network the other way. The behavior in + steps 1 and 9 is responsible for this loop. Hence this section's + rule. In Section 6 below is discussion of whether separate states + are needed for "negotiate for disable" and "negotiate for enable" + or whether a single "negotiate" state suffices. + +4. Rule: Prohibit new requests before completing old negotiation + + A TELNET implementation MUST NOT initiate a new WILL/WONT/DO/DONT + request about an option that is under negotiation, i.e., for which it + has already made such a request and not yet received a response. + + + +Bernstein [Page 4] + +RFC 1143 Q Method February 1990 + + + DISCUSSION: + + It is unclear from RFC 854 whether or not a TELNET implementation + may allow new requests about an option that is currently under + negotiation; it certainly seems limiting to prohibit "option + typeahead". Unfortunately, consider the following: + + LOOP EXAMPLE 2 + + Suppose an option is disabled, and we decide in quick + succession to enable it, disable it, and reenable it. We send + WILL WONT WILL and at the end remember that we are negotiating. + The other side agrees with DO DONT DO. We receive the first DO, + enable the option, and forget we have negotiated. Now DONT DO + are coming through the network and both sides have forgotten + they are negotiating; consequently we loop. + + (All possible TELNET loops eventually degenerate into the same + form, where WILL WONT [or WONT WILL, or WILL WONT WILL WONT, etc.] + go through the network while both sides think negotiation is over; + the response is DO DONT and we loop forever. TELNET implementors + are encouraged to implement any option that can detect such a loop + and cut it off; e.g., a method of explicitly differentiating + requests from acknowledgments would be sufficient. No such option + exists as of February 1990.) + + This particular case is of considerable practical importance: most + combinations of existing user-server TELNET implementations do + enter an infinite loop when asked quickly a few times to enable + and then disable an option. This has taken on an even greater + importance with the advent of LINEMODE [4], because LINEMODE is + the first option that tends to generate such rapidly changing + requests in the normal course of communication. It is clear that + a new rule is needed. + + One might try to prevent the several-alternating-requests problem + by maintaining a more elaborate state than YES/NO/WANTwhatever, + e.g., a state that records all outstanding requests. Dave Borman + has proposed an apparently working scheme [2] that won't blow up + if both sides initiate several requests at once, and that seems to + prevent option negotiation loops; complete analysis of his + solution is somewhat difficult since it means that TELNET can no + longer be a finite-state automaton. He has implemented his + solution in the latest BSD telnet version [5]; as of May 1989, he + does not intend to publish it for others to use [3]. + + Here the author decided to preserve TELNET's finite-state + property, for robustness and because the result can be easily + + + +Bernstein [Page 5] + +RFC 1143 Q Method February 1990 + + + proven to work. Hence the above rule. + + A more restrictive solution would be to buffer all data and do + absolutely nothing until the response comes back. There is no + apparent reason for this, though some existing TELNET + implementations do so anyway at the beginning of a connection, + when most options are negotiated. + +5. How to reallow the request queue + + DISCUSSION: + + The above rule prevents queueing of more than one request through + the network. However, it is possible to queue new requests within + the TELNET implementation, so that "option typeahead" is + effectively restored. + + An obvious possibility is to maintain a list of requests that have + been made but not yet sent, so that when one negotiation finishes, + the next can be started immediately. So while negotiating for a + WILL, TELNET could buffer the user's requests for WONT, then WILL + again, then WONT, then WILL, then WONT, as far as desired. + + This requires a dynamic and potentially unmanageable buffer. + However, the restrictions upon possible requests guarantee that + the list of requests must simply alternate between WONT and WILL. + It is wasteful to enable an option and then disable it, just to + enable it again; we might as well just enable it in the first + place. The few possible exceptions to this rule do not outweigh + the immense simplification afforded by remembering only the last + few entries on the queue. + + To be more precise, during a WILL negotiation, the only sensible + queues are WONT and WONT WILL, and similarly during a WONT + negotiation. In the interest of simplicity, the Q method does not + allow the WONT WILL possibility. + + We are now left with a queue consisting of either nothing or the + opposite of the current negotiation. When we receive a reply to + the negotiation, if the queue indicates that the option should be + changed, we send the opposite request immediately and empty the + queue. Note that this does not conflict with the RFC 854 rule + about automatic regeneration of requests, as these new requests + are simply the delayed effects of user or process commands. + + An implementation SHOULD support the queue, where support is defined + by the rules following. + + + + +Bernstein [Page 6] + +RFC 1143 Q Method February 1990 + + + If it does support the queue, and if an option is currently under + negotiation, it MUST NOT handle a new request from the user or + process to switch the state of that option by sending a new request + through the network. Instead, it MUST remember internally that the + new request was made. + + If the user or process makes a second new request, for switching back + again, while the original negotiation is still incomplete, the + implementation SHOULD handle the request simply by forgetting the + previous one. The third request SHOULD be treated like the first, + etc. In any case, these further requests MUST NOT generate immediate + requests through the network. + + When the option negotiation completes, if the implementation is + remembering a request internally, and that request is for the + opposite state to the result of the completed negotiation, then the + implementation MUST act as if that request had been made after the + completion of the negotiation. It SHOULD thus immediately generate a + new request through the network. + + The implementation MAY provide a method by which support for the + queue may be turned off and back on. In this case, it MUST default + to having the support turned on. Furthermore, when support is turned + off, if the implementation is remembering a new request for an + outstanding negotiation, it SHOULD continue remembering and then deal + with it at the close of the outstanding negotiation, as if support + were still turned on through that point. + + DISCUSSION: + + It is intended (and it is the author's belief) that this queue + system restores the full functionality of TELNET. Dave Borman has + provided some informal analysis of this issue [1]; the most + important possible problem of note is that certain options which + may require buffering could be slowed by the queue. The author + believes that network delays caused by buffering are independent + of the implementation method used, and that the Q Method does not + cause any problems; this is borne out by examples. + +6. Rule: Separate WANTNO and WANTYES + + Implementations SHOULD separate any states of negotiating WILL/DO + from any states of negotiating WONT/DONT. + + DISCUSSION: + + It is possible to maintain a working TELNET implementation if the + NO/YES/WANTNO/WANTYES states are simplified to NO/YES/WANT. + + + +Bernstein [Page 7] + +RFC 1143 Q Method February 1990 + + + However, in a hostile environment this is a bad idea, as it means + that handling a DO/WILL response to a WONT/DONT cannot be done + correctly. It does not greatly simplify code; and the simplicity + gained is lost in the extra complexity needed to maintain the + queue. + +7. Example of Correct Implementation + + To ease the task of writing TELNET implementations, the author + presents here a precise example of the response that a compliant + TELNET implementation could give in each possible situation. All + TELNET implementations compliant with this RFC SHOULD follow the + procedures shown here. + + EXAMPLE STATE MACHINE + FOR THE Q METHOD OF IMPLEMENTING TELNET OPTION NEGOTIATION + + There are two sides, we (us) and he (him). We keep four + variables: + + us: state of option on our side (NO/WANTNO/WANTYES/YES) + usq: a queue bit (EMPTY/OPPOSITE) if us is WANTNO or WANTYES + him: state of option on his side + himq: a queue bit if him is WANTNO or WANTYES + + An option is enabled if and only if its state is YES. Note that + us/usq and him/himq could be combined into two six-choice states. + + "Error" below means that producing diagnostic information may be a + good idea, though it isn't required. + + Upon receipt of WILL, we choose based upon him and himq: + NO If we agree that he should enable, him=YES, send + DO; otherwise, send DONT. + YES Ignore. + WANTNO EMPTY Error: DONT answered by WILL. him=NO. + OPPOSITE Error: DONT answered by WILL. him=YES*, + himq=EMPTY. + WANTYES EMPTY him=YES. + OPPOSITE him=WANTNO, himq=EMPTY, send DONT. + + * This behavior is debatable; DONT will never be answered by WILL + over a reliable connection between TELNETs compliant with this + RFC, so this was chosen (1) not to generate further messages, + because if we know we're dealing with a noncompliant TELNET we + shouldn't trust it to be sensible; (2) to empty the queue + sensibly. + + + + +Bernstein [Page 8] + +RFC 1143 Q Method February 1990 + + + Upon receipt of WONT, we choose based upon him and himq: + NO Ignore. + YES him=NO, send DONT. + WANTNO EMPTY him=NO. + OPPOSITE him=WANTYES, himq=NONE, send DO. + WANTYES EMPTY him=NO.* + OPPOSITE him=NO, himq=NONE.** + + * Here is the only spot a length-two queue could be useful; after + a WILL negotiation was refused, a queue of WONT WILL would mean + to request the option again. This seems of too little utility + and too much potential waste; there is little chance that the + other side will change its mind immediately. + + ** Here we don't have to generate another request because we've + been "refused into" the correct state anyway. + + If we decide to ask him to enable: + NO him=WANTYES, send DO. + YES Error: Already enabled. + WANTNO EMPTY If we are queueing requests, himq=OPPOSITE; + otherwise, Error: Cannot initiate new request + in the middle of negotiation. + OPPOSITE Error: Already queued an enable request. + WANTYES EMPTY Error: Already negotiating for enable. + OPPOSITE himq=EMPTY. + + If we decide to ask him to disable: + NO Error: Already disabled. + YES him=WANTNO, send DONT. + WANTNO EMPTY Error: Already negotiating for disable. + OPPOSITE himq=EMPTY. + WANTYES EMPTY If we are queueing requests, himq=OPPOSITE; + otherwise, Error: Cannot initiate new request + in the middle of negotiation. + OPPOSITE Error: Already queued a disable request. + + We handle the option on our side by the same procedures, with DO- + WILL, DONT-WONT, him-us, himq-usq swapped. + +8. References + + [1] Borman, D., private communication, April 1989. + + [2] Borman, D., private communication, May 1989. + + [3] Borman, D., private communication, May 1989. + + + + +Bernstein [Page 9] + +RFC 1143 Q Method February 1990 + + + [4] Borman, D., Editor, "Telnet Linemode Option", RFC 1116, Cray + Research, August 1989. + + [5] Borman, D., BSD Telnet Source, November 1989. + + [6] Braden, R., Editor, "Requirements for Internet Hosts -- + Application and Support", RFC 1123, USC/Information Sciences + Institute, October 1989. + + [7] Postel, J., and J. Reynolds, "Telnet Protocol Specification", RFC + 854, USC/Information Sciences Institute, May 1983. + +9. Acknowledgments + + Thanks to Dave Borman, dab@opus.cray.com, for his helpful comments. + +Author's Address + + Daniel J. Bernstein + 5 Brewster Lane + Bellport, NY 11713 + + Phone: 516-286-1339 + + Email: brnstnd@acf10.nyu.edu + + + + + + + + + + + + + + + + + + + + + + + + + + +Bernstein [Page 10] + \ No newline at end of file -- cgit v1.2.3