我一直在阅读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-s是不必要的,以上可以改写如下:
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) !== ' '
也会打破我在本文前面所做的“连接问候”重写。
任何见解都会受到赞赏 - 谢谢!!
答案 0 :(得分:1)
您对多线响应是正确的。但是许多服务器使用的格式是在每行开始时重复的代码。所以你需要能够处理这两个问题。
至于线长,我不知道。 phpBB代码似乎并不遵循RFC。
答案 1 :(得分:0)
你是对的。但是如果你当时只实现linux系统上可用的服务器和客户端,那么你的代码在没有3位数的情况下无法运行。因为所有人都遵循rfc。所以你必须遵循rfc。