RFC908

From RFC-Wiki



                      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>
       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> --->
 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>  --->
 2.                               <--- <SEQ=201><ACK=100>
 3.     <SEQ=101><ACK=200> (segment lost)
 4.
 5.     <SEQ=102><ACK=200>  --->
 6.                               <--  <SEQ=201><ACK=100><EA=102>
 7.     <SEQ=103><ACK=200>  --->
 8.                               <--- <SEQ=201><ACK=100>
                                         <EA=102,103>
 9.     <SEQ=101><ACK=200>  --->
 10.                              <--- <SEQ=201><ACK=103>
 11.    <SEQ=104><ACK=200>  --->
 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>  --->
 2.                             <--- <SEQ=201><ACK=100>
 3.   <SEQ=101><ACK=200> (delayed)
 4.
 5.   <SEQ=102><ACK=200>  --->
 6.                             <--- <SEQ=201><ACK=100><EA=102>
 7.   <SEQ=103><ACK=200>  --->
                               ---> (delayed segment 101 arrives)
 8.                             <--- <SEQ=201><ACK=103>
 9.   <SEQ=104><ACK=200>  --->
 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> -1->
 2.   <SEQ=101><ACK=200> -2->
 3.   <SEQ=102><ACK=200> -3->
                               -1-> (received)
 4.                           <-4-  <SEQ=201><ACK=100>
 5.   <SEQ=103><ACK=200> -5->
                               -2-> (received)
 6.                           <-6-  <SEQ=201><ACK=101>
 7.   <SEQ=104><ACK=200> -7->
                               -3-> (received)
 8.                           <-8-  <SEQ=201><ACK=102>
                   (received) <-4-
 9.   <SEQ=105><ACK=200> -9->
                               -5-> (received)
 10.                          <-10- <SEQ=201><ACK=103>
                   (received) <-6-
 11.  <SEQ=106><ACK=200> -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>  -1->
 2. <SEQ=101><ACK=200>  -2->
 3. <SEQ=102><ACK=200>  -3->
                              -1-> (received)
 4.                          <-4-  <SEQ=201><ACK=100>
 5. <SEQ=103><ACK=200> (segment lost)
                              -2-> (received)
 6.                          <-5-  <SEQ=201><ACK=101>
 7. <SEQ=104><ACK=200>  -6->
                              -3-> (received)
 8.                          <-7-  <SEQ=201><ACK=102>
                  (received) <-4-
 9. <SEQ=105><ACK=200>  -8->
 10.
                  (received) <-5-
 11. <SEQ=106><ACK=200> -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> -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> 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