latest news: Sept 20: more domain blacklists have been added
rfc908 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.
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
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:
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.
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.
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