RFC 908 - Reliable Data Protocol

[フレーム]

 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

AltStyle によって変換されたページ (->オリジナル) /