1. 程式人生 > >FTP檔案傳輸協議兩種模式-主動模式和被動模式

FTP檔案傳輸協議兩種模式-主動模式和被動模式

TCP/IP協議中,FTP標準命令TCP埠號為21,Port方式資料埠為20。FTP協議的任務是從一臺計算機將檔案傳送到另一臺計算機,它與這兩臺計算機所處的位置、聯接的方式、甚至是是否使用相同的作業系統無關。假設兩臺計算機通過ftp協議對話,並且能訪問Internet, 你可以用ftp命令來傳輸檔案。每種作業系統使用上有某一些細微差別,但是每種協議基本的命令結構是相同的。

  FTP的傳輸有兩種方式:ASCII傳輸模式和二進位制資料傳輸模式。

  1.ASCII傳輸方式:假定使用者正在拷貝的檔案包含的簡單ASCII碼文字,如果在遠端機器上執行的不是UNIX,當檔案傳輸時ftp通常會自動地調整檔案的內容以便於把檔案解釋成另外那臺計算機儲存文字檔案的格式。

  但是常常有這樣的情況,使用者正在傳輸的檔案包含的不是文字檔案,它們可能是程式,資料庫,字處理檔案或者壓縮檔案(儘管字處理檔案包含的大部分是文字,其中也包含有指示頁尺寸,字型檔等資訊的非列印字元)。在拷貝任何非文字檔案之前,用binary 命令告訴ftp逐字拷貝,不要對這些檔案進行處理,這也是下面要講的二進位制傳輸。

  2.二進位制傳輸模式:在二進位制傳輸中,儲存檔案的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的檔案是沒意義的。例如,macintosh以二進位制方式傳送可執行檔案到Windows系統,在對方系統上,此檔案不能執行。

  如果你在ASCII方式下傳輸二進位制檔案,即使不需要也仍會轉譯。這會使傳輸稍微變慢 ,也會損壞資料,使檔案變得不能用。(在大多數計算機上,ASCII方式一般假設每一字元的第一有效位無意義,因為ASCII字元組合不使用它。如果你傳輸二進位制檔案,所有的位都是重要的。)如果你知道這兩臺機器是同樣的,則二進位制方式對文字檔案和資料檔案都是有效的。

  5. FTP的工作方式

  FTP支援兩種模式,一種方式叫做Standard (也就是 PORT方式,主動方式),一種是 Passive (也就是PASV,被動方式)。 Standard模式 FTP的客戶端傳送 PORT 命令到FTP伺服器。Passive模式FTP的客戶端傳送 PASV命令到 FTP Server。

  下面介紹一個這兩種方式的工作原理:

  Port模式FTP 客戶端首先和FTP伺服器的TCP 21埠建立連線,通過這個通道傳送命令,客戶端需要接收資料的時候在這個通道上傳送PORT命令。 PORT命令包含了客戶端用什麼埠接收資料。在傳送資料的時候,伺服器端通過自己的TCP 20埠連線至客戶端的指定埠傳送資料。 FTP server必須和客戶端建立一個新的連線用來傳送資料。

  Passive模式在建立控制通道的時候和Standard模式類似,但建立連線後傳送的不是Port命令,而是Pasv命令。FTP伺服器收到Pasv命令後,隨機開啟一個臨時埠(也叫自由埠,埠號大於1023小於65535)並且通知客戶端在這個埠上傳送資料的請求,客戶端連線FTP伺服器此埠,然後FTP伺服器將通過這個埠進行資料的傳送,這個時候FTP server不再需要建立一個新的和客戶端之間的連線。

  很多防火牆在設定的時候都是不允許接受外部發起的連線的,所以許多位於防火牆後或內網的FTP伺服器不支援PASV模式,因為客戶端無法穿過防火牆開啟FTP伺服器的高階埠;而許多內網的客戶端不能用PORT模式登陸FTP伺服器,因為從伺服器的TCP 20無法和內部網路的客戶端建立一個新的連線,造成無法工作。

  FTP軟體可以更好的幫助你管理FTP目錄 提供更系統的工具

  FTP工具推薦使用 cuteftp

  主動和被動模式FTP有兩種使用模式:主動和被動。主動模式要求客戶端和伺服器端同時開啟並且監聽一個埠以建立連線。在這種情況下,客戶端由於安裝了防火牆會產生一些問題。所以,創立了被動模式。被動模式只要求伺服器端產生一個監聽相應埠的程序,這樣就可以繞過客戶端安裝了防火牆的問題。

  一個主動模式的FTP連線建立要遵循以下步驟:

  客戶端開啟一個隨機的埠(埠號大於1024,在這裡,我們稱它為x),同時一個FTP程序連線至伺服器的21號命令埠。此時,源埠為隨機埠x,在客戶端,遠端埠為21,在伺服器。

  客戶端開始監聽埠(x+1),同時向伺服器傳送一個埠命令(通過伺服器的21號命令埠),此命令告訴伺服器客戶端正在監聽的埠號並且已準備好從此埠接收資料。這個埠就是我們所知的資料埠。

  伺服器開啟20號源埠並且建立和客戶端資料埠的連線。此時,源埠為20,遠端資料埠為(x+1)。

  客戶端通過本地的資料埠建立一個和伺服器20號埠的連線,然後向伺服器傳送一個應答,告訴伺服器它已經建立好了一個連線。