FTP活動模式意味着服務器打開與客戶端的連接併發送數據。這通常是不實際的,所以發明了被動模式:服務器打開一個額外的端口,用於監聽傳入的連接並在有人連接時開始傳輸。
因此,被動模式會是這樣的:
$ telnet localhost 21
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PASV
227 Entering Passive Mode (127,0,0,1,185,37).
LIST
150 Here comes the directory listing.
---> here client opens another telnet session,
---> connecting to the same server on port 185*256+37, specified by server:
$ telnet localhost $((185 * 256 + 37))
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
drwxrwxr-x 2 121 1003 4096 Aug 21 10:57 incoming
drwxrwxr-x 7 0 1003 4096 Nov 09 21:04 pub
Connection closed by foreign host.
<---- end of data transfer session
226 Directory send OK.
而活動的會話的例子:
$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PORT 127,0,0,1,45,45 (ports are specified by client)
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
---> here client listens for an incoming connection on port 45*256+45
$ nc -l 0.0.0.0 $((45 * 256 + 45))
drwxrwxr-x 2 121 1003 4096 Aug 21 10:57 incoming
drwxrwxr-x 7 0 1003 4096 Nov 09 21:04 pub
<--- data are rececived
226 Directory send OK.
附: FTP是一種非常古老的協議(定義從1970年左右開始),定義了當沒有路由器,門和其他傳輸級別的好東西時,通常有幾臺機器直接相連,所以主動模式工作得很好,被動模式是協議今天仍然存在。
所以,是的,你已經得到PORT命令權,但沒有統一的方式讓您的外部IP(可能有幾個你在本地機器上的幾個不同的網絡IP地址,可能有幾個門與自己的網絡在去服務器的路上,你想用哪一個?)。問題的第二部分,如何讓服務器看到你的IP,無法應答(這就是被動模式的原因)。
謝謝,我得到了正確的(併爲被動模式工作),但我更需要從程序的角度來看,如何知道我的IP指定到服務器?它可能是或可能不在同一個本地網絡中(無論如何,我從它的主機名而不是它的IP訪問它),並且我不知道NAT;這是我大學的服務器(我正在從uni內外進行測試)。 –
@tehinternetsismadeofcatz如果你的主機不能直接從服務器訪問,你就不能使用主動模式。這就是被動模式存在的原因。 NAT從內部跟蹤連接以確定如何路由答案,但它們不提供建立到後面點的連接的方式。 –
嗯,這是一個提升我的客戶的指南:當基本完成時(這是我的情況),嘗試實現主動模式。所以我想它應該可以直接工作,如果我可以得到我的IP地址:D –