Reliable Data Protocol

RFC-908

David Velten

Robert Hinden

Jack Sax

BBN Communications Corporation

July 1984

Status of This Memo

This RFC specifies a proposed protocol for the ARPA Internet community, and requests discussion and suggestions for improvements. Distribution of this memo is unlimited.

     RDP Specification                           

Table of Contents

     1   Introduction.......................................... 1
     
     2   General Description................................... 3
     2.1   Motivation.......................................... 3
     2.2   Relation to Other Protocols......................... 5
     
     3   Protocol Operation.................................... 7
     3.1   Protocol Service Objectives......................... 7
     3.2   RDP Connection Management........................... 7
     3.2.1   Opening a Connection.............................. 8
     3.2.2   Ports............................................. 8
     3.2.3   Connection States................................. 8
     3.2.4   Connection Record................................ 11
     3.2.5   Closing a Connection............................. 13
     3.2.6   Detecting an Half-Open Connection................ 14
     3.3   Data Communication................................. 14
     3.4   Reliable Communication............................. 15
     3.4.1   Segment Sequence Numbers......................... 15
     3.4.2   Checksums........................................ 16
     3.4.3   Positive Acknowledgement of Segments............. 16
     3.4.4   Retransmission Timeout........................... 17
     3.5   Flow Control and Window Management................. 17
     3.6   User Interface..................................... 19
     3.7   Event Processing................................... 20
     3.7.1   User Request Events.............................. 21
     3.7.2   Segment Arrival Events........................... 24
     3.7.3   Timeout Events................................... 29
     
     4   RDP Segments and Formats............................. 31
     4.1   IP Header Format................................... 31
     4.2   RDP Header Format.................................. 32
     4.2.1   RDP Header Fields................................ 33
     4.3   SYN Segment........................................ 36
     4.3.1   SYN Segment Format............................... 36
     4.3.2   SYN Segment Fields............................... 37
     4.4   ACK Segment........................................ 38
     4.4.1   ACK Segment Format............................... 38
     4.4.2   ACK Segment Fields............................... 39
     4.5   Extended ACK Segment............................... 40
     4.5.1   EACK Segment Format.............................. 40
     4.5.2   EACK Segment Fields.............................. 40
     
                                                                Page i
     
     RFC-908                                                 July 1984
     
     4.6   RST Segment........................................ 42
     4.6.1   RST Segment Format............................... 42
     4.7   NUL Segment........................................ 43
     4.7.1   NUL segment format............................... 43
     
     5   Examples of Operation................................ 45
     5.1   Connection Establishment........................... 45
     5.2   Simultaneous Connection Establishment.............. 46
     5.3   Lost Segments...................................... 47
     5.4   Segments Received Out of Order..................... 48
     5.5   Communication Over Long Delay Path................. 49
     5.6   Communication Over Long Delay Path With Lost
       Segments
          .................................................... 50
     5.7   Detecting a Half-Open  Connection  on  Crash
       Recovery
          .................................................... 51
     5.8   Detecting a Half-Open  Connection  from  the
       Active Side
          .................................................... 52
     
     A   Implementing a Minimal RDP........................... 53
     
     Page ii
     RDP Specification                           

FIGURES

     1  Relation to Other Protocols............................ 5
     2  Form of Data Exchange Between Layers................... 6
     3  RDP Connection State Diagram.......................... 10
     4  Segment Format........................................ 31
     5  RDP Header Format..................................... 32
     6  SYN Segment Format.................................... 37
     7  ACK Segment Format.................................... 38
     8  EACK Segment Format................................... 41
     9  RST Segment Format.................................... 42
     10  NUL Segment Format................................... 43
     
                                                              Page iii

CHAPTER 1

Introduction

          The Reliable Data Protocol (RDP) is designed  to  provide  a
     reliable  data  transport  service  for packet-based applications
     such as remote loading and debugging.  The protocol  is  intended
     to  be simple to implement but still be efficient in environments
     where there may be long transmission  delays  and  loss  or  non-
     sequential delivery of message segments.
     
          Although this protocol was designed with  applications  such
     as  remote  loading and debugging in mind, it may be suitable for
     other applications that require reliable message  services,  such
     as computer mail, file transfer, transaction processing, etc.
     
          Some of the concepts used come from a  variety  of  sources.
     The  authors  wish credit to be given to Eric Rosen, Rob Gurwitz,
     Jack Haverty, and to acknowledge material adapted from  "RFC-793,
     The Transmission Control Protocol", edited by Jon Postel.  Thanks
     to John Linn for the checksum algorithm.
     
                                                                Page 1
     
     RFC-908                                                 July 1984
     
     Page 2
     RDP Specification                             General Description

CHAPTER 2

General Description

     2.1  Motivation
     
          RDP is a transport protocol designed to efficiently  support
     the  bulk  transfer  of data for such host monitoring and control
     applications  as  loading/dumping  and  remote   debugging.    It
     attempts to provide only those services necessary, in order to be
     efficient in operation and small in size.  Before  designing  the
     protocol,  it  was  necessary  to  consider  what  minimum set of
     transport  functions  would  satisfy  the  requirements  of   the
     intended applications.
     
          The following is a list of requirements for such a transport
     protocol:
     
         o   Reliable delivery of packets is required.   When  loading
             or  dumping  a  memory  image,  it  is necessary that all
             memory segments be  delivered.   A  'hole'  left  in  the
             memory  image  is  not acceptable.  However, the internet
             environment is a lossy  one  in  which  packets  can  get
             damaged  or  lost.   So  a  positive  acknowledgement and
             retransmission mechanism is a necessary component of  the
             protocol.
     
         o   Since loading and  dumping  of  memory  images  over  the
             internet  involves  the bulk transfer of large amounts of
             data over a lossy network with potentially  long  delays,
             it  is necessary that the protocol move data efficiently.
             In particular,  unnecessary  retransmission  of  segments
             should be avoided.  If a single segment has been lost but
             succeeding  segments  correctly  received,  the  protocol
             should  not  require  the  retransmission  of  all of the
             segments.
     
         o   Loading  and  dumping  are  applications  that   do   not
             necessarily  require  sequenced  delivery of segments, as
             long as all segments eventually are  delivered.   So  the
             protocol  need  not  force sequenced delivery.  For these
             types of applications, segments may be delivered  in  the
             order in which they arrive.
     
                                                                Page 3
     
     RFC-908                                                 July 1984
     
         o   However, some  applications  may  need  to  know  that  a
             particular  piece  of  data  has  been  delivered  before
             sending the next.  For example, a debugger will  want  to
             know  that  a  command inserting a breakpoint into a host
             memory  image  has  been  delivered  before   sending   a
             "proceed"  command.   If  those  segments  arrived out of
             sequence, the intended results  would  not  be  achieved.
             The  protocol  should  allow a user to optionally specify
             that a connection  must  deliver  segments  in  sequence-
             number order.
     
         o   The loading/dumping and debugging applications are  well-
             defined  and lend themselves to easy packetization of the
             transferred data.  They do not require  a  complex  byte-
             stream transfer mechanism.
     
          In order to combine the requirements for bulk  transfers  of
     data   and  reliable  delivery,  it  is  necessary  to  design  a
     connection-oriented  protocol  using  a  three-way  handshake  to
     synchronize   sequence   numbers.    The  protocol  seems  to  be
     approaching TCP in complexity, so  why  was  TCP  not,  in  fact,
     chosen?   The answer is that TCP has some disadvantages for these
     applications.  In particular:
     
         o   TCP  is  oriented  toward  a  more  general  environment,
             supporting  the transfer of a stream of bytes between two
             communicating  parties.   TCP  is  best  suited   to   an
             environment where there is no obvious demarcation of data
             in a communications exchange.  Much of the difficulty  in
             developing a TCP implementation stems from the complexity
             of supporting this general byte-stream transfer, and thus
             a  significant  amount  of  complexity  can be avoided by
             using  another   protocol.    This   is   not   just   an
             implementation consideration, but also one of efficiency.
     
         o   Since TCP does not allow a byte to be acknowledged  until
             all  prior  bytes have been acknowledged, it often forces
             unnecessary retransmission of data.  Therefore,  it  does
             not meet another of the requirements stated above.
     
         o   TCP  provides  sequenced  delivery   of   data   to   the
             application.   If  the  application does not require such
             sequenced delivery,  a  large  amount  of  resources  are
             wasted in providing it.  For example, buffers may be tied
             up  buffering  data  until  a  segment  with  an  earlier
             sequence  number  arrives.  The protocol should not force
             its segment-sequencing desires on the application.
     
     Page 4
     RDP Specification                             General Description
     
          RDP supports a much simpler set of functions than TCP.   The
     flow control, buffering, and connection management schemes of RDP
     are considerably  simpler  and  less  complex.   The  goal  is  a
     protocol  that can be easily and efficiently implemented and that
     will serve a range of applications.
     
          RDP functions can also be subset to further reduce the  size
     of  a particular implementation.  For example, a target processor
     requiring down-loading from another host might implement  an  RDP
     module  supporting  only  the  passive Open function and a single
     connection.  The module might also choose not to  implement  out-
     of-sequence acknowledgements.
     
     2.2  Relation to Other Protocols
     
          RDP is a transport  protocol  that  fits  into  the  layered
     internet protocol environment.  Figure 1 illustrates the place of
     RDP in the protocol hierarchy:
     
      +------+   +-----+     +-----+      +------+
      |TELNET|   | FTP |     |Debug|  ... |Loader|  Application Layer
      +------+   +-----+     +-----+      +------+
         |          |           |             |
         +-----+----+           +------+------+
               |                       |
            +------+               +-------+
            |  TCP |               |  RDP  |        Transport Layer
            +------+               +-------+
               |                     |
      +--------------------------------+
      | Internet Protocol & ICMP       |            Internetwork Layer
      +--------------------------------+
                             |
                   +-------------------------+
                   | Network Access Protocol |      Network Layer
                   +-------------------------+

Relation to Other Protocols

Figure 1

                                                                Page 5
     
     RFC-908                                                 July 1984
     
          RDP provides the application layer with a  reliable  message
     transport service.  The interface between users and RDP transfers
     data in units of messages.   When  implemented  in  the  internet
     environment,  RDP is layered on the Internet Protocol (IP), which
     provides an unreliable datagram service to RDP.  Data  is  passed
     across  the  RDP/IP  interface in the form of segments.  RDP uses
     the standard IP interface primitives  to  send  and  receive  RDP
     segments  as  IP  datagrams.  At the internet level, IP exchanges
     datagrams with the network layer.  An internet packet may contain
     an entire datagram or a fragment of a datagram.
     
                                                        #        %
                                                          ?  *     !
                                                                 @  )
       +------+         +-----+         +----+          $  =   ^   +
       |      |Messages |     |Segments |    | Datagrams   *
       | User |<------->| RDP |<------->| IP |<------->    Internet
       |      |         |     |         |    |          ,            ?
       +------+         +-----+         +----+               !    )
                                                          *   %     $
                                                        @    ^   !

Form of Data Exchange Between Layers

Figure 2

          If internetwork services are  not  required,  it  should  be
     possible  to  use  the  RDP without the IP layer.  As long as the
     encapsulating protocol  provides  the  RDP  with  such  necessary
     information  as addressing and protocol demultiplexing, it should
     be possible  to  run  RDP  layered  on  a  variety  of  different
     protocols.
     
     Page 6
     RDP Specification                              Protocol Operation

CHAPTER 3

Protocol Operation

     3.1  Protocol Service Objectives

The RDP protocol has the following goals:

         o   RDP will provide  a  full-duplex  communications  channel
             between the two ports of each transport connection.
         
         o   RDP will attempt to reliably deliver  all  user  messages
             and  will  report  a  failure  to  the  user if it cannot
             deliver a message.  RDP extends the datagram  service  of
             IP to include reliable delivery.
         
         o   RDP will attempt to detect and discard  all  damaged  and
             duplicate  segments.  It will use a checksum and sequence
             number in each segment header to achieve this goal.
         
         o   RDP  will  optionally  provide  sequenced   delivery   of
             segments.    Sequenced   delivery  of  segments  must  be
             specified when the connection is established.
         
         o   RDP will acknowledge segments received out  of  sequence,
             as  they  arrive.   This  will  free  up resources on the
             sending side.
     
     3.2  RDP Connection Management
     
          RDP  is  a  connection-oriented  protocol  in   which   each
     connection  acts  as  a full-duplex communication channel between
     two processes.  Segments from a sender are directed to a port  on
     the  destination host.  The two 8-bit source and destination port
     identifiers in the RDP header are used in  conjunction  with  the
     network  source  and  destination  addresses to uniquely identify
     each connection.
     
                                                                Page 7
     
     RFC-908                                                 July 1984
     
     3.2.1  Opening a Connection
     
          Connections are opened by issuing the  Open  request,  which
     can be either active or passive.  A passive Open request puts RDP
     into the Listen state, during which it passively  listens  for  a
     request to open a connection from a remote site.  The active Open
     request attempts to establish a connection with a specified  port
     at a remote site.
     
          The active Open request requires that a specific remote port
     and host address be specified with the request.  The passive Open
     may  optionally  specify  a  specific  remote  port  and  network
     address,  or it may specify that an open be accepted from anyone.
     If a specific remote port and host  address  were  specified,  an
     arriving  request  to  open  a  connection must exactly match the
     specified remote port and address.
     
     3.2.2  Ports
     
          Valid port numbers range from 1 to 255 (decimal). There  are
     two  types  of  ports:  "well known" ports and "allocable" ports.
     Well-known ports have numbers in the range 1 to 63 (decimal)  and
     allocable ports are given numbers in the range 64 to 255.
     
          The user, when issuing an active Open request, must  specify
     both  the  remote  host  and  port and may optionally specify the
     local port.  If the local port was not specified, RDP will select
     an  unused port from the range of allocable ports. When issuing a
     passive Open request,  the  user  must  specify  the  local  port
     number.   Generally,  in this case the local port will be a well-
     known port.
     
     3.2.3  Connection States
     
          An RDP connection will progress through a series  of  states
     during  its  lifetime.   The states are shown in Figure 3 and are
     individually described below.  In Figure 3, the  boxes  represent
     the  states  of  the  RDP  FSM  and the arcs represent changes in
     state.  Each arc is annotated with the event  causing  the  state
     change and the resulting output.
     
     Page 8
     RDP Specification                              Protocol Operation
     
     CLOSED
     
          The CLOSED state exists when no connection exists and  there
          is no connection record allocated.
     
     LISTEN
     
          The LISTEN state is entered after a passive Open request  is
          processed.   A  connection record is allocated and RDP waits
          for an active request  to  establish  a  connection  from  a
          remote site.
     
     SYN-SENT
     
          The SYN-SENT state is entered  after  processing  an  active
          Open  request.  A connection record is allocated, an initial
          sequence number is generated, and a SYN segment is  sent  to
          the  remote  site.  RDP then waits in the SYN-SENT state for
          acknowledgement of its Open request.
     
     SYN-RCVD
     
          The SYN-RCVD state may be reached  from  either  the  LISTEN
          state  or from the SYN-SENT state.  SYN-RCVD is reached from
          the LISTEN state when a SYN segment requesting a  connection
          is  received  from  a  remote host.  In reply, the local RDP
          generates an initial sequence number for  its  side  of  the
          connection,  and  then  sends  the  sequence  number  and an
          acknowledgement of the SYN segment to the remote  site.   It
          then waits for an acknowledgement.
     
          The SYN-RCVD state is reached from the SYN-SENT state when a
          SYN  segment  is  received  from  the remote host without an
          accompanying acknowledgement of the SYN segment sent to that
          remote  host  by the local RDP.  This situation is caused by
          simultaneous attempts to open a  connection,  with  the  SYN
          segments  passing  each  other in transit.  The action is to
          repeat the SYN segment with the same  sequence  number,  but
          now  including  an  ACK  of the remote host's SYN segment to
          indicate acceptance of the Open request.
     
                                                                Page 9
     
     RFC-908                                                 July 1984
     
                             +------------+
              Passive Open   |            |<-------------------------+
            +----------------|   CLOSED   |                          |
            |   Request      |            |---------------+          |
            V                +------------+               |          |
     +------------+                                       |          |
     |            |                                       |          |
     |   LISTEN   |                                       |          |
     |            |                                       |          |
     +------------+                                       |          |
            |                                   Active    |          |
            |  rcv SYN                       Open Request |          |
            | -----------                    ------------ |          |
            | snd SYN,ACK                      snd SYN    |          |
            V                   rcv SYN                   V          |
     +------------+          -----------           +------------+    |
     |            |          snd SYN,ACK           |            |    |
     |  SYN-RCVD  |<-------------------------------|  SYN-SENT  |    |
     |            |                                |            |    |
     +------------+                                +------------+    |
            |  rcv ACK                       rcv SYN,ACK  |          |
            | ----------                    ------------- |          |
            |    xxx         +------------+    snd ACK    |          |
            |                |            |               |          |
            +--------------->|    OPEN    |<--------------+          |
                             |            |                          |
                             +------------+                          |
                         rcv RST   |   Close request                 |
                       ----------- |  ---------------                |
                           xxx     |     snd RST                     |
                                   V                                 |
                             +------------+                          |
                             |            |                          |
                             | CLOSE-WAIT |--------------------------+
                             |            |  After a Delay
                             +------------+

RDP Connection State Diagram

Figure 3

     Page 10
     RDP Specification                              Protocol Operation
     
     OPEN
     
          The OPEN state exists when a connection has been established
          by  the successful exchange of state information between the
          two sides of the connection.  Each side  has  exchanged  and
          received  such  data  as  initial  sequence  number, maximum
          segment size, and maximum number of unacknowledged  segments
          that may be outstanding.  In the Open state data may be sent
          between the two parties of the connection.
     
     CLOSE-WAIT
     
          The CLOSE-WAIT state is entered from either a Close  request
          or  from the receipt of an RST segment from the remote site.
          RDP has sent an RST segment and is waiting  a  delay  period
          for activity on the connection to complete.
     
     3.2.4  Connection Record
     
          The variables that define the  state  of  a  connection  are
     stored  in  a  connection  record maintained for each connection.
     The following describes some  of  the  variables  that  would  be
     stored in a typical RDP connection record.  It is not intended to
     be  an  implementation  specification  nor  is  it   a   complete
     description.   The  purpose  of naming and describing some of the
     connection record fields is to simplify the  description  of  RDP
     protocol operation, particularly event processing.

The connection record fields and their descriptions follow:

     STATE
     
          The current state of the connection.  Legal values are OPEN,
          LISTEN, CLOSED, SYN-SENT, SYN-RCVD,  and CLOSE-WAIT.

Send Sequence Number Variables:

     SND.NXT

The sequence number of the next segment that is to be sent.

                                                               Page 11
     
     RFC-908                                                 July 1984
     
     SND.UNA

The sequence number of the oldest unacknowledged segment.

     SND.MAX

The maximum number of outstanding (unacknowledged) segments that can be sent. The sender should not send more than this number of segments without getting an acknowledgement.

     SND.ISS
     
          The initial send sequence  number.   This  is  the  sequence
          number that was sent in the SYN segment.

Receive Sequence Number Variables:

     RCV.CUR
     
          The sequence number of the last segment  received  correctly
          and in sequence.
     
     RCV.MAX

The maximum number of segments that can be buffered for this connection.

     RCV.IRS
     
          The initial receive sequence number.  This is  the  sequence
          number of the SYN segment that established this connection.
     
     RCVDSEQNO[n]
     
          The array of sequence numbers of  segments  that  have  been
          received and acknowledged out of sequence.

Other Variables:

     CLOSEWAIT

A timer used to time out the CLOSE-WAIT state.

     SBUF.MAX

The largest possible segment (in octets) that can legally be sent. This variable is specified by the foreign host in the

     Page 12
     
     RDP Specification                              Protocol Operation

SYN segment during connection establishment.

     RBUF.MAX
     
          The  largest  possible  segment  (in  octets)  that  can  be
          received.   This  variable is specified by the user when the
          connection is opened.  The variable is sent to  the  foreign
          host in the SYN segment.

Variables from Current Segment:

     SEG.SEQ
     
          The  sequence  number  of  the   segment   currently   being
          processed.
     
     SEG.ACK

The acknowledgement sequence number in the segment currently being processed.

     SEG.MAX
     
          The maximum number of outstanding segments the  receiver  is
          willing  to  hold,  as  specified  in  the  SYN segment that
          established the connection.
     
     SEG.BMAX
     
          The maximum segment size (in octets) accepted by the foreign
          host  on  a connection, as specified in the SYN segment that
          established the connection.
     
     3.2.5  Closing a Connection
     
          The closing of a connection can  be  initiated  by  a  Close
     request  from  the  user  process or by receipt of an RST segment
     from the other end of the connection.  In the case of  the  Close
     request,  RDP  will  send an RST segment to the other side of the
     connection and then enter the CLOSE-WAIT state for  a  period  of
     time.   While  in the CLOSE-WAIT state, RDP will discard segments
     received from the other side of the connection.  When  the  time-
     out  period expires, the connection record is deallocated and the
     connection ceases  to  exist.   This  simple  connection  closing
     facility  requires  that  users  determine that all data has been
     
                                                               Page 13
     
     RFC-908                                                 July 1984

reliably delivered before requesting a close of the connection.

     3.2.6  Detecting an Half-Open Connection
     
          If one side of a connection crashes, the connection  may  be
     left  with the other side still active.  This situation is termed
     to be an half-open connection.  For many cases,  the  active  RDP
     will  eventually  detect the half-open connection and reset.  Two
     examples of recovery from half-open connections are  provided  in
     sections  5.7  and  5.8.   Recovery  is  usually achieved by user
     activity or by the crashed host's attempts  to  re-establish  the
     connection.
     
          However, there are cases  where  recovery  is  not  possible
     without action by the RDP itself.  For example, if all connection
     blocks are in use, attempts to re-establish a  broken  connection
     will  be  rejected.   In  this  case, the RDP may attempt to free
     resources by verifying  that connections are fully open. It  does
     this  by  sending  a  NUL  segment to each of the other RDPs.  An
     acknowledgement indicates the connection is still open and valid.
     
          To minimize network overhead,  verification  of  connections
     should  only  be  done  when  necessary  to  prevent  a  deadlock
     situation.  Only inactive connections  should  be  verified.   An
     inactive  connection  is  defined  to be a connection that has no
     outstanding unacknowledged segments, has no segments in the  user
     input or output queues, and that has not had any traffic for some
     period of time.
     
     3.3  Data Communication
     
          Data  flows  through  an  RDP  connection  in  the  form  of
     segments.   Each  user  message  submitted with a Send request is
     packaged for transport as a single RDP segment.  Each RDP segment
     is packaged as an RDP header and one or more octets of data.  RDP
     will not attempt to fragment a large user  message  into  smaller
     segments  and re-assemble the message on the receiving end.  This
     differs from a byte-stream protocol such as  TCP  which  supports
     the  transfer  of  an indeterminate length stream of data between
     ports, buffering data until it is requested by the receiver.
     
     Page 14
     RDP Specification                              Protocol Operation
     
          At the RDP level, outgoing segments, as  they  are  created,
     are queued as input to the IP layer.  Each segment is held by the
     sending RDP  until  it  is  acknowledged  by  the  foreign  host.
     Incoming segments are queued as input to the user process through
     the user interface.  Segments are  acknowledged  when  they  have
     been accepted by the receiving RDP.
     
          The receiving end of each connection specifies  the  maximum
     segment  size  it  will  accept.   Any  attempt  by the sender to
     transmit a larger segment is an error.  If RDP determines that  a
     buffer  submitted  with  a  Send request exceeds the maximum size
     segment permitted on the connection, RDP will return an error  to
     the  user.   In addition, RDP will abort a connection with an RST
     segment if an  incoming  segment  contains  more  data  than  the
     maximum  acceptable  segment  size.   No  attempt will be made to
     recover from or otherwise overcome this error condition.
     
          If  sequenced  delivery  of  segments  is  necessary  for  a
     connection, the requirement must be stated when the connection is
     established.  Sequenced  delivery  is  specified  when  the  Open
     request is made.  Sequenced delivery of segments will then be the
     mode of delivery for the life of the connection.
     
     3.4  Reliable Communication
     
          RDP implements a reliable message service through  a  number
     of  mechanisms.   These include the insertion of sequence numbers
     and checksums into  segments,  the  positive  acknowledgement  of
     segment  receipt,  and  timeout  and  retransmission  of  missing
     segments.
     
     3.4.1  Segment Sequence Numbers
     
          Each segment transporting data has a  sequence  number  that
     uniquely  identifies  it  among  all  other  segments in the same
     connection.  The initial  sequence  number  is  chosen  when  the
     connection  is  opened  and is selected by reading a value from a
     monotonically increasing clock.  Each time a  segment  containing
     data   is   transmitted,  the  sequence  number  is  incremented.
     Segments containing no data do not increment the sequence number.
     However, the SYN and NUL segments, which cannot contain data, are
     exceptions.  The  SYN  segment  is  always  sent  with  a  unique
     sequence number, the initial sequence number.  The NUL segment is
     
                                                               Page 15
     
     RFC-908                                                 July 1984

sent with the next valid sequence number.

     3.4.2  Checksums
     
          Each RDP segment contains a checksum to allow  the  receiver
     to  detect  damaged  segments.   RDP  uses  a non-linear checksum
     algorithm to compute a checksum that is 32-bits wide and operates
     on  data  in  units  of  four octets (32 bits).  The area that is
     covered by the checksum includes both the RDP header and the  RDP
     data area.
     
          If a segment contains a number of  header  and  data  octets
     that  is  not an integral multiple of 4 octets, the last octet is
     padded on the right with zeros to  form  a  32-bit  quantity  for
     computation  purposes.   The padding zeros are not transmitted as
     part of the segment.  While computing the checksum, the  checksum
     field  itself  is  replaced  with zeros.  The actual algorithm is
     described in Section 4.2.1.
     
     3.4.3  Positive Acknowledgement of Segments
     
          RDP assumes it has only an unreliable  datagram  service  to
     deliver  segments.   To  guarantee  delivery  of segments in this
     environment, RDP uses positive acknowledgement and retransmission
     of  segments.   Each  segment containing data and the SYN and NUL
     segments are acknowledged when they are  correctly  received  and
     accepted  by  the  destination host.  Segments containing only an
     acknowledgement  are  not  acknowledged.   Damaged  segments  are
     discarded  and  are not acknowledged.  Segments are retransmitted
     when there is no timely acknowledgement of  the  segment  by  the
     destination host.
     
          RDP allows  two  types  of  acknowledgement.   A  cumulative
     acknowledgement  is  used  to  acknowledge  all  segments up to a
     specified sequence number.  This type of acknowledgement  can  be
     sent   using   fixed   length   fields  within  the  RDP  header.
     Specifically,  the  ACK  control  flag  is  set  and   the   last
     acknowledged  sequence  number  is  placed in the Acknowledgement
     Number field.
     
          The extended or non-cumulative  acknowledgement  allows  the
     receiver  to  acknowledge segments out of sequence.  This type of
     acknowledgement is sent using  the  EACK  control  flag  and  the
     
     Page 16
     RDP Specification                              Protocol Operation
     
     variable  length  fields in the RDP segment header.  The variable
     length header fields are used to hold the sequence numbers of the
     acknowledged out-of-sequence segments.
     
          The type of acknowledgement used is simply a function of the
     order  in which segments arrive.  Whenever possible, segments are
     acknowledged using the cumulative acknowledgement segment.   Only
     out-of-sequence  segments  are  acknowledged  using  the extended
     acknowledgement option.
     
          The user process, when  initiating  the  connection,  cannot
     restrict the type of acknowledgement used on the connection.  The
     receiver   may   choose   not   to   implement    out-of-sequence
     acknowledgements.   On  the  other hand, the sender may choose to
     ignore out-of-sequence acknowledgements.
     
     3.4.4  Retransmission Timeout
     
          Segments may be lost in transmission for two  reasons:  they
     may  be  lost  or  damaged  due  to  the  effects  of  the  lossy
     transmission media; or they may be  discarded  by  the  receiving
     RDP.   The  positive acknowledgement policy requires the receiver
     to acknowledge a segment only when the segment has been correctly
     received and accepted.
     
          To detect missing segments,  the  sending  RDP  must  use  a
     retransmission  timer for each segment transmitted.  The timer is
     set to a value approximating the transmission time of the segment
     in  the  network.   When  an  acknowledgement  is  received for a
     segment, the timer is cancelled for that segment.  If  the  timer
     expires before an acknowledgement is received for a segment, that
     segment is retransmitted and the timer is restarted.
     
     3.5  Flow Control and Window Management
     
          RDP employs a simple flow control mechanism that is based on
     the  number  of  unacknowledged  segments  sent  and  the maximum
     allowed number of outstanding  (unacknowledged)  segments.   Each
     RDP  connection  has an associated set of flow control parameters
     that include the maximum number of outstanding segments for  each
     side  of  a  connection.  These parameters are specified when the
     connection is opened with the Open request, with each side of the
     connection   specifying  its  own parameters.  The parameters are
     
                                                               Page 17
     
     RFC-908                                                 July 1984
     
     passed from  one  host  to  another  in  the  initial  connection
     segments.
     
          The values specified for these parameters should be based on
     the  amount  and  size  of  buffers  that  the  RDP is willing to
     allocate to a connection.  The particular RDP implementation  can
     set  the  parameters to values that are optimal for its buffering
     scheme.  Once these parameters  are  set  they  remain  unchanged
     throughout the life of the connection.
     
          RDP employs the concept of  a  sequence  number  window  for
     acceptable segment sequence numbers.  The left edge of the window
     is the number  of  the  last  in-sequence  acknowledged  sequence
     number  plus  one.   The right edge of the window is equal to the
     left edge plus twice the allowed maximum  number  of  outstanding
     segments.   The allowed maximum number of outstanding segments is
     the number of segments the transmitting RDP software  is  allowed
     to send without receiving any acknowledgement.
     
          The flow control and window management parameters  are  used
     as  follows.   The  RDP  module  in  the  transmitting host sends
     segments  until  it  reaches  the  connection's   segment   limit
     specified  by the receiving process.  Once this limit is reached,
     the transmitting RDP module may only send a new segment for  each
     acknowledged segment.
     
          When a received segment has a  sequence  number  that  falls
     within  the  acceptance  window,  it  is  acknowledged.   If  the
     sequence number is equal to the left-hand edge (i.e., it  is  the
     next  sequence number expected), the segment is acknowledged with
     a cumulative acknowledgement (ACK).   The  acceptance  window  is
     adjusted  by  adding  one  to  the  value  of  the edges.  If the
     sequence number is within the acceptance window  but  is  out  of
     sequence,    it    is    acknowledged   with   a   non-cumulative
     acknowledgement (EACK).  The window  is  not  adjusted,  but  the
     receipt of the out-of-sequence segment is recorded.
     
          When  segments  are   acknowledged   out   of   order,   the
     transmitting  RDP  module must not transmit beyond the acceptance
     window.  This could occur if one segment is not acknowledged  but
     all  subsequent  segments  are  received  and acknowledged.  This
     condition will fix the left edge of the window  at  the  sequence
     number of the unacknowledged segment.  As additional segments are
     transmitted, the next  segment  to  be  sent  will  approach  and
     eventually  overtake  the  right  window edge.  At this point all
     transmission of new segments will cease until the  unacknowledged
     segment is acknowledged.
     
     Page 18
     RDP Specification                              Protocol Operation
     
     3.6  User Interface
     
          The user interface to RDP is  implementation  dependent  and
     may  use  system  calls,  function calls or some other mechanism.
     The list of requests that follows is not intended  to  suggest  a
     particular implementation.
     
     OPEN Request
     
          Opens a connection.   Parameters  include  type  (active  or
          passive),  local  port,  remote  port,  remote host address,
          maximum  segment  size,  maximum  number  of  unacknowledged
          segments,  delivery  mode (sequenced or non-sequenced).  The
          connection id,  including  any  allocated  port  number,  is
          returned to the user.
     
     SEND Request
     
          Sends  a  user  message.   Parameters   include   connection
          identifier, buffer address and data count.
     
     RECEIVE Request
     
          Receives a  user  message.   Parameters  include  connection
          identifier, buffer address and data count.
     
     CLOSE Request
     
          Closes a specified connection.  The single parameter is  the
          connection identifier.
     
     STATUS Request
     
          Returns the status of a connection.  The parameters  include
          the  connection  identifier  and  the  address of the status
          buffer.
     
                                                               Page 19
     
     RFC-908                                                 July 1984
     
     3.7  Event Processing
     
          This section describes one possible sequence for  processing
     events.    It   is   not   intended   to   suggest  a  particular
     implementation, but any actual implementation  should  vary  from
     this   description  only  in  detail  and  not  significantly  in
     substance.  The following are the kinds of events that may occur:
     
          USER REQUESTS

Open
Send
Receive
Close
Status

          ARRIVING SEGMENT
          
                Segment Arrives
          
          TIMEOUTS

Retransmission Timeout
Close-Wait Timeout

          User request processing always terminates with a  return  to
     the  caller,  with  a possible error indication.  Error responses
     are given as a character string.   A  delayed  response  is  also
     possible  in  some  situations  and  is  returned  to the user by
     whatever event or pseudo interrupt mechanism is  available.   The
     term "signal" is used to refer to delayed responses.
     
          Processing of arriving segments usually follows this general
     sequence:  the  sequence  number  is checked for validity and, if
     valid, the segment is queued  and  processed  in  sequence-number
     order.   For  all events, unless a state change is specified, RDP
     remains in the same state.
     
     Page 20
     RDP Specification                              Protocol Operation
     
     3.7.1  User Request Events
     
          The following scenarios demonstrate the processing of events
     caused by the issuance of user requests:
     
     Open Request
     
       CLOSED STATE
     
         Create a connection record
         If none available
           Return "Error - insufficient resources"
         Endif
     
         If passive Open
           If local port not specified
             Return "Error - local port not specified"
           Endif
           Generate SND.ISS
           Set SND.NXT = SND.ISS + 1
               SND.UNA = SND.ISS
           Fill in SND.MAX, RMAX.BUF from Open parameters
           Set State = LISTEN
           Return
         Endif
     
         If active Open
           If remote port not specified
             Return "Error - remote port not specified"
           Endif
           Generate SND.ISS
           Set SND.NXT = SND.ISS + 1
               SND.UNA = SND.ISS
           Fill in SND.MAX, RMAX.BUF from Open parameters
           If local port not specified
             Allocate a local port
           Endif
           Send <SEQ=SND.ISS><MAX=SND.MAX><MAXBUF=RMAX.BUF><SYN>
           Set State = SYN-SENT
           Return (local port, connection identifier)
         Endif
     
                                                               Page 21
     
     RFC-908                                                 July 1984

LISTEN STATE
SYN-SENT STATE
SYN-RCVD STATE
OPEN STATE
CLOSE-WAIT STATE

Return "Error - connection already open"

     Close Request
     
       OPEN STATE

Send <SEQ=SND.NXT><RST>
Set State = CLOSE-WAIT
Start TIMWAIT Timer
Return

       LISTEN STATE

Set State = CLOSED
Deallocate connection record
Return

SYN-RCVD STATE
SYN-SENT STATE

Send <SEQ=SND.NXT><RST>
Set State = CLOSED
Return

       CLOSE-WAIT STATE

Return "Error - connection closing"

       CLOSE STATE

Return "Error - connection not open"

     Page 22
     
     RDP Specification                              Protocol Operation
     
     Receive Request
     
       OPEN STATE
     
         If Data is pending
           Return with data
          else
           Return with "no data" indication
         Endif

LISTEN STATE
SYN-RCVD STATE
SYN-SENT STATE

Return with "no data" indication

CLOSE STATE
CLOSE-WAIT STATE

Return "Error - connection not open"

     Send Request
     
       OPEN STATE
     
         If SND.NXT < SND.UNA + SND.MAX
           Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK><Data>
           Set SND.NXT = SND.NXT + 1
           Return
          else
           Return "Error - insufficient resources to send data"
         Endif

LISTEN STATE
SYN-RCVD STATE
SYN-SENT STATE
CLOSE STATE
CLOSE-WAIT STATE

Return "Error - connection not open"

     Status Request

Return with:

                                                               Page 23
     
     RFC-908                                                 July 1984

State of connection (OPEN, LISTEN, etc.)
Number of segments unacknowledged
Number of segments received not given to user Maximum segment size for the send side of the connection Maximum segment size for the receive side of the connection

     3.7.2  Segment Arrival Events
     
          The following scenarios describe the processing of the event
     caused  by  the arrival of a RDP segment from a remote host.  The
     assumption is made that the segment was addressed  to  the  local
     port associated with the connection record.

If State = CLOSED

       If RST set
         Discard segment
         Return
       Endif
       
       If ACK or NUL set
          Send <SEQ=SEG.ACK + 1><RST>
          Discard segment
          Return
        else
          Send <SEQ=0><RST><ACK=RCV.CUR><ACK>
          Discard segment
          Return
       Endif
     
     Endif
     
     If State = CLOSE-WAIT
       If RST set
          Set State = CLOSED
          Discard segment
          Cancel TIMWAIT timer
          Deallocate connection record
        else
          Discard segment
       Endif
       Return
     Endif
     
     Page 24
     RDP Specification                              Protocol Operation

If State = LISTEN

       If RST set
         Discard the segment
         Return
       Endif
       
       If ACK or NUL set
         Send <SEQ=SEG.ACK + 1><RST>
         Return
       Endif
       
       If SYN set
         Set RCV.CUR = SEG.SEQ
             RCV.IRS = SEG.SEQ
             SND.MAX = SEG.MAX
             SBUF.MAX = SEG.BMAX
         Send <SEQ=SND.ISS><ACK=RCV.CUR><MAX=RCV.MAX><BUFMAX=RBUF.MAX>
              <ACK><SYN>
         Set State = SYN-RCVD
         Return
       Endif
     
       If anything else (should never get here)
         Discard segment
         Return
       Endif
     Endif

If State = SYN-SENT

       If ACK set
         If RST clear and SEG.ACK != SND.ISS
           Send <SEQ=SEG.ACK + 1><RST>
         Endif
         Discard segment; Return
       Endif
       
       If RST set
         If ACK set
           Signal "Connection Refused"
           Set State =  CLOSED
           Deallocate connection record
         Endif
         Discard segment
         Return
       Endif
       
                                                               Page 25
     
     RFC-908                                                 July 1984
     
       If SYN set
         Set RCV.CUR = SEG.SEQ
             RCV.IRS = SEG.SEQ
             SND.MAX = SEG.MAX
             RBUF.MAX = SEG.BMAX
         If ACK set
           Set SND.UNA = SEG.ACK
           State = OPEN
           Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK>
          else
           Set State = SYN-RCVD
           Send <SEQ=SND.ISS><ACK=RCV.CUR><MAX=RCV.MAX><BUFMAX=RBUF.MAX>
                  <SYN><ACK>
         Endif
         Return
       Endif
     
       If anything else
         Discard segment
         Return
       Endif
     Endif

If State = SYN-RCVD

       If RCV.IRS < SEG.SEQ =< RCV.CUR + (RCV.MAX * 2)
         Segment sequence number acceptable
        else
         Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK>
         Discard segment
         Return
       Endif
       
       If RST set
         If passive Open
            Set State = LISTEN
         else
            Set State = CLOSED
            Signal "Connection Refused"
            Discard segment
            Deallocate connection record
         Endif
         Return
       Endif
     
     Page 26
     RDP Specification                              Protocol Operation
     
       If SYN set
         Send <SEQ=SEG.ACK + 1><RST>
         Set State = CLOSED
         Signal "Connection Reset"
         Discard segment
         Deallocate connection record
         Return
       Endif
     
       If EACK set
          Send <SEQ=SEG.ACK + 1><RST>
          Discard segment
          Return
       Endif
     
       If ACK set
         If SEG.ACK = SND.ISS
            Set State = OPEN
          else
            Send <SEQ=SEG.ACK + 1><RST>
            Discard segment
            Return
         Endif
        else
         Discard segment
         Return
       Endif
     
       If Data in segment or NUL set
         If the received segment is in sequence
            Copy the data (if any) to user buffers
            Set RCV.CUR=SEG.SEQ
            Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK>
          else
            If out-of-sequence delivery permitted
               Copy the data (if any) to user buffers
            Endif
            Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK><EACK><RCVDSEQNO1>
                      ...<RCVDSEQNOn>
         Endif
       Endif
     
     Endif
     
                                                               Page 27
     
     RFC-908                                                 July 1984

If State = OPEN

       If RCV.CUR < SEG.SEQ =< RCV.CUR + (RCV.MAX * 2)
         Segment sequence number acceptable
        else
         Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK>
         Discard segment and return
       Endif
       
       If RST set
         Set State = CLOSE-WAIT
         Signal "Connection Reset"
         Return
       Endif
       
       If NUL set
         Set RCV.CUR=SEG.SEQ
         Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK>
         Discard segment
         Return
       Endif
       
       If SYN set
         Send <SEQ=SEG.ACK + 1><RST>
         Set State = CLOSED
         Signal "Connection Reset"
         Discard segment
         Deallocate connection record
         Return
       Endif
       
       If ACK set
         If SND.UNA =< SEG.ACK < SND.NXT
           Set SND.UNA = SEG.ACK
           Flush acknowledged segments
         Endif
       Endif
       
       If EACK set
         Flush acknowledged segments
       Endif
     
     Page 28
     RDP Specification                              Protocol Operation
     
       If Data in segment
        If the received segment is in sequence
          Copy the data to user buffers
          Set RCV.CUR=SEG.SEQ
          Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK>
         else
          If out-of-sequence delivery permitted
             Copy the data to user buffers
          Endif
          Send <SEQ=SND.NXT><ACK=RCV.CUR><ACK><EACK><RCVDSEQNO1>
                      ...<RCVDSEQNOn>
        Endif
       Endif
     Endif
     
     3.7.3  Timeout Events
     
          Timeout events occur when a timer expires  and  signals  the
     RDP.  Two types of timeout events can occur, as described below:
     
     RETRANSMISSION TIMEOUTS
     
       If timeout on segment at head of retransmission queue
          Resend the segment at head of queue
          Restart the retransmission timer for the segment
          Requeue the segment on retransmission queue
          Return
       Endif
     
     CLOSE-WAIT TIMEOUTS

Set State = CLOSED
Deallocate connection record
Return

                                                               Page 29
     RFC-908                                                 July 1984
     
     Page 30
     RDP Specification                        RDP Segments and Formats

CHAPTER 4

RDP Segments and Formats

          The segments sent by the application layer are  encapsulated
     in  headers  by  the  transport,  internet and network layers, as
     follows:
     
                            +----------------+
                            | Network Access |
                            |     Header     |
                            +----------------+
                            |   IP Header    |
                            +----------------+
                            |   RDP Header   |
                            +----------------+
                            |     D          |
                            |      A         |
                            |       T        |
                            |        A       |
                            +----------------+

Segment Format

Figure 4

     4.1  IP Header Format
     
          When used in the internet environment, RDP segments are sent
     using  the  version 4 IP header as described in RFC791, "Internet
     Protocol."  The RDP protocol number is ??? (decimal).  The  time-
     to-live  field  should  be  set  to  a  reasonable  value for the
     network.

All other fields should be set as specified in RFC-791.

                                                               Page 31
     RFC-908                                                 July 1984
     
     4.2  RDP Header Format
     
          Every RDP segment is  prefaced  with  an  RDP  header.   The
     format  of the header is shown in Figure 5 below.  The RDP header
     is variable in length and its size is indicated by a field  in  a
     fixed location within the header.
     
                       0             0 0   1         1
                       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                      +-+-+-+-+-+-+---+---------------+
                      |S|A|E|R|N| |Ver|    Header     |
                    0 |Y|C|A|S|U|0|No.|    Length     |
                      |N|K|K|T|L| |   |               |
                      +-+-+-+-+-+-+---+---------------+
                    1 | Source Port   |   Dest. Port  |
                      +---------------+---------------+
                    2 |          Data  Length         |
                      +---------------+---------------+
                    3 |                               |
                      +---    Sequence Number      ---+
                    4 |                               |
                      +---------------+---------------+
                    5 |                               |
                      +--- Acknowledgement Number  ---+
                    6 |                               |
                      +---------------+---------------+
                    7 |                               |
                      +---        Checksum         ---+
                    8 |                               |
                      +---------------+---------------+
                    9 |     Variable Header Area      |
                      .                               .
                      .                               .
                      |                               |
                      +---------------+---------------+

RDP Header Format

Figure 5

     Page 32
     
     RDP Specification                        RDP Segments and Formats
     
     4.2.1  RDP Header Fields
     
     Control Flags

This 8-bit field occupies the first octet of word one in the header. It is bit encoded with the following bits currently defined:

          Bit #  Bit Name   Description
          
          0      SYN        Establish connection and
                              synchronize sequence numbers.
          1      ACK        Acknowledge field significant.
          2      EACK       Non-cumulative (Extended) acknowledgement.
          3      RST        Reset the connection.
          4      NUL        This is a null (zero data length) segment.
          5                 Unused.
          
          Note that the SYN and RST are sent as separate segments  and
          may  not  contain  any  data.   The  ACK  may  accompany any
          message.  The NUL segment must have a zero data length,  but
          may  be  accompanied by ACK and EACK information.  The other
          control bit is currently unused and is defined to be zero.
     
     Version Number
     
          This field  occupies  bits  6-7  of  the  first  octet.   It
          contains  the  version  number  of the protocol described by
          this document.  Current value is one (1).
     
     Header Length
     
          The length of the RDP header in units  of  two  (2)  octets,
          including  this  field.   This  field allows RDP to find the
          start of the Data field, given a pointer to the head of  the
          segment.   This  field  is  8 bits in length.  For a segment
          with no variable header section,  the  header  length  field
          will have the value 9.

Source and Destination Ports

          The Source and Destination Ports are used  to  identify  the
          processes  in the two hosts that are communicating with each
          other.  The combination of the  port  identifiers  with  the
          source  and  destination  addresses  in  the  network access
          
                                                               Page 33
     
     RFC-908                                                 July 1984
     
          protocol header serves to fully qualify the  connection  and
          constitutes  the connection identifier.  This permits RDP to
          distinguish multiple connections between  two  hosts.   Each
          field  is  8 bits in length, allowing port numbers from 0 to
          255 (decimal).
     
     Data Length
     
          The length in octets of the data in this segment.  The  data
          length  does  not  include the RDP header.  This field is 16
          bits in length.
     
     Sequence Number
     
          The sequence number of this segment.  This field is 32  bits
          in length.
     
     Acknowledgement Number
     
          If the ACK bit is set in the header, this  is  the  sequence
          number  of  the segment that the sender of this segment last
          received correctly and in sequence.  Once  a  connection  is
          established  this  should  always be sent.  This field is 32
          bits in length.
     
     Checksum
     
          This field is a 32-bit checksum of the  segment  header  and
          data.    The   algorithm   description  below  includes  two
          variables,  the  checksum  accumulator  and   the   checksum
          pointer.   The  checksum  accumulator  is  an  actual 32-bit
          register in which the  checksum  is  formed.   The  checksum
          pointer   is   included  for  purposes  of  description,  to
          represent the operation of advancing through the  data  four
          octets  (32-bits) at a time.  It need not be maintained in a
          register by an implementation.
     
          1) The checksum pointer is set to zero, to correspond to the
          beginning  of  the  area  to  be  checksummed.  The checksum
          accumulator is also initialized to zero before beginning the
          computation of the checksum.
     
          2) The 32-bit memory word located at the address  referenced
          by  the  checksum  pointer  is  added  arithmetically to the
          checksum accumulator.   Any  carry  propagated  out  of  the
          checksum  accumulator is ignored.  The checksum field itself
          is replaced with zeros when  being  added  to  the  checksum
     
     Page 34
     RDP Specification                        RDP Segments and Formats

accumulator.

          3)  The  checksum  accumulator  is  rotated  left  one   bit
          position.  The checksum pointer is advanced to correspond to
          the address of the next 32-bit word in the segment.
          
          4) Steps 2 and 3 are repeated until the entire  segment  has
          been  summed.   If a segment contains a number of header and
          data octets that is not an integral multiple  of  4  octets,
          the  last  octet is padded on the right with zeros to form a
          32-bit quantity for computation purposes.
     
     Variable Header Area
     
          This area is used to transmit parameters  for  the  SYN  and
          EACK segments.
     
                                                               Page 35
     
     RFC-908                                                 July 1984
     
     4.3  SYN Segment
     
          The SYN is used to establish a  connection  and  synchronize
     sequence  numbers  between  two  hosts.   The  SYN  segment  also
     contains information to inform the remote  host  of  the  maximum
     number  of  segments  the local RDP  is willing to accept and the
     maximum segment size it can accept.  The SYN may be combined with
     an ACK in a segment but is never combined with user data.
     
     4.3.1  SYN Segment Format
     
                        0             0 0   1         1
                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                       +-+-+-+-+-+-+---+---------------+
                     0 |1|0|0|0|0|0|0 1| Header Length |
                       +-+-+-+-+-+-+---+---------------+
                     1 | Source Port   |   Dest. Port  |
                       +---------------+---------------+
                     2 |       Data  Length = 0        |
                       +---------------+---------------+
                     3 |                               |
                       +---    Sequence Number      ---+
                     4 |                               |
                       +---------------+---------------+
                     5 |                               |
                       +--- Acknowledgement Number  ---+
                     6 |                               |
                       +---------------+---------------+
                     7 |                               |
                       +---        Checksum         ---+
                     8 |                               |
                       +---------------+---------------+
                     9 | Max. # of Outstanding Segments|
                       +---------------+---------------+
                    10 |       Max. Segment Size       |
                       +-------------------------------+
                    11 |      Options Flag Field       |
                       +---------------+---------------+

SYN Segment Format

Figure 6

     Page 36
     
     RDP Specification                        RDP Segments and Formats
     
     4.3.2  SYN Segment Fields
     
     Sequence Number
     
          Contains the  initial  sequence  number  selected  for  this
          connection.
     
     Acknowledgement Number
     
          This field is valid only if the ACK flag is  set.   In  that
          case, this field will contain the sequence number of the SYN
          segment received from the other RDP.

Maximum Number of Outstanding Segments

          The maximum number of segments that should be  sent  without
          getting an acknowledgement.  This is used by the receiver as
          a means of flow control.   The  number  is  selected  during
          connection  initiation  and  may not be changed later in the
          life of the connection.
     
     Maximum Segment Size
     
          The maximum size segment in octets that  the  sender  should
          send.   It informs the sender how big the receiver's buffers
          are.  The specified size  includes  the  length  of  the  IP
          header,  RDP  header,  and  data.   It  does not include the
          network access layer's header length.
     
     Options Flag Field
     
          This field of two octets contains a  set  of  options  flags
          that  specify the set of optional functions that are desired
          for this connection.  The flags are defined as follows:
     
          Bit #   Bit Name    Description
     
          0       SDM         Sequenced delivery mode.
     
          The sequenced delivery mode flag specifies whether  delivery
          of   segments   to  the  user  is  sequenced  (delivered  in
          sequence-number  order)  or  non-sequenced   (delivered   in
          arrival order, regardless of sequence number).  A value of 0
          specifies non-sequenced delivery of segments, and a value of
          1 specifies sequenced delivery.
     
                                                               Page 37
     
     RFC-908                                                 July 1984
     
     4.4  ACK Segment
     
          The ACK segment is used to acknowledge in-sequence segments.
     It   contains   both  the  next  send  sequence  number  and  the
     acknowledgement sequence number  in  the  RDP  header.   The  ACK
     segment  may  be  sent  as  a  separate segment, but it should be
     combined with data whenever possible.  Data segments must  always
     include the ACK bit and Acknowledgement Number field.
     
     4.4.1  ACK Segment Format
     
                        0             0 0   1         1
                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                       +-+-+-+-+-+-+---+---------------+
                     0 |0|1|0|0|0|0|0 1| Header Length |
                       +-+-+-+-+-+-+---+---------------+
                     1 | Source Port   |   Dest. Port  |
                       +---------------+---------------+
                     2 |          Data  Length         |
                       +---------------+---------------+
                     3 |                               |
                       +---    Sequence Number      ---+
                     4 |                               |
                       +---------------+---------------+
                     5 |                               |
                       +--- Acknowledgement Number  ---+
                     6 |                               |
                       +---------------+---------------+
                     7 |                               |
                       +---        Checksum         ---+
                     8 |                               |
                       +---------------+---------------+
                       |                               |
                       |             Data              |
                       .                               .
                       .                               .
                       +---------------+---------------+

ACK Segment Format

Figure 7

     Page 38
     
     RDP Specification                        RDP Segments and Formats
     
     4.4.2  ACK Segment Fields
     
     Data Length
     
          A non-zero Data Length field indicates that  there  is  data
          present in the segment.
     
     Sequence Number
     
          The value of the Sequence Number field is  advanced  to  the
          next  sequence  number  only if there is data present in the
          segment.  An ACK segment without data does not use  sequence
          number space.
     
     Acknowledgement Number
     
          The  Acknowledgement  Number  field  contains  the  sequence
          number of the last segment received in sequential order.
     
                                                               Page 39
     
     RFC-908                                                 July 1984
     
     4.5  Extended ACK Segment
     
          The EACK segment is used to  acknowledge  segments  received
     out of sequence.  It contains the sequence numbers of one or more
     segments received with a correct checksum, but out  of  sequence.
     The  EACK  is  always combined with an ACK in the segment, giving
     the sequence number of the last  segment  received  in  sequence.
     The EACK segment may also include user data.
     
     4.5.1  EACK Segment Format

The EACK segment has the format shown in Figure 8.

     4.5.2  EACK Segment Fields
     
     Data Length
     
          A non-zero Data Length field indicates that  there  is  data
          present in the segment.
     
     Sequence Number
     
          The value of the Sequence Number field is  advanced  to  the
          next  sequence  number  only if there is data present in the
          segment.  An EACK segment without data does not use sequence
          number space.
     
     Acknowledgement Number
     
          The  Acknowledgement  Number  field  contains  the  sequence
          number of the last segment received in sequential order.

Sequence # Received OK

          Each entry is the sequence number  of  a  segment  that  was
          received with a correct checksum, but out of sequence.
     
     Page 40
     RDP Specification                        RDP Segments and Formats
     
                        0             0 0   1         1
                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                       +-+-+-+-+-+-+---+---------------+
                     0 |0|1|1|0|0|0|0 1| Header Length |
                       +-+-+-+-+-+-+---+---------------+
                     1 | Source Port   |   Dest. Port  |
                       +---------------+---------------+
                     2 |          Data  Length         |
                       +---------------+---------------+
                     3 |                               |
                       +---    Sequence Number      ---|
                     4 |                               |
                       +---------------+---------------+
                     5 |                               |
                       +--- Acknowledgement Number  ---+
                     6 |                               |
                       +---------------+---------------+
                     7 |                               |
                       +---        Checksum         ---+
                     8 |                               |
                       +---------------+---------------+
                     9 |                               |
                       +--- Sequence # Received OK  ---+
                    10 |                               |
                       +---------------+---------------+
                    11 |                               |
                       +--- Sequence # Received OK  ---+
                    12 |                               |
                       +---------------+---------------+
                       :               .               :
                       :               .               :
                       :               .               :
                       +---------------+---------------+
                       |                               |
                       |             Data              |
                       |                               |
                       +---------------+---------------+

EACK Segment Format

Figure 8

                                                               Page 41
     
     RFC-908                                                 July 1984
     
     4.6  RST Segment
     
          The RST segment is used to  close  or  reset  a  connection.
     Upon  receipt of an RST segment, the sender must stop sending and
     must abort any  unserviced  requests.   The  RST  is  sent  as  a
     separate segment and does not include any data.
     
     4.6.1  RST Segment Format
     
                        0             0 0   1         1
                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                       +-+-+-+-+-+-+---+---------------+
                     0 |0|0|0|1|0|0|0 1| Header Length |
                       +-+-+-+-+-+-+---+---------------+
                     1 | Source Port   |   Dest. Port  |
                       +---------------+---------------+
                     2 |       Data  Length = 0        |
                       +---------------+---------------+
                     3 |                               |
                       +---    Sequence Number      ---+
                     4 |                               |
                       +---------------+---------------+
                     5 |                               |
                       +--- Acknowledgement Number  ---+
                     6 |                               |
                       +---------------+---------------+
                     7 |                               |
                       +---        Checksum         ---+
                     8 |                               |
                       +-------------------------------+

RST Segment Format

Figure 9

     Page 42
     
     RDP Specification                        RDP Segments and Formats
     
     4.7  NUL Segment
     
          The NUL segment is used to determine if the other side of  a
     connection  is  still active.  When a NUL segment is received, an
     RDP implementation  must  acknowledge  the  segment  if  a  valid
     connection  exists  and  the segment sequence number falls within
     the acceptance window.  The segment is then discarded.   The  NUL
     may  be  combined  with an ACK in a segment but is never combined
     with user data.
     
     4.7.1  NUL segment format
     
                        0             0 0   1         1
                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                       +-+-+-+-+-+-+---+---------------+
                     0 |0|0|0|0|1|0|0 1| Header Length |
                       +-+-+-+-+-+-+---+---------------+
                     1 | Source Port   |   Dest. Port  |
                       +---------------+---------------+
                     2 |       Data  Length = 0        |
                       +---------------+---------------+
                     3 |                               |
                       +---    Sequence Number      ---+
                     4 |                               |
                       +---------------+---------------+
                     5 |                               |
                       +--- Acknowledgement Number  ---+
                     6 |                               |
                       +---------------+---------------+
                     7 |                               |
                       +---        Checksum         ---+
                     8 |                               |
                       +-------------------------------+

NUL Segment Format

Figure 10

                                                               Page 43
     
     RFC-908                                                 July 1984
     
     Page 44
     RDP Specification                           Examples of Operation

CHAPTER 5

Examples of Operation

     5.1  Connection Establishment
     
          This is an example of a connection being established between
     Host  A  and  Host  B.   Host B has done a passive Open and is in
     LISTEN state.  Host A  does  an  active  Open  to  establish  the
     connection.

Host A Host B

     Time State                                              State
     
     1.    CLOSED                                             LISTEN
     
     2.    SYN-SENT    <SEQ=100><SYN> --->
     
     3.                               <--- <SEQ=200><ACK=100><SYN,ACK>
                                                             SYN-RCVD
     
     4.    OPEN    <SEQ=101><ACK=200> --->                    OPEN
     
     5.      <SEQ=101><ACK=200><Data> --->
     
     6.                               <--- <SEQ=201><ACK=101>
     
                                                               Page 45
     
     RFC-908                                                 July 1984
     
     5.2  Simultaneous Connection Establishment
     
          This is an example  of  two  hosts  trying  to  establishing
     connections  to  each other at the same time.  Host A sends a SYN
     request to Host B at the same time Host B sends a SYN request  to
     Host A.
     
          Host A                         Host B
     
     Time State                                            State
     
     1.   CLOSED                                           CLOSED
     
     2.   SYN-SENT <SEQ=100><SYN>  --->
                                   <--- <SEQ=200><SYN>     SYN-SENT
     
     3.   SYN-RCVD                                         SYN-RCVD
        <SEQ=100><ACK=200><SYN,ACK> --->
                                   <--- <SEQ=200><ACK=100><SYN,ACK>
     
     4.   OPEN                                             OPEN
     
     Page 46
     RDP Specification                           Examples of Operation
     
     5.3  Lost Segments
     
          This is an example of what happens when a segment  is  lost.
     It  shows  how  segments  can be acknowledged out of sequence and
     that only the missing segment need be retransmitted.   Note  that
     in  this  and  the  following  examples  "EA"  stands for "Out of
     Sequence Acknowledgement."
     
     Time   Host A                           Host B
     
     1.     <SEQ=100><ACK=200><Data>  --->
     
     2.                               <--- <SEQ=201><ACK=100>
     
     3.     <SEQ=101><ACK=200><Data> (segment lost)
     5.     <SEQ=102><ACK=200><Data>  --->
     
     6.                               <--  <SEQ=201><ACK=100><EA=102>
     
     7.     <SEQ=103><ACK=200><Data>  --->
     
     8.                               <--- <SEQ=201><ACK=100>
                                             <EA=102,103>
     
     9.     <SEQ=101><ACK=200><Data>  --->
     
     10.                              <--- <SEQ=201><ACK=103>
     
     11.    <SEQ=104><ACK=200><Data>  --->
     
     12.                              <--- <SEQ=201><ACK=104>
     
                                                               Page 47
     
     RFC-908                                                 July 1984
     
     5.4  Segments Received Out of Order
     
          This an example of  segments  received  out  of  order.   It
     further  illustrates  the  use  of  acknowledging segments out of
     order to prevent needless retransmissions.
     
     Time     Host A                           Host B
     
     1.   <SEQ=100><ACK=200><Data>  --->
     
     2.                             <--- <SEQ=201><ACK=100>
     
     3.   <SEQ=101><ACK=200><Data> (delayed)
     5.   <SEQ=102><ACK=200><Data>  --->
     
     6.                             <--- <SEQ=201><ACK=100><EA=102>
     
     7.   <SEQ=103><ACK=200><Data>  --->
                                   ---> (delayed segment 101 arrives)
     
     8.                             <--- <SEQ=201><ACK=103>
     
     9.   <SEQ=104><ACK=200><Data>  --->
     
     10.                            <--- <SEQ=201><ACK=104>
     
     Page 48
     RDP Specification                           Examples of Operation
     
     5.5  Communication Over Long Delay Path
     
          This is an example of a data  transfer  over  a  long  delay
     path.   In  this  example, Host A is permitted to have as many as
     five unacknowledged segments.  The example shows that it  is  not
     necessary  to  wait  for  an  acknowledgement  in  order  to send
     additional data.
     
     Time        Host A                     Host B
     
     1.   <SEQ=100><ACK=200><Data> -1->
     2.   <SEQ=101><ACK=200><Data> -2->
     3.   <SEQ=102><ACK=200><Data> -3->
                                   -1-> (received)
     4.                           <-4-  <SEQ=201><ACK=100>
     5.   <SEQ=103><ACK=200><Data> -5->
                                   -2-> (received)
     6.                           <-6-  <SEQ=201><ACK=101>
     7.   <SEQ=104><ACK=200><Data> -7->
                                   -3-> (received)
     8.                           <-8-  <SEQ=201><ACK=102>
                       (received) <-4-
     9.   <SEQ=105><ACK=200><Data> -9->
                                   -5-> (received)
     10.                          <-10- <SEQ=201><ACK=103>
                       (received) <-6-
     11.  <SEQ=106><ACK=200><Data> -11->
                                   -7-> (received)
     12.                          <-12- <SEQ=201><ACK=104>
                       (received) <-8-
     13.                           -9-> (received)
     14.                          <-13- <SEQ=201><ACK=105>
                       (received) <-10-
     15.                           -11-> (received)
     16.                          <-14- <SEQ=201><ACK=106>
                       (received) <-12-
     17.               (received) <-13-
     18.               (received) <-14-
     
                                                               Page 49
     
     RFC-908                                                 July 1984
     
     5.6  Communication Over Long Delay Path With Lost Segments
     
          This is an example of communication over a long  delay  path
     with a lost segment.  It shows that by acknowledging segments out
     of sequence, only the lost segment need be retransmitted.
     
     Time       Host A                     Host B
     
     1. <SEQ=100><ACK=200><Data>  -1->
     2. <SEQ=101><ACK=200><Data>  -2->
     3. <SEQ=102><ACK=200><Data>  -3->
                                  -1-> (received)
     4.                          <-4-  <SEQ=201><ACK=100>
     5. <SEQ=103><ACK=200><Data> (segment lost)
                                  -2-> (received)
     6.                          <-5-  <SEQ=201><ACK=101>
     7. <SEQ=104><ACK=200><Data>  -6->
                                  -3-> (received)
     8.                          <-7-  <SEQ=201><ACK=102>
                      (received) <-4-
     9. <SEQ=105><ACK=200><Data>  -8->
     10.
                      (received) <-5-
     11. <SEQ=106><ACK=200><Data> -10->
                                  -6-> (received)
     12.                         <-11- <SEQ=201><ACK=102><EA=104>
                      (received) <-7-
                                  -8-> (received)
     13.                         <-12- <SEQ=201><ACK=102><EA=104,105>
                                  -10-> (received)
     14.                         <-13- <SEQ=201><ACK=102><EA=104-106>
                      (received) <-11-
     15. <SEQ=103><ACK=200><Data> -14->
                      (received) <-12-
     16.              (received) <-13-
                                  -14-> (received)
     17.                         <-15- <SEQ=201><ACK=106>
     18.
     19.              (received) <-15-
     
     Page 50
     RDP Specification                           Examples of Operation
     
     5.7  Detecting a Half-Open Connection on Crash Recovery
     
          This  is  an  example  of  a  host  detecting  a   half-open
     connection  due  to the crash and subsequent restart of the host.
     In this example, Host A crashes during a  communication  session,
     then  recovers  and  tries  to reopen the connection.  During the
     reopen attempt, it discovers that a  half-open  connection  still
     exists and it then resets the other side.  Both sides were in the
     OPEN state prior to the crash.
     
        Host A                                  Host B
     
     Time
     
     1.  OPEN                                     OPEN
        (crash!)               <--- <SEQ=200><ACK=100><ACK>
     
     2.  CLOSED                                   OPEN
        (recover)
     
     3.  SYN-SENT                                 OPEN
                 <SEQ=400><SYN> --->             (?)
     
     4.  SYN-SENT                                 OPEN
          (!)                  <--- <SEQ=200><ACK=100><ACK>
     
     5.  SYN-SENT                                 OPEN
                 <SEQ=101><RST> --->             (abort)
     
     6.  SYN-SENT                                 CLOSED
     
     7.  SYN-SENT <SEQ=400><SYN> --->
     
                                                               Page 51
     
     RFC-908                                                 July 1984
     
     5.8  Detecting a Half-Open Connection from the Active Side
     
          This is another example of detecting a half-open  connection
     due  to the crash and restart of a host involved in a connection.
     In this example, host A again crashes and restarts.   Host  B  is
     still  active and tries to send data to host A.  Since host A has
     no knowledge of the connection, it rejects the data with  an  RST
     segment, causing host B to reset the connection.
     
              Host A                         Host B
     
     Time
     
     1.  (crash!)                                            OPEN
     
     2.  CLOSED                <--- <SEQ=200><ACK=100><Data> OPEN
     
     3.  CLOSED  <SEQ=101><RST> --->                         (abort)
     
     4.  CLOSED                                              CLOSED
     
     Page 52
     RDP Specification                           Examples of Operation

APPENDIX A

Implementing a Minimal RDP

          It  is  not  necessary   to   implement   the   entire   RDP
     specification  to  be  able  to use RDP.  For simple applications
     such as a loader, where  size  of  the  protocol  module  may  be
     important,  a  subset  of  RDP  may  be  used.   For  example, an
     implementation of  RDP  for  loading  may  employ  the  following
     restrictions:
     
     o    Only one connection  and  connection  record  is  supported.
          This is the connection used to load the device.
     
     o    A single, well-known  port  is  used  as  the  loader  port.
          Allocable ports are not implemented.
     
     o    Only the passive Open request is implemented.  Active  Opens
          are not supported.
     
     o    The sequenced delivery option is  not  supported.   Messages
          arriving  out  of  order  are  delivered  in  the order they
          arrive.
     
     o    If efficiency is less  important  than  protocol  size,  the
          extended acknowledgement feature need not be supported.
     
                                                               Page 53
     
     RFC-908                                                 July 1984

INDEX

     ACK.......................................... 16, 33, 34, 38
     ACK segment format....................................... 38
     acknowledgement number field......... 16, 34, 37, 38, 39, 40
     byte-stream protocols................................. 4, 14
     checksum................................................. 16
     checksum field........................................... 34
     Close request............................................ 13
     Closed state.......................................... 9, 10
     CLOSEWAIT................................................ 12
     Close-Wait state................................. 10, 11, 13
     CLOSE-WAIT timeouts...................................... 29
     connection, closing of............................... 13, 42
     connection, establishment of...................... 8, 11, 45
     connection identifier................................. 7, 33
     connection management..................................... 7
     connection record..................................... 9, 11
     connection state diagram................................. 10
     connection states......................................... 8
     control flags field...................................... 33
     cumulative acknowledgement............................... 16
     data communication....................................... 14
     data length field................................ 34, 39, 40
     datagrams................................................. 6
     debugging.............................................. 1, 3
     dumping................................................... 3
     EACK......................................... 16, 33, 35, 40
     EACK segment format...................................... 40
     event processing......................................... 20
     extended acknowledgement................................. 16
     flow control............................................. 17
     half-open connection, detection of............... 14, 51, 52
     initial sequence number....................... 9, 11, 12, 15
     internet protocols........................................ 5
     IP................................................ 6, 15, 31
     IP header............................................ 31, 37
     Listen state................................... 8, 9, 10, 45
     loading................................................ 1, 3
     maximum segment size..................... 11, 12, 13, 15, 37
     maximum unacknowledged segments.............. 11, 12, 17, 37
     message fragmentation.................................... 14
     non-cumulative acknowledgement........................... 16
     
     Page 54
     RDP Specification                           Examples of Operation
     
     NUL.................................................. 33, 43
     NUL segment format....................................... 43
     Open request.......................................... 8, 17
     Open request, active................................... 8, 9
     Open request, passive.................................. 8, 9
     Open state....................................... 10, 11, 45
     options flag field....................................... 37
     out-of-sequence acknowledgement.................. 12, 16, 18
     ports................................................. 7, 33
     ports, well-known......................................... 8
     positive acknowledgement............................. 15, 16
     RBUF.MAX................................................. 13
     RCV.CUR.................................................. 12
     RCVDSEQNO................................................ 12
     RCV.IRS.................................................. 12
     RCV.MAX.................................................. 12
     RDP connection........................................... 14
     RDP header................................... 14, 16, 32, 37
     RDP header length........................................ 33
     RDP segment format....................................... 31
     reliable communication................................... 15
     retransmission of segments....................... 15, 16, 17
     retransmission timeout............................... 17, 29
     RST.................................................. 33, 42
     RST segment.......................................... 13, 52
     RST segment format....................................... 42
     SBUF.MAX................................................. 12
     SDM...................................................... 37
     SEG.ACK.................................................. 13
     SEG.BMAX................................................. 13
     SEG.MAX.................................................. 13
     segment arrival events............................... 20, 24
     segments................................................. 14
     SEG.SEQ.................................................. 13
     Send request......................................... 14, 15
     sequence number...................................... 12, 15
     sequence number acceptance window........................ 18
     sequence number field........................ 34, 37, 39, 40
     sequenced delivery................................. 3, 4, 37
     sequential acknowledgement................................ 4
     SND.ISS.................................................. 12
     SND.MAX.................................................. 12
     SND.NXT.................................................. 11
     SND.UNA.................................................. 12
     STATE.................................................... 11
     SYN.................................. 12, 13, 15, 33, 35, 36
     SYN segment........................................... 9, 36
     
                                                               Page 55
     
     RFC-908                                                 July 1984
     
     Syn-Rcvd state........................................ 9, 10
     Syn-Sent state........................................ 9, 10
     TCP................................................... 4, 14
     three-way handshake....................................... 4
     user request events.................................. 20, 21
     version number field..................................... 33
     
     Page 56
     RDP Specification                           Examples of Operation
     
                                                               Page 57