我一直在阅读 FTP 规范并使用 Wireshark 来捕获我的 FTP 客户端正在发送/接收的数据包,并对它们有一些疑问。
首先是来自我的 FTP 服务器的“连接问候语”(正如 FTP RFC 所说的那样):
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 2 of 50 allowed.
220-Local time is now 15:22. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
根据RFC959#page-35,如果在三位数之后有 - 表示它是多行响应。因此,随后的 220- 似乎是不必要的,上面可以重写如下:
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
You are user number 2 of 50 allowed.
Local time is now 15:22. Server port: 21.
This is a private system - No anonymous login
IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
那是对的吗?
另外,线的长度有限制吗?RFC 只提到一次“行长”。这里:
A reply is defined to contain the 3-digit code, followed by Space
<SP>, followed by one line of text (where some maximum line length
has been specified)
然而,RFC 并没有讨论如何或何时指定这样的“最大行长”。它为这些多行响应提供的特定用例是 STAT 回复,但在我看来,该示例有点做作,因为无论如何我认为 STAT 响应中不会有新行。
最后,一个人应该如何知道一个人何时完成接收回复?下面是 phpBB 是如何做到的:
https://github.com/phpbb/phpbb3/blob/develop/phpBB/includes/functions_transfer.php#L885
do
{
$result = @fgets($this->connection, 512);
$response .= $result;
}
while (substr($result, 3, 1) !== ' ');
他们对 512 的选择似乎是任意的 *,但是,暂时忽略这一点,他们substr($result, 3, 1) !== ' '
也会中断我在本文前面所做的“连接问候”重写。
- 我说这是任意的,因为 RFC 中唯一出现的数字 512 是在讨论不连续文件传输的页面结构时。
任何见解将不胜感激 - 谢谢!