常見FTP有兩種模式:PORT(主動模式)、PASV(被動模式)。
PORT模式:
| 1 2 3 4 |
當FTP的Client以PORT模式串連FTP Server時,它動態選擇一個Port X(注意這個Port一定是 1024 以上的,因為 1024 以前的Port都已經預先被定義好,被一些典型的服務使用,當然有的還沒使用,也是保留給以後會用到這些連接埠的資源服務)來串連FTP Server的 21 連接埠,當經過TCP的三向交握後,串連(控制通道)被建立。 現在使用者要列出FTP Server上的目錄結構(使用ls或dir命令),那麼首先就要建立一個資料通道,因為只有資料通道才能傳輸目錄和檔案清單,此時使用者會發出PORT指令告訴FTP Server串連自己的Port Y來建立一條資料通道(這個命令由控制通道發送給伺服器)。當FTP Server接到這一指令時,FTP Server會使用 20 連接埠串連使用者在PORT指令中指定的Port Y,用以發送目錄的列表. 當完成這一操作時,FTP Client也許要下載一個檔案,那麼就會發出 get 命令,請注意,這時Client再次發送PORT指令,告訴伺服器串連他的哪個“新”連接埠。(你可以先用netstat -na這個命令驗證,上一次使用的Y已經處於TIME_WAIT狀態。) 當這個新的資料轉送通道建立後(在微軟的系統中,用戶端通常會使用連續的連接埠,也就是說這一次用戶端會用Y+ 1 這個連接埠),就開始了檔案傳輸的工作。 |
PASV模式:
| 1 2 3 4 5 6 |
在初始化串連這個過程,即串連FTP Server這個過程和PORT模式是一樣的。 然而,當FTP Client以PASV模式串連FTP Server,FTP Client發送ls、dir、 get 等這些要求資料返回的命令時,當情況就有些不同了。 FTP Client不向伺服器發送PORT指令而是發送PASV指令,在這個指令中,Client告訴FTP Server自己要串連伺服器的某一個連接埠: 1 > 如果這個伺服器上的這個連接埠是閒置可用的,那麼伺服器會返回ACK的確認資訊,之後資料轉送通道被建立並返回使用者所要的資訊(根據使用者發送的指令,如ls、dir、 get 等); 2 > 如果伺服器的這個連接埠被另一個資源所使用,那麼伺服器返回UNACK的資訊,那麼這時,FTP客戶會再次發送PASV命令,這也就是所謂的串連建立的協商過程。 為了驗證這個過程我們不得不藉助CUTEFTP Pro這個FTP用戶端軟體,因為微軟內建的FTP命令用戶端,不支援PASV模式。雖然你可以使用QUOTE PASV這個命令強制使用PASV模式,但是當你用ls命令列出伺服器目錄列表,你會發現它還是使用PORT方式來串連伺服器的。 |
PS:更詳細的說明,請查閱http://www.microsoft.com/china/community/Column/70.mspx
EPRT/EPSV模式出現的原因:
FTP僅僅提供了建立在IPv4上進行資料通訊的能力,它基於網路地址是32位這一假設。但是,當IPv6出現以後,地址就比32位長許多了。原來對FTP進行的擴充在多協議環境中有時會失敗。我們必須針對IPv6對FTP再次進行擴充。
EPRT、EPSV是Extended Port/Pasv的簡寫。
EPRT模式:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
EPRT考慮到資料連線的擴充地址問題,擴充地址必須包括網路通訊協定以及網路和傳輸地址。格式如下: EPRT<空格><d><網路通訊協定><d><網路地址><d><TCP連接埠><d> EPRT後要跟空格,空格後面必須是分隔字元<d>,分隔字元必須在ASCII的 33 到 126 範圍之內。推薦使用|,除非它已有它用。網路通訊協定是一個數字,它指出使用的是什麼協議。具體資料如下: 1 =IPv4; 2 =IPv6; 網路地址是在指定網路通訊協定下的相應地址,在IPv4和IPv6下地址分別如下格式: IPv4= 132.235 . 1.2 ;IPv6= 1080 :: 8 : 800 :200C:417A TCP連接埠指的是協議在哪一個TCP連接埠上偵聽資料連線。下面是兩個EPRT命令的例子: EPRT | 1 | 132.235 . 1.2 | 6275 | EPRT | 2 | 1080 :: 8 : 800 :200C:417A| 5282 | 第一個命令在TCP連接埠 6275 上用IPv4開啟主機 "132.235.1.2" ; 第二個命令在TCP連接埠 5282 上用IPv6開啟主機 "1080::8:800:200C:417A" 。 在接收到合法的EPRT命令後,伺服器必須返回 200 (命令合法)。標準的錯誤碼 500 和 501 已經足夠處理大部分錯誤了,但是還需要一個錯誤碼,代碼 522 指定伺服器不支援要求的網路通訊協定,新錯誤碼的解釋如下: 5yz 交換資訊結束 x2z 串連 xy2 擴充座錯誤:未知的網路通訊協定 響應的文本部分必須說明伺服器啟動並執行協議是什麼,響應串的格式如下: <說明不支援的網路的字串> /(協議 1 ,協議 2 ,...,協議n) 上述的數字代碼和在括弧內的協議資訊由軟體自動控制接收響應;而在數字代碼和 '(' 之間的內容供人類使用者處理。其後的協議表中的協議應該以逗號分隔。下面是兩個響應串的例子: Network protocol not supported, use ( 1 ) Network protocol not supported, use ( 1 , 2 ) |
EPSV模式:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
EPSV格式如下: EPSV<空格><網路通訊協定> 如果請求的網路通訊協定是伺服器支援的,那就必須使用此協議;如果不支援,則返回 522 。最後,EPSV命令可以使用參數 "ALL" 通過網路地址翻譯器,EPRT命令不再使用。下面是例子: EPSV<空格>ALL 接收到此命令後,伺服器要拒絕除了EPSV以外所有建立串連的命令。 對於所有在兩台相同機器間建立控制和資料連線的FTP傳輸來說,必須使用EPSV。使用它可以減少通過防火牆和網路地址翻譯器(NAT)對效率的影響。有些文章推薦在防火牆後使用被動命令,因此防火牆通常不允許主動串連。在本文中定義的EPSV命令不需要NAT在傳輸時對網路地址進行改變。如果使用EPRT,NAT必須改變網路地址。如果客戶發送了 "EPSV ALL" 命令,NAT能夠將串連變為快速方式,只要再不使用EPRT,就不需要對資料區段的資料部分進行改變。如果客戶希望進行兩路FTP傳輸,應該使用這條命令,如果後來客戶需要建立三種FTP傳輸,必須新開啟了個FTP會話。 EPSV請求伺服器在一個資料連接埠上偵聽等待串連,它可以帶參數。對它的響應是TCP連接埠號碼。響應的格式與EPRT參數的很象。這對實現上有很大的方便。而且響應還留下了網路通訊協定和/或網路地址的空位,可以供以後使用。使用擴充地址進行被動模式的響應碼必須是 229 ,對它的解釋如下: 2yz 主動完成 x2z 串連 xy9 進行擴充的被動模式 響應的格式如下: <指示伺服器已經進入初擴充的被動模式> /(<d><d><d><TCP連接埠><d>) 包括在括弧內的字串必須是EPRT開啟資料連線的連接埠。具體如上所未,這裡就不多說了。資料連線使用的協議必須和控制串連使用的協議和地址一致,下面是響應的一個例子: Entering Extended Passive Mode (||| 6446 |) 標準錯誤代碼 500 和 501 對EPSV已經足夠了(不支援EPSV)。在EPSV命令沒有使用參數時,伺服器會基於控制串連所使用的協議選擇資料連線使用的網路通訊協定。但是在有代理的情況下,這種機制可能不合適。因此客戶也需要能夠要求一個指定協議。如果伺服器返回說明它在指定連接埠不支援此協議,客戶必鬚髮送ABOR(放棄)命令使伺服器關閉串連,然後客戶再使用EPSV命令要求使用特定的網路通訊協定,具體格式如下:
來源 http://hi.baidu.com/1986baby/item/cace6cb6746f61a7eaba93c6
|