1. 程式人生 > 其它 >FTP主動模式與被動模式

FTP主動模式與被動模式

一般來說,客戶端有一個 Socket 用來連線 FTP 伺服器的相關埠,它負責 FTP 命令的傳送和接收返回的響應資訊。一些操作如“登入”、“改變目錄”、“刪除檔案”,依靠這個連線傳送命令就可完成。伺服器的命令埠號一般是21。

對於有資料傳輸的操作,主要是顯示目錄列表,上傳、下載檔案,我們需要依靠另一個Socket來完成。 如果使用被動模式,通常伺服器端會返回一個埠號。客戶端需要用另開一個Socket來連線這個埠,然後我們可根據操作來發送命令,資料會通過新開的一個埠傳輸。

如果使用主動模式,通常客戶端會發送一個埠號給伺服器端,並在這個埠監聽。伺服器需要連線到客戶端開啟的這個資料埠,並進行資料的傳輸。主動模式下,伺服器的資料埠號一般是20。

主動模式(PORT)和被動模式(PASV)

主動模式下,客戶端隨機開啟一個大於1024的埠向伺服器的命令埠P(即21埠),發起連線,同時開放N +1埠監聽,並向伺服器發出“port N+1”命令,由伺服器從它自己的資料埠(即20埠)主動連線到客戶端指定的資料埠(N+1)。FTP的客戶端只是告訴伺服器自己的埠號,讓伺服器來連線客戶端指定的埠。對於客戶端的防火牆來說,這是從外部到內部的連線,可能會被阻塞。

為了解決伺服器發起到客戶的連線問題,有了另一種FTP連線方式,即被動方式。命令連線和資料連線都由客戶端發起,這樣就解決了從伺服器到客戶端的資料埠的連線被防火牆過濾的問題。被動模式下,當開啟一個FTP連線時,客戶端開啟兩個任意的本地埠(N > 1024和N+1)。第一個埠連線伺服器的21埠,提交PASV命令。然後伺服器會開啟一個任意的埠(P > 1024),返回如227 entering passive mode (h1,h2,h3,h4,p1,p2)。它返回了227開頭的資訊,在括號中有以逗號隔開的六個數字,前四個指伺服器的地址,最後兩個,將倒數第二個乘 256再加上最後一個數字,這就是FTP伺服器開放的用來進行資料傳輸的埠。

下圖是ftp設定被動模式埠為固定唯一埠,每次飯後的埠號一樣


注意,這裡的任意兩個埠N和N+1其實不是連續的,而是真正的不相關的兩個埠。