我一直在閱讀FTP規範,並使用Wireshark捕獲我的FTP客戶端正在發送/接收的數據包,並對它們提出了一些問題。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) !== ' '
也將與「連接問候」打破重寫我前面所做的在這篇文章中。
- 我說這是任意的,因爲數字512甚至出現在RFC中的唯一時間是當它討論不連續文件傳輸的頁面結構時。
任何有識之士將不勝感激 - 謝謝!
[RFC 2228](https://tools.ietf.org/html/rfc2228),第5.2節討論預先將多行響應的_each_行與響應代碼相關聯,以便* protected *回覆(可能是base64 - 編碼)可以被處理。自該RFC以來,許多FTP服務器總是使用響應代碼前綴來進行多行響應,因爲它使得實現更簡單。 – Castaglia 2016-01-09 19:30:46