RFC 215 UNKNOWN IMPLEMENTATION · TERMINAL

NCP, ICP, and Telnet: The Terminal IMP implementation

How Terminal IMP implemented network protocols with severe memory constraints

On rfc-editor.org ↗
PUBLISHED
August 1971
AUTHORS
A.M. McKenzie
STREAM
Legacy
AVAILABLE MEMORY
8 kilobytes
TERMINALS SUPPORTED
Up to 64
NETWORK CONNECTIONS
Up to 128 simplex
MAXIMUM ALLOCATION
65,534 bits
DOI
10.17487/RFC0215

RFC text

Original text · RFC Editor View on rfc-editor.org ↗
Network Working Group                                      A. McKenzie
Request for Comments: 215                                          BBN
NIC #7545                                               30 August 1971
Categories: C.2, D.1, D.3, G.1
Updates: none
Obsoletes: none

                         NCP, ICP, and TELNET:

                    The Terminal IMP Implementation

       By early December there will be six Terminal IMPs incorporated
into the network, with additional Terminal IMPs scheduled for delivery
at a rate of about one per month thereafter.  For this reason the
implementation of network protocols (and deviations from them) may be of
interest to the network community.  This note describes the choices made
by the Terminal IMP system programmers where choices are permitted by
the protocols, and documents some instances of non-compliance with
protocols.

     Most of the choices made during protocol implementation on the
Terminal IMP were influenced strongly by storage limitations.  The
Terminal IMP has no bulk storage for buffering, and has only 8K of 16-
bit words available for both device I/O buffers and program.  The
program must drive up to 64 terminals which generally will include a
variety of terminal types with differing code sets and communication
protocols (e.g., the IBM 2741 terminals).  In addition, the Terminal IMP
must include a rudimentary language processor which allows a terminal
user to specify parameters affecting his network connections.  Since the
Terminal IMP exists only to provide access to the network for 64
terminals, it must be prepared to maintain 128 (simplex) network
connections at any time; thus each word stored in the NCP tables on a
per-connection basis consumes a significant portion of the Terminal IMP
memory.

     It should be remembered that the Terminal IMP is designed to
provide access to the network for its users, not to provide service to
the rest of the network.  Thus the Terminal IMP does not contain
programs to perform the "server" portion of the ICP; in fact, it does
not have a "logger" socket.

RFC #215


     The Terminal IMP program currently implements only the NCP, the
ICP, and the TELNET protocol since these are of immediate interest to
the sites with Terminal IMPs.  It is anticipated that portions of the
data transfer protocol will be implemented in the future; the portions
to be implemented are not yet clearly defined, but will probably include
the infinite bit stream (first) and the "transparent" mode (later).
Developments in the area of data transmission protocol will be
documented in the future.

     The remainder of this note describes, and attempts to justify,
deviations from the official protocols and other design choices of
interest.  Although written in the present tense, there are some
additional known instances of deviation from protocol which will be
corrected in the near future.

   A)  Deviations from Protocols

      1)  The Terminal IMP does not guarantee correct response
          to ECO commands.  If some Host A sends a control
          message containing ECOs to the Terminal IMP, and the
          message arrives at a time when

          a)  the Terminal IMP has a free buffer and

          b)  the control link from the Terminal IMP to Host A
              is not blocked

          then the Terminal IMP will generate a correct ERP for
          each ECO.  In all other cases the ECO commands will
          be discarded.  (All control messages sent by the
          Terminal IMP begin with a NOP control command, so if
          Host A sends a control message consisting of 60 ECO
          commands, the Terminal IMP will answer (if at all)
          with a 121-byte message -- 1 NOP and 60 ERPs.)

          The reason for this method of implementation is that
          to guarantee correct response to ECO in all cases
          requires an infinite amount of storage.  For
          example, suppose Host A sends control messages, each
          containing an ECO command, to Host B at the rate of
          one per second, but that Host A accepts messages from
          the network as slowly as possible (one every 39
          seconds, say).  Then Host B has only three choices
          which do not violate protocol:

          a)  Declare itself dead to the network (i.e., turn
              off its Ready line), thereby denying all its
              users use of the network.

RFC #215


          b)  Refuse to accept messages from the network
              faster than the slowest possible foreign Host
              (i.e., about one every 39 seconds).  If Host B is
              a Terminal IMP, this is almost certainly slow
              enough to soon reach a steady state of no users.

          c)  Implement "infinite" storage for buffering
              messages.

          Since it is clear that none of the "legal" solutions
          are possible, we have decided to do no buffering,
          which should (we guess) satisfy the protocol well
          over 99% of the time.

      2)  The Terminal IMP does not guarantee to issue CLS
          commands in response to "unsolicited" RFCs.  There
          are currently several ways to "solicit" an RFC, as
          follows:

          a)  A terminal user can tell the Terminal IMP to
              perform the ICP to the TELNET Logger at some
              foreign Host.  This action "solicits" the RFCs
              defined by the ICP.

          b)  A terminal user can send an RFC to any particular
              Host and socket he chooses.  This "solicits" a
              matching RFC.

          c)  A terminal user can set his own receive socket
              "wild."  This action "solicits" an STR from
              anyone to his socket.  Similarly, the user can
              set his send socket "wild" to "solicit" an RTS.

          If the Terminal IMP receives a "solicited" RFC it
          handles it in accordance with the protocol.  If the
          Terminal IMP receives a control message containing
          one or more "unsolicited" RFCs it will either issue
          CLS commands or ignore the RFCs according to the
          criteria described above for answering ECOs (and for
          the same reasons).  Further, if the Terminal IMP
          does issue a CLS in response to an unsolicited RFC
          it will not wait for a matching CLS before
          considering the sockets involved to be free for other
          use.

      3)  After issuing a CLS for a connection, the Terminal
          IMP will not wait forever for a matching CLS.
          There are two cases:

RFC #215


          a)  The Terminal IMP has sent an RFC, grown tired of
              waiting for a matching RFC, and therefore issued
              a CLS

          b)  The Terminal IMP has sent a CLS for an
              established connection (matching RFCs exchanged)

          In either of these cases the Terminal IMP will wait
          for a matching CLS for a "reasonable" time (probably
          30 seconds to one minute) and will then "forget" the
          connection.  After the connection is forgotten, the
          Terminal IMP will consider both sockets involved to
          be free for other use.

          Because of program size and table size restrictions,
          the Terminal IMP assigns socket numbers to a terminal
          as a direct function of the physical address of the
          terminal.  Thus (given this socket assignment scheme)
          the failure of some foreign Host to answer a CLS
          could permanently "hang" a terminal.  It might be
          argued that the Terminal IMP could issue a RST to the
          offending Host, but this would also break the
          connections of other terminal users who might be
          performing useful work with that Host.

      4)  The Terminal IMP ignores all RET commands.  The
          Terminal IMP cannot buffer very much input from the
          network to a given terminal due to core size
          limitations.  Accordingly, the Terminal IMP allocates
          only one message and a very small number of bits
          (currently 120 bits; eventually some number in the
          range 8-4000, based on the terminal's speed) on each
          connection for which the Terminal IMP is the
          receiver.  Given such small allocations, the Terminal
          IMP attempts to keep the usable bandwidth as high as
          possible by sending a new allocation, which brings
          the total allocation up to the maximum amount, each
          time that:

          a)  one of the two buffers assigned to the terminal
              is empty, and

          b)  the allocations are below the maxima.

          Thus, if a spontaneous RET were received, the
          reasonable thing for the Terminal IMP to do would be
          to immediately issue a new ALL.  However, if a
          foreign Host had some reason for issuing a first

RFC #215


          spontaneous RET, it would probably issue a second RET
          as soon as it received the ALL.  This would be likely
          to lead to an infinite (and very rapid) RET-ALL loop
          between the two machines, chewing up a considerable
          portion of the Terminal IMP's bandwidth.  Since the
          Terminal IMP can't "afford" to communicate with such
          a Host, it ignores all RETs.

      5)  The Terminal IMP ignores all GVB commands.
          Implementation of GVB appears to require an
          unreasonable number of instructions and, at the
          moment at least, no Host appears to use the GVB
          command.  If we were to implement GVB we would always
          RET all of both allocations and this doesn't seem
          very useful.

      6)  The Terminal IMP does not handle a total bit-
          allocation greater than 65,534 (2^16-2) correctly.
          If the bit-allocation is ever raised above 65,534 the
          Terminal IMP will treat the allocation as infinite.
          This treatment allows the Terminal IMP to store the
          bit allocation for each connection in a single word,
          and to avoid double precision addition and
          subtraction.  Our reasons for this decision are:

      a)  A saving of more than 100 words of memory which
          would be required for allocation tables and for
          double precision addition/subtraction routines.

      b)  Our experience, which indicates that very few
          Hosts (probably one at most) ever raise their
          total bit allocation above 65,534 bits.

      c)  Our expectation that any Host which ever raises
          its bit allocation above 65,534 probably would be
          willing to issue an infinite bit allocation if
          one were provided by the protocol.  Once the bit
          allocation is greater than about 16,000, the
          message allocation (which the Terminal IMP
          handles correctly) is a more powerful method of
          controlling network loading of a Host system than
          bit allocation.  We believe that Hosts which have
          loading problems will recognize this.

      7)  The Terminal IMP ignores the "32-bit number" in the
          ICP.  When the Terminal IMP (the "user site")
          initiates the Initial Connection Protocol the actual
          procedure is to send the required RTS to the logger

RFC #215


          socket of the user-specified foreign Host and
          simultaneously to set the terminal user's send and
          receive sockets in a state where each will accept
          any RFC from the specified Host.  The 32-bit socket
          number transmitted over the logger connection is
          ignored, and the first RTS and STR addressing the
          user's sockets will be accepted (and answered with
          matching RFCs).

          The ICP allows the foreign Host to transmit the RFCs
          involving Terminal IMP sockets "U+2" and "U+3" at
          any time after receipt of the RFC to the (foreign
          Host's) logger socket.  In particular, the RFCs may
          arrive at the Terminal IMP before the 32-bit
          number.  In the case of a "normal" foreign Host, the
          first incoming RFCs for sockets U+2 and U+3 will come
          from the sockets indicated by the 32-bit number, so
          it doesn't matter if the number is ignored.  In the
          case of a pathologic foreign Host, a potentially
          infinite number of "wrong" RFCs involving U+2 and
          U+3 may arrive at the Terminal IMP before the 32-bit
          number is sent.  The Terminal IMP would be required
          to store this stream of RFCs pending arrival of the
          32-bit number, then issue CLS commands for all
          "wrong" RFCs.  However, the Terminal IMP does not
          have infinite storage available for this purpose (it
          is also doubtful that a terminal user really wants to
          converse with a pathologic foreign Host) so the
          Terminal IMP assumes that the foreign Host is
          "normal" and ignores the 32-bit number.

   B)  Other Design Choices Related to Protocol

          1)  The Terminal IMP ignores incoming ERR commands and
              does not output ERR commands.

          2)  The Terminal IMP assumes that incoming messages have
              the format and contents demanded by the relevant
              protocols.  For example, the byte size of incoming
              TELNET messages is assumed to be 8.  The major checks
              which the Terminal IMP does make are:

              a)  If an incoming control message has a byte count
                  greater than 120 then it is discarded.

RFC #215


              b)  If a control command opcode greater than 13 is
                  found during the processing of a control message
                  then the remainder of the control message is
                  discarded.

              c)  If an incoming data message has a byte count
                  indicating that the bit allocation for the
                  connection is exceeded (based on the assumed byte
                  size) then the message is discarded.

          3)  If one control message contains several RST commands
              only one RRP is transmitted.  If several control
              messages, each containing RST commands, arrive "close
              together" only one RST is returned.  [The actual
              implementation is to set a bit each time a RST is
              found (in "foreground") and to reset the bit when a
              RRP is sent (in "background").]

          4)  Socket numbers are preassigned based on the hardware
              "physical address" (in the terminal multiplexing
              device) of the terminal.  The high order 16 bits of
              the socket number give the device number (in the
              range 0-63) and the low order bits are normally 2 or
              3 depending on the socket's gender (zero is also used
              during ICP).  [We would be pleased to see socket
              number length reduced to 16 bits; in that case the
              high order 8 bits would be mapped to the device and
              the low order 8 bits would contain 2 or 3.]

          5)  During ICP, with the Terminal IMP as the user site,
              the Terminal IMP follows the "Listen" option rather
              than the "Init" option (as described at the top of
              page 3, NIC #7170).  In other words, the Terminal IMP
              does not issue the RFCs involving sockets U+2 and U+3
              except in response to incoming RFCs involving those
              sockets.  In this context, we will mention that the
              "deadlock" mentioned in NWG-RFC #202 does not exist,
              since the ICP does not give the server the "Listen"
              option (see NIC #7170, page 2).


          [ This RFC was put into machine readable form for entry ]
            [ into the online RFC archives by Randy Dunlap 5/97 ]

AI ELI5

On this page
PROBLEMTerminal IMPs had only 8 kilobytes of memory to serve 64 terminals, each potentially needing its own network connection. The tight memory budget forced choices about which protocols to implement and how to handle error cases.
MECHANISMThe Terminal IMP implemented NCP, ICP, and Telnet but omitted or simplified several protocol features to save memory, such as not guaranteeing correct ECO responses, not handling unsolicited RFCs reliably, and ignoring certain control commands.
WHY IT MATTERSThe Terminal IMP provided network access to terminals but with documented deviations from the full protocol specifications. These practical trade-offs illustrated the tension between protocol compliance and resource constraints.

§1The Terminal IMP Architecture

By early December 1971, six Terminal IMPs would be incorporated into the ARPANET to provide network access to terminal users. The Terminal IMP is designed to provide access to the network for its users, not to provide service to other networks.

The machine had no bulk storage for buffering and only 8 kilobytes of 16-bit memory available for both device I/O buffers and program. It needed to drive up to 64 terminals with different types and communication protocols, plus a rudimentary language processor. Since up to 128 simplex network connections could be active at once, each word stored in NCP tables consumed significant memory.

A small computer box that gives terminals access to the network, but it does not have much memory to work with.

§2Protocol Deviations

The Terminal IMP implements NCP, ICP, and Telnet but has several documented deviations from protocol specifications. It does not guarantee correct response to ECO (Echo) commands if the IMP lacks a free buffer or if its control link is blocked. It does not guarantee to issue CLS (Close) commands for unsolicited RFCs, and it forgets connections after 30 seconds to one minute of waiting for a matching CLS.

The Terminal IMP ignores all RET (Return) commands to avoid infinite RET-ALL loops that would consume bandwidth. It also ignores GVB (Give Back) commands due to implementation complexity. These deviations reflect practical memory and processing trade-offs.

The small computer skips some rules to save memory and avoid getting stuck in loops with other computers.

§3Design Constraints

Many design choices reflect the Terminal IMP's constraints. It uses simplified allocation handling, ignoring the 32-bit socket number from the Initial Connection Protocol in favor of accepting the first RTS (Request to Send) from the specified host. It treats allocations above 65,534 bits as infinite to store them in a single word, and it limits control messages to 120 bytes.

Socket numbers are preassigned based on terminal hardware addresses rather than being dynamically allocated. During ICP, the Terminal IMP follows the "Listen" option rather than the "Init" option, responding to RFCs rather than initiating them.

The small computer assigns fixed numbers and rules to save space, letting other computers start conversations instead of starting them itself.

§4Impact

These implementation notes documented the practical reality of early network programming: protocol specifications often assume unlimited resources, but real systems must make trade-offs. The Terminal IMP provided valuable network access despite its limitations, and the documented deviations helped other sites understand its behavior and work around it.

Being honest about what the system can and cannot do helps other people use it correctly.

§5References