RFC 729 UNKNOWN TELNET · COMPRESSION

Telnet byte macro option

A Telnet option that lets one side send a single byte standing in for a longer string, to cut control overhead.

On rfc-editor.org ↗
PUBLISHED
May 1977
AUTHORS
D. Crocker
STREAM
Legacy
OBSOLETED BY
RFC 735 — Telnet Byte Macro
OPTION CODE
BM 19
DEFINE SUBCOMMAND
1
ACCEPT SUBCOMMAND
2
FORBIDDEN MACRO BYTE
IAC (255)
NORMAL OVERHEAD OF A SUBCOMMAND
at least 5 characters
DOI
10.17487/RFC0729

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Network Working Group				 Dave Crocker, Rand-ISD
Request for Comments: 729			 (Dcrocker at Rand-Unix)
NlC: 40306					 13 May l977




			TELNET Byte Macro Option


1. Command name and code:

   BM 19

2. Command Meanings:

   IAC WILL BM

	The sender of this  command REQUESTS or AGREES  to use the  BM
	option, and will send sing1e  data characters which are to  be
	interpreted as if longer data strings had been sent.

   IAC WON'T BM

	The  sender  of  this  option  REFUSES  to  send  single  data
	characters which  are  to be  interpreted  as if  longer  data
	strings had been sent.

   IAC DO BM

	The sender REQUESTS or AGREES to have the other side (send  of
	WILL BM) issue  send single  data characters which  are to  be
	interpreted as if longer data strings had been sent.

   IAC DON'T BM

	The sender REFUSES to allow the other side to send single data
	characters which  are  to be  interpreted  as if  longer  data
	strings had been sent.

   IAC SB BM <DEFINE> <macro byte> <count>
                   <expansion string> IAC SE
	where:

	   <macro byte> is the  data byte actually  to be sent  across
	   the network; it may NOT be Telnet IAC (decimal 255).

RFC #729 Telnet Byte Macro Option				 Page 2



	   <count> is a  one-byte binary number,  indicating how  many
	   <expansion string> characters follow, up to the ending  IAC
	   SE, but not including it.

	   <expansion string> is a string of one or more Telnet  ASCII
	   characters and/or commands,  which the <macro  byte> is  to
	   represent; any  character may  occur within  an  <expansion
	   string>.

	The indicated  <macro  byte>  will  be  sent  instead  of  the
	indicated <expansion string>. The receiver of the <macro byte>
	(the sender  of the  DO BM)  is to  behave EXACTLY  as if  the
	<expansion string> of bytes had instead been received from the
	network. This  interpretation is  to  occur before  any  other
	Telnet interpretations, unless the <macro byte> occurs as part
	of a BM subcommand; in this case no special interpretation  is
	to be made.

	Note that the effect of a particular <macro byte> may be
	negated by reseting it to "expand" into itself.

	<DEFINE> is decimal 01.


   IAC SB BM <ACCEPT> <macro byte> IAC SE

	The receiver  of the  <DEFINE> for  <macro byte>  accepts  the
	requested definition and will perform the indicating expansion
	whenever a <macro byte>  is received and is  not part of a  BM
	subcommand.

	<ACCEPT> is decimal 02.


   IAC SB BM <REFUSE> <macro byte> <REASON> IAC SE

	The receive  of  the  <DEFINE> for  <macro  byte>  refuses  to
	perform  the  indicated  translation  from  <macro  byte>   to
	<expansion string> either because the particular <macro  byte>
	is not  an acceptable  choice  or because  the length  of  the
	<expansion string> exceeds available storage.

   <REFUSE> is decimal 03.

   <REASON> may be

	   <BAD CHOICE> which is decimal 01; or

	   <TOO LONG> which is decimal 02.

RFC #729 Telnet Byte Macro Option				 Page 3




   IAC SB BM <LITERAL> <macro byte> IAC SE

	The <macro byte> is to be treated as real data, rather than as
	representative of the <expansion string>

	<LITERAL> is decimal 03.




3. Default:

   WON'T BM -- DON'T BM

	No reinterpretation of data is allowed.

4. Motivation for the option:

   Subcommands for Telnet options currently require a minimum of  five
   characters to be sent over the network (i.e., IAC SB <Option  name>
   IAC SE).   For sub-commands  which  are employed  infrequently,  in
   absolute numbers and in relation  to normal data, this overhead  is
   tolerable. In other cases,  however, it is  not. For example,  data
   which is  sent  in  a  block-oriented fashion  may  need  a  "block
   separator" mark. If  blocks are commonly  as small as  five or  ten
   bytes, then most of the cross-net data will be control information.
   The BM option is intended  as a simple data compression  technique,
   to remove this overhead from the communication channel.


5. Description of the option

   The  option  is   enabled  through  the   standard  Telnet   Option
   negotiation process. Afterwards, the SENDER of data (the side which
   sends the IAC WILL BM) is  free to define and use mappings  between
   single and multiple NOT characters. Except for the ability to offer
   a blanket refusal,  the receiver of  data has no  control over  the
   definition and use of mappings.

   The sender (of the WILL BM) is prohibited from using or  redefining
   a <macro byte> until  it has received an  <ACCEPT> or <REFUSE>,  in
   reply to a <DEFINE>.

   NOTE: The  Telnet command  character  IAC (decimal  255) may  be  a
   member of an <expansion string> but is the ONLY character which may
   NOT be  defined  as  a  <macro  byte>.  ALL  OTHER  Telnet  command
   characters use IAC  as a  preface and therefore  occupy a  SEPARATE
   portion of the data space than do regular data bytes.

RFC #729 Telnet Byte Macro Option Page 4



   With  the  exception  of  IAC,  data  transfered  as  part  of   BM
   subcommands are NOT to be interpreted. They are to be taken only as
   their  normal  character  values.   This  avoids  the  problem   of
   distinguishing between a character which is to be taken as a <macro
   byte>, and interpreted as its corresponding <expansion string>, and
   that same character to be taken  as its usual Telnet NVT value.  In
   all other  cases,  however, <macro  byte>s  are to  be  interpreted
   immediately, as if  the <expansion string>  had actually been  sent
   across  the  network.    Expanded  strings  are   not  subject   to
   reinterpretation, so that recursive definitions cannot be made.

   The <count>  in  the <DEFINE>  subcommand  allows the  receiver  to
   allocate storage. IAC interpretation  is not over-ridden during  BM
   subcommands so  that  IAC  SE will  continue  to  safely  terminate
   malformed subcommands. To include  IAC as part  of a <DEFINE>,  the
   string "IAC IAC" must be sent.

   The BM option is notably inefficient with regard to problems during
   <macro byte> definition and use of  <macro byte>s as real data.  It
   is expected that relatively few  <macro byte>s will be defined  and
   that they will represent relatively short strings. Since the Telnet
   data space  between decimal  128 and  decimal 254  is not  normally
   used, except  by  implementations  employing  the  original  Telnet
   protocol, it is  recommended that <macro  byte>s normally be  drawn
   from that pool.

AI ELI5

On this page
PROBLEMTelnet subcommands need at least five characters on the wire, which is too much overhead when the data comes in small blocks.
MECHANISMAfter negotiating the BM option, the sender defines a single macro byte that stands for a longer expansion string, and the receiver acts as if the full string had arrived.
WHY IT FADEDThe option is a simple data compression technique. It was replaced by RFC 735.

§1Why a Byte Macro Option

Subcommands for Telnet options need a minimum of five characters on the network: IAC SB, the option name, IAC SE. That is fine for rare subcommands but costly for block-oriented data, where a block separator might be needed after every five or ten bytes.

The BM option, option code 19, is meant as a simple data compression technique that removes this overhead.

If every tiny note needed a big envelope, most of what you mail would be envelope. This option lets you use a tiny code instead.

§2Negotiating the Option

The option is enabled with the standard Telnet option negotiation. The side that sends IAC WILL BM is the sender of data and may define mappings between single bytes and longer strings. IAC WON'T BM and IAC DON'T BM refuse. The default is WON'T BM and DON'T BM, so no reinterpretation of data is allowed.

Apart from a blanket refusal, the receiver has no control over which mappings the sender defines.

First both sides agree to use shortcuts. Until they agree, everything is spelled out in full.

§3Defining and Using Macro Bytes

The sender uses IAC SB BM DEFINE macro-byte count expansion IAC SE, where DEFINE is 1. The macro byte may be any byte except IAC (255). The receiver replies with ACCEPT (2) or REFUSE with a reason, BAD CHOICE (1) or TOO LONG (2). The sender must not use or redefine a macro byte until it has an answer.

After acceptance, each macro byte received outside a BM subcommand is treated exactly as if its expansion string had been received. Expanded strings are not reinterpreted, so recursive definitions cannot be made. A LITERAL subcommand marks a byte as real data. The text gives REFUSE and LITERAL the same value, 3. Bytes between 128 and 254 are recommended for macro bytes.

You say: from now on, the letter Q means 'please open the next page'. The other side says yes or says it cannot remember that. Then Q is all you need to send.