2013-04-04 18 views
3

我一直在閱讀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中的唯一時間是當它討論不連續文件傳輸的頁面結構時。

任何有識之士將不勝感激 - 謝謝!

+0

[RFC 2228](https://tools.ietf.org/html/rfc2228),第5.2節討論預先將多行響應的_each_行與響應代碼相關聯,以便* protected *回覆(可能是base64 - 編碼)可以被處理。自該RFC以來,許多FTP服務器總是使用響應代碼前綴來進行多行響應,因爲它使得實現更簡單。 – Castaglia 2016-01-09 19:30:46

回答

1

你對多行反應是正確的。但是許多服務器使用每行開始時重複代碼的格式。所以你需要能夠處理這兩個不幸的事情。

至於行長,我不知道。 phpBB代碼似乎並不遵循RFC的確。

+1

WordPress似乎採取了更好的方法:https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-ftp-pure.php#L62它們與正則表達式匹配。但是,即使在Wordpress中,您也只是一次閱讀回覆。但是如果你有多個迴應呢?像多個不同的220響應(即「220」與「220-」)?我想也許你只是假設你不會?我沒有在FTP RFC中看到任何說你不會的東西。 – neubert 2013-04-04 22:48:59

+1

你不應該用相同的代碼得到多個響應,所以確保你在開始時下一行代碼不同時停止閱讀。雖然我見過一個服務器爲一個請求發送多個1yz代碼,但是又違反了FTP規範。一次請求你絕對不會得到多個2yz響應。第一個是1yz時,你只能得到多個響應。 – 2013-04-05 07:48:00

0

如果你正確,但是如果你只實現當時在你的linux系統上可用的服務器和客戶端,那麼你的代碼不能在沒有3位數的情況下工作。因爲所有人都遵循rfc。所以你必須遵循rfc。