FTP傳輸有兩種工作模式,Active Mode和Passive Mode(主動模式和被動模式),簡單描述連接過程如下:
主動模式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時, 客戶端在命令鏈路上用PORT命令告訴服務器:“我打開了***端口,你過來連接我”。於是服務器從20端口向客戶端的***端口發送連接請求,建立一條數據鏈路來傳送數據。
被動模式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時, 服務器在命令鏈路上用PASV命令告訴客戶端:“我打開了***端口,你過來連接我”。於是客戶端向服務器的***端口發送連接請求,建立一條數據鏈路來傳送數據。
了解模式的目的,是為了了解端口。使用 FTP 傳輸時,至少會使用到兩個 Port 來建立連接通道:
-
一個為指令通道(Command Channel),默認使用 Port 21 建立,用來傳輸 FTP 指令,例如:列出清單(LIST)、變更目錄(CWD)、取得目前的目錄(PWD)、......等。
-
另一個為數據通道(DATA Channel),默認使用 Port 20,但是會因 FTP Client 選擇使用的模式不同而有所不同。
主動模式 ( Active mode )
FTP Client 跟 FTP Server 聯機后,會主動利用 PORT 指令提出 DATA Channel 聯機的要求,如下:
1
2
|
指令:PORT 10,18,53,171,17,114
回應:200 Port command successful.
|
這里的 PORT 指令是由 FTP Client 送出的,當需要建立 DATA Channel 時,FTP Server 會主動利用 Server 主機的 Port 20 發出聯機到 FTP Client 的主機,而 PORT 指令后的參數說明如下:
前四個數字是 FTP Client 的 IP 地址:10.18.53.171
后兩個數字是 FTP Client 接受聯機的端口號,端口號的計算方式是 (第五個數字 * 256 + 第六個數字),以此范例來說,FTP Client 接受的聯機端口號是 17 * 256 + 114 = 4,466
由此可知,如果 FTP Client 處於 NAT 的環境下的話,FTP Server 幾乎無法正常的聯機到 FTP Client 的主機,所以現在大部分的聯機模式幾乎都建議用戶使用被動模式(Passive mode)。
被動模式 ( Passive mode )
FTP Client 跟 FTP Server 聯機后,會主動利用 PASV 指令提出 DATA Channel 聯機的要求,如下:
1
2
|
指令:PASV
回應:227 Entering Passive Mode(59,37,124,43,158,251)
|
你可以看到由 FTP Client 送出的 PASV 指令並沒有送出其他的參數,而是在 FTP Server 響應的時候出現了(59,37,124,43,158,251) 字符串,當需要建立 DATA Channel 時,這時就會由 FTP Client 主動連至 FTP Server 動態開放的 Port 供 FTP Client 連接,其中 (59,37,124,43,158,251) 的說明如下:
前四個數字是 FTP Server 的 IP 地址:59.37.124.43
后兩個數字是 FTP Server 接受聯機的端口號,端口號的計算方式是 (第五個數字 * 256 + 第六個數字),以此范例來說,FTP Server 可接受的聯機端口號是 158 * 256 + 251 = 40,699
由此可知,使用被動模式(Passive mode)對 FTP Server 的系統管理員來說,可掌控的部分是比較多的,因為 FTP Server 無法決定用戶是否可使用主動模式聯機,但若改使用被動模式聯機的話,就幾乎能讓所有人正常的使用。
需要注意的是FTP Client每次下指令傳輸數據時,都會建立一次 Data Connection,指令包括取得遠程的檔案清單(LIST)時回傳的檔案列表、下載文件、或上傳檔案。