RFC 54
Official Protocol Proffering
RFC 54: An Official Protocol Proffering π
Okay bestie, let's dive into RFC 54! π It's from the Network Working Group and it's Request for Comments # 54 β¨. It's titled An Official Protocol Proffering and dated June 18, 1970 πΈ. The authors are Steve Crocker (UCLA), Jon Postel (UCLA), John Newkirk (Harvard), and Mike Kraley (Harvard) π«Ά. This one doesn't list a category or any obsoletes or updates, so there's nothing else to report up top π .
I. INTRODUCTION β¨
As advertised in NEW/RFC #53, we're putting this protocol out there for criticism, comments, and all that jazz π¦. We intend for it to become the initial official protocol, so we'd be happiest if no serious objections get raised π₯Ί. Still, we'll entertain all kinds of criticism until July 13, 1970, and that criticism SHOULD be published as a NWG/RFC or sent directly to the first author π.
After July 13, a decision will be made about whether to adopt this protocol (or a slight variation) or to redesign it and resubmit it for criticism π.
Only the Protocol πΈ
Here's the tea: in earlier discussions of protocol, nobody clearly separated the network-wide specs from local strategies π« . So we're stating it clearly right here. The only network-wide issues are message formats and restrictions on message content. Implementing a Network Control Program (NCP) and choosing system calls are strictly local issues π.
This document only covers network-wide issues, so it won't touch system calls or NCP tables π. But honestly, a protocol is useless without an NCP and a set of system calls, so we put a ton of effort into a prototypical NCP π. That work is reported in NWG/RFC #55, and the reader SHOULD correlate the protocol here with the suggestions for using it over there. Just remember that the content of NWG/RFC #55 is only suggestive, and competitive proposals SHOULD be examined before you choose an implementation π.
Flow Control π
Okay, so flow control turned out to be way more complex than we imagined π. We now think flow control techniques will be one of the hot topics as network traffic grows π. We were inspired by some ideas from Richard Kaline and Anatol Holt, so we modified the flow control procedure π«Ά. (Any defects in our scheme are, of course, only our fault π.) The new procedure has demonstrable limitations, but it's more cleanly implementable and will support initial network use. It's the only substantive change from the protocol already agreed upon β¨.
The new flow control mechanism has the receiving host allocate buffer space for each connection and tell the sending host how much space, in bits, is available π§. The sending host keeps track of how much room is left and never sends more text than it believes the receiver can accept π.
Here's how the sending host does it: it keeps a counter for each connection. The counter starts at zero, goes up when control commands arrive from the receiving host, and goes down by the text length of every message sent over the connection. The sending host is prohibited from sending text longer than the counter's value, so the counter never dips below zero π.
Ideally, the receiving host allocates some buffer space as soon as the connection is established πΈ. The amount allocated MUST NOT exceed what the receiver can guarantee to accept. Incoming text fills up that allocated space. When the receiving process absorbs waiting text from the buffer, the NCP sends back a fresh allocation of space for that connection π . The NCP MAY allocate space even if the receiving process hasn't absorbed waiting text, if it thinks the extra buffer space is appropriate. Similarly, the NCP MAY decide not to reallocate buffer space after the receiving process frees it up π¦.
The control command that allocates space looks like this:
ALL <link> <space>
This command is sent only from the receiving host to the sending host π¨.
This formulation of flow control makes the RSM and SPD commands in NWG/RFC #36 obsolete, and also makes the Host-to-Imp message type 10 and the Imp-to-Host message types 10 and 11 in the current revision of BBN Report 1822 unnecessary π.
The obvious limitation here is that the receiving host isn't allowed to rely on average buffer usage, so worst case is always assumed π¬. If only a few connections are open, there probably won't be much savings. But with more than a few connections, average buffer usage will be way less than the allocated buffer space π. We've looked at extensions that would add adaptive allocation, and we think that's feasible β¨. For now this limited scheme seems best, and we're excited to talk about fancier schemes later π€©. The old scheme of special RFNM's, etc. is still under discussion π§.
To answer questions and talk through details, we'll hold a pair of network meetings π. The first is on June 29 at Harvard, and the second is on July 1 at UCLA. We request that no more than one programmer per host attend a meeting, and that hosts be represented at only one of these meetings π. J.N. and S.C. will be at both meetings π.
To make reservations for the Harvard meeting, contact:
Mrs. Margi Robison
(617) 495-3989
or 495-3991
To make reservations for the UCLA meeting, contact Mrs. Benita Kirstel at (213) 825-2368 πΈ.
II. THE PROTOCOL π¦
The idea of a connection from NWG/RFC #33 runs through this whole protocol π. A connection is a simplex communication path, meant to sit between two processes π.
The protocol's main jobs are:
- establishment of connections,
- regulation of flow over connections, and
- termination of connections.
On top of that, it has some ancillary functions, like sending simulated interrupt pulses and echoing test messages π§.
To give connection info a place to travel, we designate specific links (link one between each pair of hosts) as control links π€οΈ. Traffic on control links consists only of control commands, which we'll define below π .
Connections are named by a pair of sockets π. Sockets are 40 bit names known throughout the network. Each host gets a private subset of these names, and a command that requests a connection names one socket local to the requesting host and one local to the receiver of the request π«Ά.
Sockets are polarized: even-numbered sockets are receive sockets, and odd-numbered ones are send sockets. One of each is REQUIRED to make a connection π.
Each connection also gets its own unique link for moving information. So one step in establishing a connection is assigning a link π. Of the non-control links, zero is reserved for intra-network use, and links 32 to 255 are reserved for experiment and expansion. That leaves only links 2 through 31 for regular use β¨. Link assignment MUST either always be done by the receiver or always by the sender. We've (almost) arbitrarily chosen the receiver to handle it π.
All regular messages have a 32 bit leader, marking, text, and padding π¦. Marking is a (possibly null) run of zeroes followed by a 1. Padding is a 1 followed by a (possibly null) run of zeroes π’.
A regular message sent over the control link (link 1) is called a control message π¨. Its text is an integral (possibly zero) number of control commands in the form described below, and this text MUST end on a command boundary π§±.
The commands used to set up a connection are STR and RTS π«. The STR command goes from a prospective sender to a prospective receiver. Its <my socket> field holds a send socket local to the prospective sender, and its <your socket> field holds a receive socket local to the prospective receiver π¦. The RTS command is the mirror image, but it also has a <link> field for link assignment πͺ. Together these are called requests-for-connection (RFC). A STR and an RTS match if the <my socket> field of one is identical to the <your socket> field of the other, and vice versa π. A connection is established once a matching pair of RFC's has been exchanged π.
Hosts are prohibited from making more than one connection to any local socket π«. So a host can't use a socket in the <my socket> field of an RFC if that socket was already mentioned in a previous RFC and that connection isn't terminated yet π
.
The command for ending a connection is CLS π. Each side MUST send and receive a CLS command before the connection is fully terminated and its sockets are free to join other connections π
. Both RFC's don't have to be exchanged before a connection can be terminated πΈ. More termination details come later π.
Once a connection is established, the receiving host sends an ALL command to allocate space for the connection β¨. The sender keeps track of how much space the receiving host has available, and it doesn't send more text than the receiver can accept, as explained above π«Ά. The sender is also limited by its local IMP: it can't send a message over a connection until the RFNM for the previous message comes back π¦.
After a connection is established, CLS commands from the receiver and from the sender have slightly different effects π. A CLS sent by the sender means no more messages will be sent over the connection. This command MUST NOT be sent if a message is still in transit over the connection π.
A CLS sent by the receiver acts as a demand that the sender stop transmitting π£. But since there's a delay in getting that CLS to the sender, the receiver MUST expect its buffers to fill up to the limit given in ALL commands πͺ£.
While a connection is established, either side MAY send INR or INS commands. What these commands do is a local matter, but in general they'll provide an escape function πͺ.
Note that the ALL, INR, and INS commands MAY be sent only after the connection is established and before a CLS command is sent β°.
There's a very simple test facility with the ECO and ERP commands π§ͺ. When a host receives an ECO command, it MUST change the first eight bits to ERP and send it back π. These commands have nothing to do with connections π
ββοΈ.
The NOP command is included for convenience. It's coded as zero to make command messages easier to build π§©.
Last but not least, the ERR command lets a foreign host know it has (apparently) made an error π¨. Right now no specific list of errors is defined, and no action is defined for receiving ERR commands π€·ββοΈ. Hosts SHOULD log ERR commands when they receive them, so system programmers can diagnose the trouble π. A host MAY generate an ERR command at any time and for any reason π«. It's advised that each host publish an exhaustive list of the ERR commands it may send, along with their interpretations π.
NETWORK CONTROL COMMANDS π
Here's a detailed description of the structure and format of each control command π.
To make socket descriptions clearer, we've adopted these conventions π:
<my socket> and <your socket> are used in the command descriptions. <my socket> is local to the originator of the command. <your socket> is local to the receiver of the command π«Ά.
CONTROL COMMAND FORMATS π
okay bestie, here are the control command shapes, and yes they're giving very minimalist π
No Operation
_______
| |
| NOP |
|_______|
Request Connection, Receiver to Sender
______________________________________________
| | | | |
| RTS | my socket | your socket | link |
|_______|_____________|_______________|________|
Request Connection, Sender to Receiver
_____________________________________
| | | |
| STR | my socket | your socket |
|_______|_____________|_______________|
Close
_____________________________________
| | | |
| CLS | my socket | your socket |
|_______|_____________|_______________|
Allocate
__________________________
| | | |
| ALL | link | space |
|_______|________|_________|
Interrupt Sent by Receiving Process
_______________
| | |
| INR | link |
|______|________|
Interrupt Sent by Sending Process
_______________
| | |
| INS | link |
|______|________|
Echo Request
____________________________ _________
| | \ \ |
| ECO | length / / text |
|_______|____________________\ \________|
Echo Reply
____________________________ _________
| | \ \ |
| ERP | length / / text |
|_______|____________________\ \________|
Error Detected
____________________________ _________
| | \ \ |
| ERR | length / / text |
|_______|____________________\ \________|
Okay so the host is specified in the leader β¨ The <link> field is 8 bits, and <space> is 32 bits long and is an unsigned integer π₯ <length> is an unsigned 16 bit integer. <text> is as long as the length, which means the whole command is 24 bits longer than the length. The maximum length is one message, and that's on purpose, so command decoding and manipulation stays easy π§
All control command codes are 8 bits long:
NOP = 0
RTS = 1
STR = 2
CLS = 3
ALL = 4
INR = 5
INS = 6
ECO = 7
ERP = 8
ERR = 9
<my socket> and <your socket> are 32 bits long each π
_______________________
| | |
| User number | AEN |
|_______________|_______|
That's 24 bits for the user number and 8 bits for AEN. iykyk π
III. Conclusion π
Extensions to the Protocol
Some issues haven't been properly handled in the current protocol yet π We have a few topics in mind that we want to think through more carefully, and maybe try out in practice.
- More Sophisticated Flow Control. Other flow control schemes are still being considered π Apart from the fact that we need some form of it, we're honestly not sure what the real problem is. It could turn out the present scheme is totally fine, or it could turn out we need something way more complex.
- Error Detection and Recovery. As we get more experience with the network, we'll understand better what errors can happen and, even more importantly, what to do about them π₯ We expect the protocol to change as our understanding of error control grows.
- Start Up and Shut Down Procedures. We haven't thought hard enough about a host that only joins the network part-time, one that stops normal network operation but stays on for special purposes, or one that recovers from a system failure π These issues are critical for robust network operation and are possibly our highest priority.
- Query and Response. A host-to-host status test would be a super valuable tool, but it isn't clear yet what's appropriate to provide π
Coming onto the Network
We suggest hosts come onto the network gingerly π§Έ First, each host should thoroughly exercise connections to itself. Then it should set up experiments with some other host that's already functioning. Finally, it can start exercising the facilities of other hosts. It isn't clear right now which host will be in the best position to help other hosts first, but UCLA will attempt to serve this function π«Ά
Private Networking
A common move is to use the IMP to connect several local computers, where one or more of them isn't available to the whole network. For example, Harvard is connecting its PDP-1 to its PDP-10 via an IMP. Lincoln Laboratories is connecting its TSP to the 360/67 and the TX2 via an IMP. And UCLA is doing something similar, connecting an XDS 920 to its Sigma-7 β¨ In each of these cases, the small machine won't initially provide services to the network.
Even though there should be no unwanted traffic going to any of these extra hosts, it's still desirable that they conform minimally to the network protocol π As long as they never initiate a connection or send out spurious control commands, it's enough for a host to respond to CLS commands with acknowledging CLS commands, and to respond to ECO commands with ERP commands π¦
Acknowledgments π«Ά
The work presented above is only a small part of the concurrent effort πΈ Most of the related effort will be reported in immediately forthcoming RFCs. A bunch of people gave us extremely valuable help over the last two weeks, and we're especially grateful to Professor George Mealy of Harvard for supporting four of his students to come westward and work on the network. Thank you to Robert Uzgalis for making access to CCN at UCLA easier, and to the secretarial staff of the Computer Science Division of the University of Utah, especially Peggy Tueller and Marcella Sanchez, for excellent help preparing these documents π
[ This RFC was put into machine readable form for entry ] [ into the online RFC archives by Eitetsu Baumgardner 3/97 ]
π¦ where this page comes from
- ietf: rfc54 1970-06
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms