Network Working Group K. Pogran (MIT-Multics)
Request for Comments: 614 N. Neigus (BBN-NET)
NIC #21530 Jan 1974
References: RFC#607, RFC#542
Response to RFC607, "Comments on the File Transfer Protocol"
Mark Krilanovich and George Gregg have pointed out a number of "sticky"
issues in the current File Transfer Protocol. Although we don't agree
with all of their proposed protocol modifications, we do feel that each
of the points they have raised should be given some thought by everyone
concerned about FTP. Each numbered paragraph in the discussion below is a
comment on the identically-numbered paragraph in RFC607.
1. InstrUCtions to the Server to be "passive" are defined to apply only
to the next single file transfer operation, after which the Server
reverts to active mode. RFC607 does, however, point out a drawback in
the present specification, in that there is no way for a user to "change
his mind": once he has told a server to be "passive", he has to initiate
some file transfer operation. The suggested solution is a welcome one. We
suggest that the text of the "successful reply" to the ACTV command
indicate whether the server had previously been in "active" or "passive"
mode, viz:
200 MODE CHANGED TO ACTIVE
or
200 MODE IS ALREADY ACTIVE
It is important to note that once some servers "listen" on a connection
in response to a PASV command, they no longer can examine the Telnet
control connection for the possible arrival of an ACTV command. User-FTP
programs should precede the ACTV command with a SYNC sequence to ensure
that the server will see the ACTV command.
2. While the length of an FTP command -- either three or four characters
-- might often be irrelevant to a system which interacts over Telnet
connections on a line-at-a-time basis, we can see how a variable command
length might be harder for a character-at-a-time system to handle,
especially for a server implemented in assembly language. Quite a bit is
gained, and nothing seems to be lost, by requiring that FTP commands be
four characters, so we agree with the suggestion in RFC607.
3. While the FTP document may be somewhat ambiguous in its specification
of the order of the handshaking which takes place following a file
transfer command, such an order does exist as far as is possible for the
two asynchronous processes described in "The FTP Model" (section II. B of
RFC542) -- the Telnet Control process (Protocol Interpreter) and the
Data Transfer process. The user is required to "listen" on the data
connection before sending the transfer command. Upon receipt of the
command the server should first check that the status of the file
specified by the argument to the file transfer command is okay, and, if
so, attempt to open the data connection. If there are file system
problems, no attempt should be made to open the connection. In this way,
-1-
the primary response to the command gives an accurate picture of the
transfer status -- i. e., connection opened and transfer started (250),
or connection not opened because of file problems (450, 451, 455, 457) or
connection problems (454). The secondary reply follows the conclusion of
the transfer, and describes its success or failure.
If a particular FTP implementation cannot monitor the data connection and
the Telnet control connection simultaneously, then it must establish a
timeout waiting for the data connection RFC. In addition, a minimum
interval should be specified for which all servers must wait before
deciding that the data connection cannot be opened. We suggest that this
interval be no shorter than fifteen seconds.
4. The protocol states that servers should return "success", replies to
commands such as ACCT and ALLO which were irrelevant to them. We
recommend that the protocol say "must" rather than "should".
5. Specification of maximum lengths for lines, pathnames, etc. is a fine
idea, as is the suggestion of a Server poll. Typical values for the
present Multics implementation (provided by Ken Pogran) are as follows:
Telnet lines: 256
User names: 32
PassWords: 8
Account Numbers: (na)
Pathnames: 168 (yes, 168)
6. We strongly disagree with Mark on this point. The algorithm a user-FTP
should use goes something like this:
a. Examine the first four characters of the reply.
b. If the fourth character is a space, the reply is not a multi-line reply.
c. If the fourth character is a hyphen, the reply is a multi-line reply,
and the text portion of this line and succeeding lines should be reported
to the user if this is desired.
d. On each succeeding line, if the first four characters are not the
three digits of the original reply code followed by a space, the line is
entirely a text line and should either be reported to the user or
discarded.
e. If the first four characters on the line are the three digits of the
reply code followed by space, this line is the last line of the reply.
This algorithm seems simple enough, if nesting of replies is not required
(see comments on paragraph 7, below). This sort of continuation-line
convention provides a number of benefits to the person coding a server.
Consider the problem of providing a Directory listing, in response to a
STAT command whose argument is the pathname of a directory. If the FTP
Telnet control connection is treated as a pseudo-typewriter (as most
ordinary Telnet connections are), the writer of an FTP Server may be able
to "borrow" the code from the system command which provides directory
status (listing) information, as follows (in a pseudo-PL/l syntax):
call write_out_line ("151- Directory listing follows") ;
call list_directory_contents (directory_pathname);
call write_out_line ("151 Directory listing complete");
-2-
The same can be done for the file status reply (code 150). Otherwise, a
program must be written which performs the function of the
directory-listing command, but uses a special output format. If the
implementor of an FTP Server wants to be "nice" and list file attributes,
as well as file names, in the directory listing (as many
directory-listing commands do), this could be a fairly big job. If
already-written software can be borrowed and incorporated into the FTP
Server, the implementor of the FTP Server can put more of his effort into
doing a better job of building the "guts" of the FTP Server.
7. It is not obvious why multi-line replies are allowed to be nested to
an arbitrary depth. Only truly spontaneous replies may nest inside other
replies -- and it is easy to convince yourself that they will only nest
to depth one. It was envisioned that some messages from "the system"
might not allow the "exterior" multi-line message to finish; the scenario
might go something like this:.
151- Directory listing follows:
a1pha.p11
alpha
rfc.runoff
mailbox
010- From Operator:
010 Emergency shutdown in 5 mins. due to hardware probs.
beta.fortran
foo.lisp
151 Directory listing complete.
It has been pointed out to us that:
a. Messages from "the system" in general cannot be guaranteed to come at
the beginning of a line.
b. It may be difficult to modify "the system" to preface such messages
with an appropriate FTP reply code.
Therefore, we propose that, since user-FTP implementations must handle
multi-line replies, system messages "splattered" into the middle of
replies need not be escorted by FTP reply codes. The user-FTP thus need
not detect and handle "nested" FTP replies.
8. RFC607 proposes that any data between the last end-of-record marker
of a file and the end-of-file marker be discarded. We agree. The sender
of the data has clearly violated the protocol, and the receiver cannot
divine the sender's original intent.
9-11. The suggestion that reply codes beginning with the digit "2" be
taken as successful, and all others be taken as failures, severely
restricts use of the available "reply code space". We agree that the
present scheme is disorganized and requires far too much "intelligence"
on the part of a user-ftp automaton. With the present scheme, unless the
automaton's reply-interpretation is table-driven, it is extremely likely
to make a mistake. We feel that the whole reply code strategy should be
redesigned; some of the ideas proposed in RFC607 could fit in with such
a redesign, but we do not think that Mark's suggestion is the way to go.
-3-
12. 000 and 020 are used by the Server to indicate that it has heard and
answered the ICP to socket 3, but cannot accept file transfer commands
yet. 020 was intended to indicate how much of a time delay could be
eXPected, while 000 was ambiguous on this point. We suggest that the two
be merged to mean "I am here; please wait a specified or unspecified
amount of time"; then, 300 would clearly mean "I am ready; you may now
send me commands".
13. There is no typographical error here. A TENEX representative
suggested that, rather than give a "fail" reply to a particular request
because the user is not logged in, a server might ask for his account
number (or ask him to log in) and then proceed with the previous request,
which has been held in abeyance. While this may be convenient for a
server, it is not necessary, and certainly ambiguous to hold a command in
abeyance while oBTaining an account number. Since any server may spring
this on a user, all user-FTP implementations must be able to cope with
this twist, which adds a good deal of required complication to the
"minimal" user-FTP implementation. We propose that the 331 reply be
eliminated, and that the server forget the requested operation and return
a 4XX reply if an account is needed.
Jon Postel has remarked that "mail text should follow the same limit as
commands and long 'lines' of mail text have been trouble for some FTP
Servers." We agree. In fact, mail transmitted over the FTP Telnet control
connection has other problems, too: Since FTP is (nominally, at least)
supposed to be usable from TIPs, Multics implemented its standard
character erase and line kill conventions on the control connection for
the convenience of TIP users (it was actually easier to have those
conventions in effect than to turn them off!). Of course, no erase/kill
processing was done on the data connection. The intent of the MAIL
request was to allow users at terminals to Access an FTP Server directly
and transmit mail; it was presumed that mail-sending automata which
gathered the mail to be sent into a file would use the MLFL command and
transmit the mail over the data connection. Presumably, long lines would
not be a problem, and, of course, no erase/kill conventions would be in
effect. Well, at least one major system (TENEX) has a mail-sending
automaton which transmits mail over the Telnet control connection using
the MAIL command - even though it has previously gathered the mail into a
file! Line-length considerations could be a severe problem here, and the
fact that the Multics line-kill character is the at-sign (@) caused grief
in reading mail from TENEX users who included their "return address" in
TENEX's SNDMSG syntax, as USERNAME@HOST. We propose that mail-sending
automata be required to use MLFL, rather than MAIL.