1. 程式人生 > >FTP 兩種連接模式

FTP 兩種連接模式

服務器端 客戶端連接 火墻 通過 防火 上傳 命令 ack 不同

簡介

FTP協議要用到兩個TCP連接, 一個是命令連接,用來在FTP客戶端與服務器之間傳遞命令;另一個是數據連接,用來上傳或下載數據。通常21端口是命令端口,20端口是數據端口。當混入主動/被動模式的概念時,數據端口就有可能不是20了。
無論是主動模式還是被動模式,其要進行文件傳輸都必須依次建立兩個連接,分別為命令連接與數據連接。而主動模式與被動模式的差異主要體現在數據連結通道上。

命令連接

 當FTP客戶端需要登陸到FTP服務器上的時候,服務器與客戶端需要進行一系列的身份驗證過程,這個過程就叫做命令連接。如在客戶端向服務器發起連接請 求的時候,客戶端會隨即的選擇某個TCP端口來跟FTP服務器的21號端口進行連接,這主要是通過TCP三方握手來實現的。當三方握手完成之後,客戶端與 服務器之間便建立了命令連接通道。不過這個通道的用途是非常有限的,其主要用來傳輸FTP的相關指令。如查看文件列表、刪除文件等等,而不能夠用來在客戶 端與服務端進行文件傳輸。為此這個通道就被稱之為命令通道。到客戶端與服務器建立了連接之後,可能客戶端暫時不需要進行數據傳輸。如只是需要查看目錄下的文件或則其他相關的動作。此時之需要命令連接通道就可以完 成了。

數據連接

 如果此時客戶端需要往FTP服務器上上傳或者下載文件的話,就需要在客戶端與服務器端再建立一條額外的數據傳輸連接。

主動模式

 主動模式下,FTP客戶端從任意的非特殊的端口(N > 1023)連入到FTP服務器的命令端口--21端口。然後客戶端在N+1(N+1 >= 1024)端口監聽,並且通過N+1(N+1 >= 1024)端口發送命令給FTP服務器。服務器會反過來連接用戶本地指定的數據端口,比如20端口。

  • FTP服務器命令(21)端口接受客戶端端口(N > 1023)(客戶端初始連接)
  • FTP服務器命令(21)端口到客戶端端口(>1023)(服務器響應客戶端命令)
  • FTP服務器數據(20)端口到客戶端端口(>1023)(服務器初始化數據連接到客戶端數據端口)
  • FTP服務器數據(20)端口接受客戶端端口(>1023)(客戶端發送ACK包到服務器的數據端口)

被動模式

在被動方式FTP中,命令連接和數據連接都由客戶端發起,這樣就可以解決從服務器到客戶端的數據端口的入方向連接被防火墻過濾掉的問題。

在被動模式下,FTP庫戶端隨機開啟(N>1024)的端口向服務器的21號端口發起連接,同時會開啟 N+1號端口。然後向服務器發送PASV命令,通知服務器自己處於被動模式。服務器收到命令後,會開放一個大於1024的端口P進行監聽,然後用PORT P命令通知客戶端,自己的數據端口是P。客戶端收到命令後,會通過N+1號端口連接服務器的端口P,然後在兩個端口之間進行數據傳輸。 (在vsftpd.conf中指定被動端口範圍為4000-4500)

  • FTP服務器命令(20)接收客戶端任何大於1024的端口(客戶端的初始化連接)
  • FTP服務器命令(21)到客戶端(>1024)的端口 (服務器響應到客戶端的控制端口的連接)
  • FTP服務器數據(>1024)接收客戶端(>1024)的端口(客戶端初始化數據連接到服務器指定的任意端口)
  • FTP服務器數據(>1024)到客戶端(>1024)的端口(服務器發送ACK響應和數據到客戶端的數據端口)

不同工作模式的網絡設置

主動模式傳送數據時是“服務器”連接到“客戶端”的端口;被動模式傳送數據是“客戶端”連接到“服務器”的端口。

在實際項目中碰到的問題是,FTP的客戶端和服務器分別在不同網絡,兩個網絡之間有至少4層的防火墻,服務器端只開放了21端口, 客戶端機器沒開放任何端口。FTP客戶端連接采用的被動模式,結果客戶端能登錄成功,但是無法LIST列表和讀取數據。很明顯,是因為服務器端沒開放被動模式下的隨機端口導致。

由於被動模式下,服務器端開放的端口隨機,但是防火墻要不能全部開放,解決的方案是,在ftp服務器配置被動模式下開放隨機端口在 50000-60000之間(範圍在ftp服務器軟件設置,可以設置任意1024上的端口段),然後在防火墻設置規則,開放服務器端50000-60000之間的端口端。

主動模式下,客戶端的FTP軟件設置主動模式開放的端口段,在客戶端的防火墻開放對應的端口段。

FTP 兩種連接模式