FTP協議及工作原理
1. FTP協議
什么是FTP呢?FTP 是 TCP/IP 協議組中的協議之一,是英文File Transfer Protocol的縮寫。
該協議是Internet文件傳送的基礎,它由一系列規格說明文檔組成,目標是提高文件的共享性,提供非直接使用遠程計算機,使存儲介質對用戶透明 和可靠高效地傳送數據。簡單的說,FTP就是完成兩台計算機之間的拷貝,從遠程計算機拷貝文件至自己的計算機上,稱之為“下載 (download)”文件。若將文件從自己計算機中拷貝至遠程計算機上,則稱之為“上載(upload)”文件。
在TCP/IP協議中, 需要兩個端口,一個是數據端口,一個是控制端口。
控制端口一般為21,而數據端口不一定是20,這和FTP的應用模式有關,如果是主動模式,應該為20,如果為被動模式,由服務器端和客戶端協商而定。相比於HTTP,FTP協議要復雜得多。復雜的原因,是因為FTP協議要用到兩個TCP連接,一個是命令鏈路,用來在FTP客戶端與服務器之間傳遞命令;另一個是數據鏈路,用來上傳或下載數據。
2. FTP服務器和客戶端
同大多數Internet服務一樣,FTP也是一個客戶/服務器系統。用戶通過一個客戶機程序連接至在遠程計算機上運行的服務器程序。依照 FTP 協議提供服務,進行文件傳送的計算機就是 FTP 服務器,而連接FTP服務器,遵循FTP協議與服務器傳送文件的電腦就是FTP客戶端。用戶要連上 FTP 服務器,就要用到 FPT 的客戶端軟件,通常 Windows自帶“ftp”命令,這是一個命令行的 FTP 客戶程序,另外常用的 FTP 客戶程序還有 CuteFTP、Ws_FTP、Flashfxp、LeapFTP、流星雨-貓眼等。
3. FTP用戶授權
(1)用戶授權
要連上 FTP 服務器(即“登陸”),必須要有該 FTP 服務器授權的帳號,也就是說你只有在有了一個用戶標識和一個口令后才能登陸FTP服務器,享受FTP服務器提供的服務。
(2)FTP地址格式
FTP地址如下: ftp://用戶名:密碼@FTP服務器IP或域名:FTP命令端口/路徑/文件名
上面的參數除FTP服務器IP或域名為必要項外,其他都不是必須的。如以下地址都是有效FTP地址:
ftp://foolish.6600.org
ftp://list:list@foolish.6600.org
ftp://list:list@foolish.6600.org:2003
ftp://list:list@foolish.6600.org:2003/soft/list.txt
(3)匿名FTP
互連網中有很大一部分 FTP 服務器被稱為“匿名”(Anonymous)FTP 服務器。這類服務器的目的是向公眾提供文件拷貝服務,不要求用戶事先在該服務器進行登記注冊,也不用取得FTP服務器的授權。Anonymous(匿名文 件傳輸)能夠使用戶與遠程主機建立連接並以匿名身份從遠程主機上拷貝文件,而不必是該遠程主機的注冊用戶。用戶使用特殊的用戶名“anonymous”登 陸FTP服務,就可訪問遠程主機上公開的文件。許多系統要求用戶將Emai1地址作為口令,以便更好地對訪問進行跟綜。匿名FTP一直是Internet 上獲取信息資源的最主要方式,在Internet成千上萬的匿名FTP主機中存儲着無以計數的文件,這些文件包含了各種各樣的信息,數據和軟件。人們只要 知道特定信息資源的主機地址,就可以用匿名FTP登錄獲取所需的信息資料。雖然目前使用WWW環境已取代匿名FTP成為最主要的信息查詢方式,但是匿名 FTP仍是 Internet上傳輸分發軟件的一種基本方法。如red hat 、autodesk等公司的匿名站點。
4. FTP的傳輸模式
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,被動方式)。 下面介紹一個這兩種方式的工作原理:
主動 FTP :
命令連接:客戶端 >1024 端口 → 服務器 21 端口
數據連接:客戶端 >1024 端口 ← 服務器 20 端口
被動 FTP :
命令連接:客戶端 >1024 端口 → 服務器 21 端口
數據連接:客戶端 >1024 端口 ← 服務器 >1024 端口
PORT(主動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。 當需要傳送數據時, 客戶端在命令鏈路上用PORT命令告訴服務器:“我打開了***X端口,你過來連接我”。於是服務器從20端口向客戶端的***X端口發送連接請求,建立 一條數據鏈路來傳送數據。
PASV(被動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。 當需要傳送數據時, 服務器在命令鏈路上用PASV命令告訴客戶端:“我打開了***X端口,你過來連接我”。於是客戶端向服務器的***X端口發送連接請求,建立一條數據鏈 路來傳送數據。
早先所有客戶端都使用主動模式,而且工作的很好,而現在因為客戶端防火牆的存在,將會關閉一些端口,這樣主動模式將會失敗。在這種情況下就要使用被動模式,但是一些端口也可能被服務器的防火牆封掉。不過因為ftp服務器需要它的ftp服務連接到一定數量的客戶端,所以他們總是支持被動模式的。這就是我們為什么要使用被動模式的原意,為了確保數據可以正確的傳輸,使用被動模式要明顯優於主動模式。(譯者注:主動(PORT)模式建立數據傳輸通道是由服務器端發起的,服務器使用20端口連接客戶端的某一個大於1024的 端口;在被動(PASV)模式中,數據傳輸的通道的建立是由FTP客戶端發起的,他使用一個大於1024的端口連接服務器的1024以上的某一個端口)
主動模式傳送數據時是“服務器”連接到“客戶端”的端口;
被動模式傳送數據是“客戶端”連接到“服務器”的端口。
主動模式需要客戶端必須開放端口給服務器,很多客戶端都是在防火牆內,開放端口給FTP服務器訪問比較困難。
被動模式只需要服務器端開放端口給客戶端連接就行了。
FTP服務器一般都支持主動和被動模式,連接采用何種模式是有FTP客戶端軟件決定。
6、FTP被動模式的出現原因
在FTP的歷史中,本來只有主動模式的,但是為什么又出現了被動模式呢?這又牽涉到另外一個問題了,
在很久以前(我也不知道多久),地球上還沒有什么共享上網這種技術,但是后來出現了,所以也就有了下面的問題,大家都知道,共享上網就是很 多台電腦共享一個公網IP去使用internet,再打個比喻吧,某個局域網共享210.33.25.1這個公網IP上網,當一個內網用戶 192.168.0.100去訪問外網的FTP服務器時,如果采用主動模式的話,192.168.0.1告訴了FTP服務器我需要某個文件和我打開了x端 口之后,由於共享上網的原因,192.168.0.1在出網關的時候自己的IP地址已經被翻譯成了210.33.25.1這個公網IP,所以服務器端收到 的消息也就是210.33.25.1需要某個文件並打開了x端口,FTP服務器就會往210.33.25.1的x端口傳數據,這樣當然會連接不成功了,因 為打開x端口的並不是210.33.25.1這個地址,在這種情況下被動模式就有用了,相信大家已經能夠理解被動模式是怎么個連接法了吧。
在主動模式中,FTP的兩個端口是相對固定的,如果命令端口是x的話,那數據端口就是x-1,也就是說默認情況下,命令端口是21,數據端口就是20;你把命令端口改成了123,那么數據端口就是122。這樣使用防火牆就很方便了,只要開通這兩個端口就可以了,但是如果客戶端是共享上網的話那豈不是不能正常使用FTP了,這樣還是不行,一定需要被動模式。
在被動模式中就麻煩了些,默認情況下命令端口是21,但是數據端口是隨機的
windows FTP被動模式設置
windows server 2008服務器搭建完畢后默認為主動式
主動式有利於服務器端管理 但是可能會被客戶端防火牆攔截
被動式由於數據傳輸由客戶端發起 所以不會被客戶端防火牆攔截 但是不利於服務器管理
IIS中搭建FTP后配置FTP為被動模式:
1、雙擊網站(最上面,而不是ftp站點),FTP防火牆
填寫端口和IP即可 例如填寫50000-60000,即為允許10000個被動連接 (此時可能為灰色需要開通防火牆)
如果端口位置為灰色,需執行以下命令添加防火牆策略 允許ftp
netsh advf:irewall firewall add rule name="FTP Service" action=allow service=ftpsvc protocol=TCP dir=in
netsh advfirewall firewall set global StatefulFTP disable
添加完畢再看端口可以輸入數值和外部連接的IP地址 點擊應用。
2、而看了下用1025-1034這樣的端口並不行,用抓包也看到被動時,服務器端制定的端口是50492。
而這個端口是變動的,故如果只設置一個端口是不行的(50000-50000這樣不行)
相應的服務器也得在“安全組規則”里開這些端口。
FTP客戶端的注意事項
請注意:選擇用PASV方式還是PORT方式登錄FTP服務器,選擇權在FTP客戶端,而不是在FTP服務器。
一、客戶端只有內網IP,沒有公網IP
從上面的FTP基礎知識可知,如果用PORT方式,因為客戶端沒有公網IP,FTP將無法連接客戶端建立數據鏈路。因此,在這種情況下,客戶端必須要用PASV方式,才能連接FTP服務器。大部分FTP站長發現自己的服務器有人能登錄上,有人登錄不上,典型的錯誤原因就是因為客戶端沒有公網IP,但用了IE作為FTP客戶端來登錄(IE默認使用PORT方式)。
二、客戶端有公網IP,但安裝了防火牆
如果用PASV方式登錄FTP服務器,因為建立數據鏈路的時候,是由客戶端向服務器發送連接請求,沒有問題。反過來,如果用PORT方式登錄FTP服務器,因為建立數據鏈路的時候,是由服務器向客戶端發送連接請求,此時連接請求會被防火牆攔截。如果要用PORT方式登錄FTP服務器,請在防火牆上打開1024以上的高端端口。