4

我一直在阅读 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 是在讨论不连续文件传输的页面结构时。

任何见解将不胜感激 - 谢谢!

4

2 回答 2

2

你是对的多线响应。但是许多服务器使用在每一行开头重复代码的格式。因此,不幸的是,您需要能够同时处理这两个问题。

至于线路长度,我不知道。phpBB 代码似乎确实不遵循 RFC。

于 2013-04-04T21:54:13.143 回答
0

是的,你是对的。但如果你只实现当时在你的 linux 系统上可用的服务器和客户端,你的代码在没有 3 位数字的情况下无法工作。因为所有人都遵循 rfc。所以你必须遵循 rfc。

于 2014-04-05T05:45:48.913 回答