Thoughts and Reflections on NWG/RFC 54
Harvard proposes typed error codes, a separate overflow command and a reset handshake for crashed hosts.
Kraley, M. and J. Newkirk, "Thoughts and Reflections on NWG/RFC 54", RFC 57, DOI 10.17487/RFC0057, June 1970, <https://www.rfc-editor.org/info/rfc57>.
@misc{rfc57,
series = {Request for Comments},
number = 57,
howpublished = {RFC 57},
publisher = {RFC Editor},
doi = {10.17487/RFC0057},
url = {https://www.rfc-editor.org/info/rfc57},
author = {M. Kraley and J. Newkirk},
title = {{Thoughts and Reflections on NWG/RFC 54}},
pagetotal = 5,
year = 1970,
month = jun,
} RFC text
Contents
Network Working Group Mike Kraley (Harvard)
Request for Comments #57 John Newkirk (Harvard)
June 19, 1970
Thoughts and Reflections on NWG/RFC #54
In the course of writing NWG/RFC #54 several new ideas became
apparent. Since these ideas had not previously been discussed by the
NWG, or were sufficiently imprecise, it was decided not to include them
in the official protocol proffering. We thought, however, that they
might be proper subjects for discussion and later inclusion in the
second level protocol.
I. Errors and Overflow
In line with the discussion in NWG/RFC #48, we felt that two
types of errors should be distinguished. One is a real error, such as
an RFC composed of two send sockets. This type of error can only be
generated by a broken NCP. In the absence of hardware and software
bugs, these events should never occur; the correct response upon
detection of such an event was outlined in the description of the ERR
command in NWG/RFC #54.
The other "error" is an overflow condition arising because
finite system resources are exhausted. An overflow condition could
occur if an RFC was received, but there was no room to create the
requisite tables and queues. This is not a real error, in the sense
that no one has done anything incorrect (expect perhaps the system
planners in not providing sufficient table space, etc.) Further, a
recovery procedure can be well defined, and simply entails repeating the
request at a future time. Thus, we believe an overflow condition should
be distinguished from a real error.
In NWG/RFC #54 an overflow condition was reported by returning
a CLS, as if the connection had been refused. This sequence performs
the necessary functions, and leaves the connection in the correct state,
but the initiating user is misinformed. He is deluded into thinking
that he was refused by the foreign process, when, in fact, this was not
the case. In certain algorithms this difference is crucial.
In further defining error conditions, we felt that it would
be helpful to specify why the error was detected, in addition to
specifying what caused the error. While writing the pseudo-Algol
program mentioned in NWG/RFC #55 we differentiated 9 types of errors
(listed below). We would, therefore, like to propose the extension of
the ERR message to include an 8-bit field following the op code to
designate the type of error. This would be followed by the length and
text fields, as before. We propose these error types;
0. UNSPECIFIED ERROR
1. HOMOSEX (invalid send/rcv pair in an RFC)
2. ILLEGAL OP CODE
3. ILLEGAL LEADER (bad message type, etc.)
4. ILLEGAL COMMAND SEQUENCE
5. ILLEGAL SOCKET SPECIFICATION - COMMAND
6. ILLEGAL COMMAND LENGTH (last command in message was too short)
7. CONNECTION NOT OPEN - DATA
8. DATA OVERFLOW (message longer than advertised available
buffer space)
9. ILLEGAL SOCKET SPECIFICATION - DATA (socket does not exist)
In light of the other considerations mentioned earlier, we
would also like to propose an additional control command to singify
overflow:
+-------------+-------------------+---------------------+
| OVF | my socket | your socket |
+-------------+-------------------+---------------------+
The format of the message is similar to that of the CLS message, which
it replaces in this context. The socket numbers are 32 bits long and
correspond to the socket numbers in the RFC which is being rejected.
The semantics of an incoming OVF should be indentical to an incoming
CLS; in addition, the user should be informed that he has not been
refused but rather has overtaxed the foreign host's resources.
An alternative to creating a separate control command can be
realized by considering the similarity between a CLS and an OVF.
Conceivably, an eight-bit field could be added to the CLS command to
define its derivation. We believe, however, that this alternative is
conceptually inferior and practically more difficult to implement.
Overflow does not require serious consideration if it is a
significantly rare occurrence. We do not believe this will be the case,
and we further believe that its absence will be an unnecessary
restriction upon the user.
II. Host Up and Host Down
Significant problems can arise when a host goes down and then
attempts to restart. Two cases can easily be distinguished. The first
is a "soft" crash, where the system has prior notice that the machine is
going down; sufficient time is available to execute pre-recovery
procedures. The other case can be termed a "hard" crash, often the
result of a system failure. Insignificant warning is usually given; but
more important, the state of the machine after recovery is rarely
predictable.
When a host returns from a hard crash, the network will be
in an undefined state. Very probably the NCP's data structures are
destroyed or are meaningless. The network has declared the host dead --
but only to processes which attempted data transmission and were
refused. The only alternative for the crashed host is re-initialization
of its tables. What are the alternatives for the foreign hosts?
We would like to propose the addition of two control commands:
RESET (RST) and RESET REPLY (RSR). Each would consist solely of an op
code with no parameters. Upon receipt of an RST, a host would
immediately terminate all connections with the sending host, but would
not issue any CLS's. The receiver of the RST would also note that the
originator of the RST was alive, and would then echo an RSR to the
sender. When a host receives an RSR, he sould then note that the
echoing host is alive. (The function of RST can be partially simulated
if a host will immediately close all relevant table entries upon
discovering that another host is down.)
Thus, after a hard crash, all connections and request for
connections are terminated. The RST also informs all foreign hosts that
we are again alive, and an RSR is received from every functioning NCP.
A host live table (see NWG/RFC #55) can easily be
assembled, and establishment of connections can resume.
Related problems also crop up when we consider attempting
to synchronize the network, which may still be carrying messages
generated prior to the crash, with an NCP which has an initialized
environment. We lack the facilities for unblocking links, discarding
messages, etc. -- facilities which this proposal will necessitate.
Further interaction with BBN should resolve these difficulties.
The problems associated with "soft" crashes are not nearly
as pressing, and they demand more sophisticated (i.e., complex)
solutions. Our preliminary experimentation with the network
demonstrates that a good initialization and recovery protocol are far
more necessary.
Many of the ideas presented herin wre germinated and/or
jelled through conversations with Steve Crocker and Jon Postel. We
would also like to acknowledge the assistance of Jim Balter and Charles
Kline of UCLA, who devoted a great deal of effort toward helping develop
the pseudo-Algol program which was the predecessor of much of our recent
documentation.
[ This RFC was put into machine readable form for entry ]
[ into the online RFC archives by Katsunori Tanaka 2/98 ]
AI ELI5
On this page
§1Ideas Left Out of RFC 54
Mike Kraley and John Newkirk of Harvard wrote this on June 19, 1970. While writing RFC 54 several new ideas appeared that had not been discussed or were too imprecise, so they were not put in the official protocol. They are offered here as subjects for discussion and for later inclusion in the second level protocol.
There are two groups of ideas: errors and overflow, and what to do when a host goes down and comes back.
While writing the official rules, the authors had extra ideas that were not ready, so they put them in a separate note to talk about.
§2Errors Versus Overflow
Following the discussion in RFC 48, the authors want two kinds of error kept apart. A real error, such as a request for connection made of two send sockets, can only come from a broken NCP. An overflow happens when finite resources run out, for example when there is no room to create tables and queues for an incoming request. Nobody did anything incorrect, and recovery just means repeating the request later.
RFC 54 reported overflow by returning a CLS, as if the connection were refused. The initiating user is then misinformed, which matters in some algorithms. They propose a new control command, OVF, carrying my socket and your socket (32-bit socket numbers matching the rejected request). An incoming OVF acts like an incoming CLS, and the user is also told that the foreign host's resources were overtaxed, not that he was refused. They considered adding an 8-bit field to CLS instead but judged that conceptually inferior and harder to implement.
They also propose extending the ERR message with an 8-bit field after the op code naming the type of error, followed by the length and text fields as before.
'You did it wrong' and 'I am too full right now' are different messages, so they should have different names.
- 0UNSPECIFIED ERROR — No more specific type applies.
- 1Invalid send/rcv pair — Invalid send/receive pair in an RFC.
- 2ILLEGAL OP CODE — The op code is not valid.
- 3ILLEGAL LEADER — Bad message type, etc.
- 4ILLEGAL COMMAND SEQUENCE — Command arrived in the wrong order.
- 5ILLEGAL SOCKET SPECIFICATION - COMMAND — Bad socket in a command.
- 6ILLEGAL COMMAND LENGTH — Last command in message was too short.
- 7CONNECTION NOT OPEN - DATA — Data arrived on a connection that is not open.
- 8DATA OVERFLOW — Message longer than advertised available buffer space.
- 9ILLEGAL SOCKET SPECIFICATION - DATA — Socket does not exist.
§3Host Up and Host Down
A soft crash comes with prior notice, so there is time for pre-recovery steps. A hard crash gives little warning, and the machine's state after recovery is rarely predictable. After a hard crash the NCP's data structures are probably destroyed, and the network has declared the host dead only to processes that tried to send data and were refused.
The authors propose two control commands, RESET (RST) and RESET REPLY (RSR), each just an op code with no parameters. On receiving an RST, a host immediately terminates all connections with the sender without sending any CLS, notes that the sender is alive, and echoes an RSR. On receiving an RSR, a host notes that the echoing host is alive. A host live table, as described in RFC 55, can then be assembled and connections can resume.
They note an open problem: the network may still carry messages sent before the crash, and the facilities for unblocking links or discarding messages do not exist yet, so more work with BBN is needed. Soft crashes need more complex solutions, and the authors say a good initialization and recovery protocol is far more necessary.
When a computer wakes up after a crash, it shouts 'reset!', everyone forgets their old chats with it, and each answers 'I am here', so the chats can start fresh.
§4Nine Proposed Error Types
While writing the pseudo-Algol program mentioned in RFC 55, the authors distinguished nine error types, plus an unspecified one numbered 0. The list appears in the table after the Errors Versus Overflow section.
The note ends by thanking Steve Crocker and Jon Postel for conversations, and Jim Balter and Charles Kline of UCLA for help with the pseudo-Algol program.
They made a numbered list of the kinds of mistakes a program can notice, so a message can say exactly which one happened.