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)

    4.

    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)

    4.

    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