RFC 560
Remote Controlled Transmission and Echoing Telnet option
Remote Controlled Transmission & Echoing TELNET Option โจ
Okay bestie, here's the deal with this one ๐. It's from D. Crocker and J. Postel, filed in the Network Working Group under Protocols, TELNET, dated 20 August 1973, with NIC number 18492, and it's RFC 560. The title block doesn't list anything it obsoletes or updates.
Okay so, a terminal in character-at-a-time transmission with foreign-host echo sends four Network Messages for every single character you type ๐. (The character goes from local to foreign host, then its RFNM comes back. Then the echoed character goes from foreign to local host, and its RFNM comes back too.)
By killing most of the echoing (half as many messages) and bundling characters into useful units (an average of five characters per unit, so another 80 per cent off), it's believed you can get almost a 90 per cent reduction in character-mode interactive Network terminal traffic ๐โจ. Literally iconic.
Packaging the characters and dropping foreign echoing also takes some load off the foreign hosts ๐ซถ.
1. Command name and code โจ
The name is RCTE ๐.
2. Command meanings ๐
Let's go through the commands, babe.
IAC WILL RCTE
The sender of this command REQUESTS or AGREES to use the RCTE option, and will send instructions for controlling the other side's terminal printer.
IAC WON'T RCTE
The sender of this option REFUSES to send instructions for controlling the other side's terminal printer.
IAC DO RCTE
The sender REQUEST or AGREES to have the other side (sender of WILL RCTE) issue commands which will control his (sender of the DO) output to the terminal printer.
IAC DON'T RCTE
The sender of this command REFUSES to allow the other side to control his (sender of DON'T) terminal printer.
IAC SB RCTE <cmd> [BC1 BC2] [TC1 TC2]
Where <cmd> is one 8-bit byte with the following flags (bits are counted from the right) ๐ฆ:
Bit Meaning
0 0 = Ignore all other bits in this byte and repeat the
last <cmd> that was sent. Equals a 'continue what
you have been doing'.
1 = Perform actions as indicated by other bits in this
byte.
1 0 = Print (echo) Break character
1 = Skip (don't echo) Break character
2 0 = Print (echo) text up to Break character
1 = Skip (don't echo) text up to Break character
3 0 = Continue using same classes of Break characters.
1 = The two 8-bit bytes following this byte contain
flags for the new Break classes.
4 0 = Continue using same classes of Transmit characters.
1 = Reset Transmit classes according to the two bytes
following 1) the Break classes bytes, if the Break
classes are also being reset, or 2) this byte, if
the Break classes are NOT also being reset.
Here's the value (decimal) of the <cmd> byte and what it means ๐ธ:
0 = Continue what you have been doing
1 = Print (echo) up to AND INCLUDING Break character
3 = Print up to Break character and SKIP (don't echo)
Break character
5 = Skip text (don't echo) up to Break character, but
PRINT Break character
7 = Skip up to and including Break character
Add one of the previous non-zero values to one of the
following values, to get the total decimal value for
the byte (Note that Classes may not be reset without
also resetting the printing action; so an odd number
is guaranteed):
8 = Set Break classes (using the next two bytes [BC1
BC2])
16 = Set Transmission classes (using the next two bytes
[TC1 TC2])
24 = Set Break classes (using the next two bytes [BC1
BC2]) and the Transmission classes (using the two
bytes after that [TC1 TC2]).
Sub-commands (IAC SB RCTE...) are only sent by the Controlling Host. Besides other functions, they functionally replace the Go-Ahead (IAC GA) Telnet Command. Main character behaviour ๐.
3. Default ๐
WON'T RCTE -- DON'T RCTE
Neither host asserts special control over the other host's terminal printer. Chill, nobody's in charge of anybody ๐ง.
4. Motivation for the option ๐ธ
Okay the why. RFC's 1, 5 and 51 talk about Network and process efficiency and smoothness ๐ฆ.
RFC 357, by John Davidson, brings up the echoing delay problem that happens when a remote user accesses a full-duplex host through a satellite link ๐ญ. To skip the many thousands of miles of transit time for each echoed character, while still keeping full server responsiveness and clean terminal output, an echo control similar to the one used by some Time-sharing systems is suggested for the entire Network.
In effect, the proposed option has the user host carefully regulate its local terminal printer according to explicit instructions from the foreign (serving) host ๐.
An important additional issue is efficient Network transmission. Implementing the Davidson Echoing Scheme will eliminate almost all server-to-user echoing โจ.
The proposed option also asks hosts to buffer a terminal's input to the foreign host until it forms a useful unit (with "useful unit" delimited by Break or Transmission characters, as described below). So fewer messages get sent on the user-to-server path ๐.
N.B.: This option is only intended for use with full-duplex hosts. The Go-Ahead Telnet feature is completely adequate for HALF-duplex server hosts. Half-duplex hosts, you're covered already ๐ซถ.
5. Explicit description of control mechanism โญ
5.A. Overview of Interaction ๐ฆ
Here's the vibe check, step by step:
- Agree to use RCTE option
- User holds echo printing until instructed by server to do otherwise
- Server may send output to terminal printer.
- Network output is printed up to an RCTE command
- Server sends
IAC SB RCTE <cmd> - User acts upon the command up to a Break character or until receipt of output from the server host.
- Go to (2)
Note: Output from the server host may occur at any time, in which case the flow of control switches to (2) and then proceeds to (3), (4), etc. Plot twist, anytime ๐.
5.B. Explanation ๐
Okay, now the deep dive ๐ :
- Both hosts agree to use the RCTE option. After that, the using host (
IAC DO RCTE) just acts on the Controlling (serving) host's commands. It does not issue any RCTE commands unless and until it (the using host) decides to stop allowing use of the option (by sendingIAC DON'T RCTE). - The user host starts syncing up with the serving host by suspending terminal echo printing until directed to do otherwise by the controlling host, thru an
IAC SB RCTE <cmd>. It's giving pause, then obey ๐. - The server may send output to the terminal printer, either in response to input from the user (in which case it's already synchronized with the terminal input) or spontaneously. In the latter case, flow of control automatically switches to (2) and continues from there. Output from the server is defined as completed when step (5) occurs. That is, text from the Server to the terminal printer MUST end with an RCTE command ๐ฅ.
- Any output from the server is printed on the terminal IMMEDIATELY. Again, note that the end of such output is defined to be the occurrence of an
IAC SB RCTE <cmd>command ๐. - The server sends an RCTE command. The command may redefine Break and Transmission classes, the action to be performed on Break characters, and the action to be performed on text. Each of these independent functions is controlled by separate bits in the
<cmd>byte ๐ธ.- a. A Transmission character is one which REQUIRES the User Host to transmit all text accumulated up to and including its occurrence. (For Net efficiency, User hosts are DISCOURAGED from sending before the occurrence of a Transmission character.)
If the Transmission Classes bit (Bit 4) is on, the two bytes following the two Break Classes bytes (or immediately following the <cmd> byte, if the Break Classes bit is not on) will indicate what classes are to be enabled.
If the Bit is OFF, the Transmission classes remain unchanged. When the RCTE option is first initiated, NO CLASSES are in effect. That is, no character will be considered a Transmission character. (As if both TC1 and TC2 are zero.)
- b. A Break character has the effect of a Transmission character, but also causes the User host to stop its print/discard action upon the User's input text, until directed to do otherwise by another
IAC SB RCTE <cmd>command from the Serving host. Break characters therefore define printing units. "Break character" as used in this document does NOT mean Telnet Break character. Different thing, bestie ๐ โโ๏ธ.
If the Break Classes bit (Bit 3) is on, the two bytes following <cmd> will indicate what classes are to be enabled. There are currently nine (9) classes defined, with room for expansion.
If the bit is OFF, the Break classes remain unchanged. When the RCTE option is initiated, CLASSES 4, 5, and 9 are to be in effect. That is, Format Effectors, Non-format effector Control Characters and DEL, and Punctuation characters are to be Break characters.
- c. The list of the character classes, used to define Break and Transmission classes, is at the end of this document, in the "Tables" Section ๐.
- d. Because Break characters are special, the print/discard action that should be performed upon them is not always the same as the action performed on the rest of the input text.
For example, while typing a filename to TENEX, I want the text of the filename to be printed (echoed), but I do not want the <escape> (if I use the name completion feature) to be printed. Relatable ๐ญ.
If Bit 1 is ON, the Break character is NOT to be printed.
- e. A separate bit (Bit 2) signals whether or not the text itself should be printed (echoed) to the terminal. If Bit 2 = 0, then the text IS to be printed.
- f. Yet another bit (Bit 0, the right-most bit) signals whether or not any of the other bits of the command should be checked. If this bit is OFF, then the command should be interpreted to mean "continue whatever echoing strategy you have been following, using the same Break and Transmission classes." This is particularly useful for the
<cmd>command that follows spontaneously generated output from the Serving host (such as "System Going Down"), which needs to signal End-of-Message but does not usually want to reset any other conditions. Just a little signal, no drama โจ.
๐ Part 2 is coming, so don't go anywhere, bestie ๐
The server may, however, alter user action after a spontaneous message ๐
, but it is possible that text will be lost, or printed when it should not be, since there is no guarantee that the RCTE <cmd> from the serving host will be properly synchronized with the terminal input ๐
(6) Input from the terminal is (hopefully) buffered up to the occurrence of a Transmission or Break character โจ The input text is echoed or not echoed, up to the occurrence of a Break Character. The most recent RCTE command determines the echo, Transmission and Break actions ๐
(7) When a Break character is typed, the cycle of control is complete and action re-commences at (2) ๐ Action also automatically switches to (2) upon receipt of any text from the Server host ๐
C. Notes, Comments, Etc. ๐ฌ
(1) Even-Numbered Commands, greater than zero, are in error, since they will have the low-order bit off ๐ The command should be interpreted as equal to zero, which means that any Classes Reset bytes ([TC1 TC2] [BC1 BC2]) will be in error ๐ซ
(2) Servers will generally instruct Users NOT to echo Break Characters, even though it might be alright to echo most Break characters ๐คทโโ๏ธ For example, <cr> is usually a safe character to echo but <esc> is not. TENEX Exec is willing to accept either, during filename specification. Therefore, the user must be instructed NOT to echo ANY Break Characters ๐ซถ
This is generally a tolerable problem, since the server has to send an RCTE command at this point, anyhow ๐ Adding the Break character to the message (so that it appears to be echoed) will not cause any extra Network traffic โจ
(3) The RCTE Option entails a rather large overhead ๐ฎโ๐จ In a true character-at-a-time situation, this overhead is not justified. But on the average, it should result in significant savings, both in Network traffic and Host wake-ups ๐โจ
(4) A severe (User) site-dependent problem will be buffering type-ahead input from the terminal ๐ญ It is possible, especially in the case of TIPS, that the input buffer will overflow often. If the receiving (serving) host will permit, the accumulated text should be transmitted at this point. If the text cannot be transmitted and further typing by the user will result in lost text, the user should be notified ๐จ
D. Sample Interaction ๐
Okay, so here's the decoder ring ๐ S: is sent from the serving (WILL RCTE) host to the Using host. U: is sent from the Using (DO RCTE) host to the Serving host. T: is what the terminal user types, and P: is what gets printed on the terminal. Text in square brackets is commentary ๐ฌ Text in angle brackets is one single unit, so carriage return is <cr>, and the decimal value 27 is represented as <27> ๐ง
This example is giving Logon to a Tenex, starting the DED editor, inserting some text, and returning to the Exec level ๐ฆ A Telnet connection is already open, but the TENEX prompt hasn't been issued yet. The hosts first chat about using the RCTE option ๐
S: <IAC><WILL><RCTE>
U: <IAC><DO><RCTE>
S: TENEX 1.31.18, TENEX EXEC 1.50.2 <cr><lf>@
<IAC><SB><RCTE><11><1><24>
[Print the Herald and echo input text upto a Break character,
but do not echo the Break Character. Classes 4 (Format
Effectors), 5 (Non-format effector Controls and <DEL>), and 9
(<space>) act as Break Characters.]
P: TENEX 1.31.18, TENEX EXEC 1.50.2 <cr><lf>@
T: LOGIN ARPA <cr>
P: LOGIN
U: LOGIN <space>
S: <space><IAC><SB><RCTE><0>
P: <space>ARPA
U: ARPA <cr>
S: <cr><lf> (PASSWORD) : <IAC><SB><RCTE><7>
P: <cr><lf> (PASSWORD) :
T: WASHINGTON 1000<cr>
[The password "WASHINGTON" is not echoed. Action on "1000<cr>"
is withheld]
U: WASHINGTON <space>
S: <space><IAC><SB><RCTE><3>
P: <space> 1000
U: 1000<cr>
S: <cr><lf> JOB 17 ON TTY41 7-JUN-73 14:13 <cr><lf>@
<IAC><SB><RCTE><0>
P: <cr><lf> JOB 17 ON TTY41 7-JUN-73 14:13 <cr><lf>@
T: DED <esc><cr>
P: DED
U: DED<esc>
S: .SAV;1 <IAC><SB><RCTE><0>
P: .SAV;1
U: <cr>
S: <cr><lf><lf> Ded 3/14/73 DRO,KRK <cr><lf>:
<IAC><SB><RCTE><15><1><255>
[The program is started and the DED prompt ":" is sent. At the
command level, DED responds to every character.]
P: <cr><lf><lf> DED 3/14/73 DRP,KRK <cr><lf>:
T: IThis is a text line.<cr> This is another test line.<^Z> Q
["I" means Insert Text. The text follows, terminated by a
Control-Z. The "Q" instructs DED to Quit.]
U: I
S: I<cr><lf>* <IAC><SB><RCTE><11><0><24>
[DED prompts the user, during text input, with an asterisk at
the beginning of every line.]
P: I<cr><lf> *This is a test line.
U: This is a test line.<cr>
S: <cr><lf>* <IAC><SB><RCTE><O>
P: <cr><lf>* This is another test line.
U: This is another test line.<^Z>
S: ^Z<cr>lf>: <IAC><SB><RCTE><15><1><255>
[The returned "^Z" is two characters, not the ASCII Control-Z.]
U: Q
[Note that the "Q" is not yet printed on the terminal, since it
is a Break character.]
S: Q<cr><lf>@ <IAC><SB><RCTE><11><1><24>
P: Q<cr><lf> @
And the user is returned to the Exec level ๐๐ฅ๏ธ
E. Tables ๐
(1) <cmd> is one 8-bit byte with the following flags, and the bits are counted from the right ๐ข
Bit Meaning
0 0 = Ignore all other bits in this byte and repeat the last
<cmd> that was sent. Equals a 'continue what you have
been doing'.
1 = Perform actions as indicated by other bits in this
byte.
1 0 = Print (echo) Break character
1 = Skip (don't echo) Break character
2 0 = Print (echo) text up to Break character
1 = Skip (don't echo) text up to Break character
3 0 = Continue using same classes of Break characters.
1 = The two 8-bit bytes following this byte contain flags
for the new Break classes.
4 0 = Continue using same classes of Transmit characters
1 = Reset Transmit classes according two the two bytes
following 1) the Break classes bytes, if the Break
classes are also being reset, or 2) this byte, if the
Break classes are NOT also being reset.
Here are the byte values, decimal style ๐
Byte Value (decimal) and its meaning:
0 = Continue what you have been doing
Even numbers greater than zero (i.e., numbers with the right-
most bit off) are in error and should be interpreted as
equal to zero. When the <cmd> is an even number greater
than zero, Classes bytes TC1 & TC2 and/or BC1 & BC2 must
not be sent.
1 = Print (echo) up to AND INCLUDING Break character
3 = Print up to Break character and SKIP (don't echo) Break
character
5 = Skip text (don't echo) up to Break character, but PRINT
Break character
7 = Skip up to and including Break character
Add one of the previous non-zero values to one of the following
values, to get the total decimal value for the byte (Note
that Classes may not be reset, without also resetting the
printing action; so an odd number is guaranteed):
8 = Set Break classes (using the next two bytes [BC1 BC2])
16 = Set Transmission classes (using the next two bytes [TC1
TC2])
24 = Set Break classes (using the next two bytes [BC1 BC2]) and
the Transmission classes (using the two bytes after that
[TC1 TC2]).
(2) Now for the classes for Break and Transmission ๐ The right-most bit of the second byte (TC2 or BC2) represents Class 1. The left-most bit of the first byte (TC1 or BC1) represents the currently undefined Class 16 ๐ง
1: Upper-Case Letter (A-Z)
2: Lower-case letters (a-z)
3: Numbers (0-9)
4: Format Effectors (<BS> <CR> <LF> <FF> <HT> <VT>)
5: Non-format effectors Control Characters, <DEL> and <ESC>
6: . , ; : ? !
7; - [ ( < > ) ] |
8: ' " / \ % @ $ # + - * = ^ <- _ (square box symbol)
9: <space>
And Telnet commands (IAC...) are ALWAYS to have the effect of
a Break character.
[ This RFC was put into machine readable form for entry ]
[ into the online RFC archives by Via Genie ]
๐ฆ where this page comes from
- ietf: rfc560 1973-08
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms