FTP基礎(chǔ)知識(shí)
FTP是File Transfer Protocol(文件傳輸協(xié)議)的縮寫(xiě),用來(lái)在兩臺(tái)計(jì)算機(jī)之間互相傳送文件。相比于HTTP,FTP協(xié)議要復(fù)雜得多。復(fù)雜的原因,是因?yàn)?span lang=EN-US>FTP協(xié)議要用 到兩個(gè)TCP連接,一個(gè)是命令鏈路,用來(lái)在FTP客戶(hù)端與服務(wù)器之間傳遞命令;另一個(gè)是數(shù)據(jù)鏈路,用來(lái)上傳或下載數(shù)據(jù)。
FTP協(xié)議有兩種工作方式:PORT方式和PASV方式,中文意思為主動(dòng)式和被動(dòng)式。
PORT(主動(dòng))方式的連接過(guò)程是:客戶(hù)端向服務(wù)器的FTP端口(默認(rèn)是21)發(fā)送連接請(qǐng)求,服務(wù)器接受連接,建立一條命令鏈路。
當(dāng)需要傳送數(shù)據(jù)時(shí),客戶(hù)端在命令鏈路上用 PORT命令告訴服務(wù)器:“我打開(kāi)了****端口,你過(guò)來(lái)連接我”。于是服務(wù)器從20端口向客戶(hù)端的****端口發(fā)送連接請(qǐng)求,建立一條數(shù)據(jù)鏈路來(lái)傳送數(shù)據(jù)。
PASV(被動(dòng))方式的連接過(guò)程是:客戶(hù)端向服務(wù)器的FTP端口(默認(rèn)是21)發(fā)送連接請(qǐng)求,服務(wù)器接受連接,建立一條命令鏈路。
當(dāng)需要傳送數(shù)據(jù)時(shí),服務(wù)器在命令鏈路上用 PASV命令告訴客戶(hù)端:“我打開(kāi)了****端口,你過(guò)來(lái)連接我”。于是客戶(hù)端向服務(wù)器的****端口發(fā)送連接請(qǐng)求,建立一條數(shù)據(jù)鏈路來(lái)傳送數(shù)據(jù)。
從上面可以看出,兩種方式的命令鏈路連接方法是一樣的,而數(shù)據(jù)鏈路的建立方法就完全不同。而FTP的復(fù)雜性就在于此。
FTP服務(wù)器端的注意事項(xiàng)
一、FTP服務(wù)器是公網(wǎng)IP,用公網(wǎng)動(dòng)態(tài)域名;或是內(nèi)網(wǎng)IP,用內(nèi)網(wǎng)專(zhuān)業(yè)版TrueHost
1、服務(wù)器如果安裝了防火墻,請(qǐng)記住要在防火墻上打開(kāi)FTP端口(默認(rèn)是21)。
2、所有FTP服務(wù)器軟件都支持PORT方式。至于PASV方式,大部分FTP服務(wù)器軟件都支持。支持PASV方式的FTP服務(wù)器軟件,也可以設(shè)置為只工作在PORT方式上。
3、為了PASV方式能正常工作,需要在FTP服務(wù)器軟件上為PASV方式指定可用的端口范圍(設(shè)置方法)。此外,還要在服務(wù)器的防火墻上打開(kāi)這些端口。當(dāng)客戶(hù)端以PASV方式連接服務(wù)器的時(shí)候,服務(wù)器就會(huì)在這個(gè)端口范圍里挑選一個(gè)端口出來(lái),給客戶(hù)端連接。
二、FTP服務(wù)器是內(nèi)網(wǎng)IP,用內(nèi)網(wǎng)動(dòng)態(tài)域名標(biāo)準(zhǔn)版cm*natpro*y
這種情況下,FTP服務(wù)器不需要做特殊設(shè)置,只要支持PASV方式就可以了。大部分FTP服務(wù)器軟件都支持PASV方式。
FTP客戶(hù)端的注意事項(xiàng)
請(qǐng)注意:選擇用PASV方式還是PORT方式登錄FTP服務(wù)器,選擇權(quán)在FTP客戶(hù)端,而不是在FTP服務(wù)器。
一、客戶(hù)端只有內(nèi)網(wǎng)IP,沒(méi)有公網(wǎng)IP
從 上面的FTP基礎(chǔ)知識(shí)可知,如果用PORT方式,因?yàn)榭蛻?hù)端沒(méi)有公網(wǎng)IP,FTP將無(wú)法連接客戶(hù)端建立數(shù)據(jù)鏈路。因此,在這種情況下,客戶(hù)端必須要用 PASV方式,才能連接FTP服務(wù)器。大部分FTP站長(zhǎng)發(fā)現(xiàn)自己的服務(wù)器有人能登錄上,有人登錄不上,典型的錯(cuò)誤原因就是因?yàn)榭蛻?hù)端沒(méi)有公網(wǎng)IP,但用了 IE作為FTP客戶(hù)端來(lái)登錄(IE默認(rèn)使用PORT方式)。
二、客戶(hù)端有公網(wǎng)IP,但安裝了防火墻
如果用PASV方 式登錄FTP服務(wù)器,因?yàn)榻?shù)據(jù)鏈路的時(shí)候,是由客戶(hù)端向服務(wù)器發(fā)送連接請(qǐng)求,沒(méi)有問(wèn)題。反過(guò)來(lái),如果用PORT方式登錄FTP服務(wù)器,因?yàn)榻?shù)據(jù)鏈 路的時(shí)候,是由服務(wù)器向客戶(hù)端發(fā)送連接請(qǐng)求,此時(shí)連接請(qǐng)求會(huì)被防火墻攔截。如果要用PORT方式登錄FTP服務(wù)器,請(qǐng)?jiān)诜阑饓ι洗蜷_(kāi) 1024以上的高端端口。
三、連接用內(nèi)網(wǎng)標(biāo)準(zhǔn)版cm*natpro*y搭建的FTP服務(wù),必須要用PASV方式。連接任何公網(wǎng)FTP服務(wù)器、或用內(nèi)網(wǎng)專(zhuān)業(yè)版TrueHost搭建的FTP服務(wù)器,PORT方式和PASV方式都可以使用。
當(dāng)然,使用PORT方式的時(shí)候,還要滿(mǎn)足上面的兩個(gè)條件。
四、常見(jiàn)的FTP客戶(hù)端軟件PORT方式與PASV方式的切換方法。
大部分FTP客戶(hù)端默認(rèn)使用PASV方式。IE默認(rèn)使用PORT方式。
在大部分FTP客戶(hù)端的設(shè)置里,常見(jiàn)到的字眼都是“PASV”或“被動(dòng)模式”,極少見(jiàn)到“PORT”或“主動(dòng)模式”等字眼。因?yàn)?span lang=EN-US>FTP的登錄方式只有兩種:PORT和PASV,取消PASV方式,就意味著使用PORT方式。
IE:
工具 -> Internet選項(xiàng) -> 高級(jí) -> “使用被動(dòng)FTP”(需要IE6.0以上才支持)。
CuteFTP:
Edit -> Setting -> Connection -> Firewall -> “PASV Mode”
或
File -> Site Manager,在左邊選中站點(diǎn) -> Edit -> “Use PASV mode”
FlashGet:
工具 -> 選項(xiàng) -> 代理服務(wù)器 -> 直接連接 -> 編輯 -> “PASV模式”
FlashFTP:
選項(xiàng) -> 參數(shù)選擇 -> 代理/防火墻/標(biāo)識(shí) -> “使用被動(dòng)模式”
或
站點(diǎn)管理 -> 對(duì)應(yīng)站點(diǎn) -> 選項(xiàng) -> “使用被動(dòng)模式”
或
快速連接 -> 切換 -> “使用被動(dòng)模式”
LeechFTP:
Option -> Firewall -> Do not Use
五、請(qǐng)盡量不要用IE作為FTP客戶(hù)端
IE只是個(gè)很粗糙的FTP客戶(hù)端工具。首先,IE6.0以下的版本不支持PASV方式;其次,IE在登錄FTP的時(shí)候,看不到登錄信息。在登錄出錯(cuò)的時(shí)候,無(wú)法找到錯(cuò)誤的原因。在測(cè)試自己的FTP網(wǎng)站的時(shí)候,強(qiáng)烈建議不要使用IE。
FTP建站的詳細(xì)配置過(guò)程
請(qǐng)參考這個(gè)網(wǎng)頁(yè)的說(shuō)明來(lái)配置:
使用Serv-U建立FTP網(wǎng)站
高級(jí)話(huà)題
①、為什么沒(méi)有公網(wǎng)IP,也能使用PORT方式登錄FTP?
NAT 網(wǎng)關(guān)的工作方式是在TCP/IP數(shù)據(jù)包的包頭里找局域網(wǎng)的源地址和源端口,替換成網(wǎng)關(guān)的地址和端口。對(duì)數(shù)據(jù)包里的內(nèi)容,是不會(huì)改變的。而使用PORT方式 登錄FTP的時(shí)候,IP地址與端口信息是在數(shù)據(jù)包里面的,而不是在包頭。因此,沒(méi)有公網(wǎng)IP,使用PORT方式是無(wú)法從internet上的ftp服務(wù)器 下載數(shù)據(jù)的。
但是,極少數(shù)的NAT網(wǎng)關(guān)也支持PORT方式。這些NAT網(wǎng)關(guān)連數(shù)據(jù)包里面的內(nèi)容都掃描,掃描到 PORT指令后會(huì)替換PORT方式的IP和端口。在這種NAT網(wǎng)關(guān)下面,用PORT方式就沒(méi)問(wèn)題了。不過(guò),這些網(wǎng)關(guān)也只掃描21端口的數(shù)據(jù)包,如果FTP 服務(wù)器不是用默認(rèn)的21端口,也無(wú)法使用PORT方式。
②、內(nèi)網(wǎng)可以用PORT訪(fǎng)問(wèn)其他FTP,為什么不能用PORT訪(fǎng)問(wèn)自己的TrueHost FTP?
下面要討論的問(wèn)題,只是為了說(shuō)明一些原理,是不影響實(shí)際使用的。如果您沒(méi)有興趣深究這些原理,不必花時(shí)間看。
內(nèi)網(wǎng)用戶(hù)通過(guò)支持PORT方式的NAT網(wǎng)關(guān),訪(fǎng)問(wèn)自己本機(jī)利用TrueHost建立的FTP服務(wù)器,FTP命令鏈路的建立過(guò)程如下:
FTP客戶(hù)端
10.10.0.1
端口*** <==> ISP NAT網(wǎng)關(guān)
61.144.1.2
端口**** <==> TH服務(wù)器
*.*.*.*
端口21 <==> TH客戶(hù)端 <==> 用戶(hù)FTP服務(wù)器
10.10.0.1
端口21
FTP客戶(hù)端通過(guò)ISP的NAT網(wǎng)關(guān)、科邁TrueHost服務(wù)器、TrueHost客戶(hù)端,連接用戶(hù)本機(jī)的FTP服務(wù)器的21端口。
當(dāng)需要下載數(shù)據(jù)的時(shí)候,FTP客戶(hù)端通過(guò)這條命令鏈路,向FTP服務(wù)器發(fā)送PORT命令。假設(shè)命令為:
PORT 10,10,0,1,30,4 (即IP=10.10.0.1 端口=30*256+4=7684)
當(dāng)命令通過(guò)ISP的NAT網(wǎng)關(guān)的時(shí)候,NAT網(wǎng)關(guān)判斷目的端口是21,并且是PORT命令,于是,修改命令里的IP和端口,替換為自己的IP和端口,比如:
PORT 61,144,1,2,50,6 (即IP=61.144.1.2 端口=50*256+6=12806)
用戶(hù)的FTP服務(wù)器最終收到的是上面這個(gè)PORT命令。于是,FTP服務(wù)器向這個(gè)IP和端口發(fā)送連接請(qǐng)求,建立數(shù)據(jù)鏈路。
用戶(hù)FTP服務(wù)器
10.10.0.1
端口20 <==> ISP NAT網(wǎng)關(guān)
61.144.1.2
端口12806 <==> FTP客戶(hù)端
10.10.0.1
端口7684
但 是,因?yàn)?span lang=EN-US>NAT網(wǎng)關(guān)的公網(wǎng)IP只能接收外來(lái)的連接請(qǐng)求。就是說(shuō),61.144.1.2:12806只能接收其他公網(wǎng)IP的連接請(qǐng)求,對(duì)于從NAT內(nèi)部 (10.10.0.1:20)發(fā)起的連接請(qǐng)求,是無(wú)法建立連接的。為什么?原因很簡(jiǎn)單,因?yàn)閮?nèi)網(wǎng)IP要訪(fǎng)問(wèn)外網(wǎng),必須要通過(guò)NAT建立映射。于是FTP數(shù) 據(jù)鏈路無(wú)法建立。于是,用戶(hù)無(wú)法在自己的機(jī)器上通過(guò)21端口訪(fǎng)問(wèn)自己的TrueHost FTP。
我們?cè)賮?lái)看看,如果FTP端口不是 21,比如是22,會(huì)發(fā)生什么情況呢?在FTP客戶(hù)端發(fā)送PORT命令的時(shí)候,NAT網(wǎng)關(guān)檢測(cè)到目標(biāo)端口是22,因?yàn)橹С?span lang=EN-US>PORT的 NAT網(wǎng)關(guān)只監(jiān)視目的端口是21的數(shù)據(jù)包,發(fā)現(xiàn)目的端口是22的數(shù)據(jù)包,不做任何處理,完全放行。于是FTP服務(wù)器收到的PORT命令依然是PORT 10,10,0,1,30,4。于是FTP服務(wù)器向這個(gè)IP和端口發(fā)送連接請(qǐng)求。
用戶(hù)FTP服務(wù)器
10.10.0.1
端口20 <==> FTP客戶(hù)端
10.10.0.1
端口7684
這種情況下命令鏈路就可以建立起來(lái)了。而且是等于本機(jī)連接本機(jī),速度飛快。
綜上所述,內(nèi)網(wǎng)用戶(hù)無(wú)法用PORT方式通過(guò)21端口訪(fǎng)問(wèn)自己的TrueHost FTP服務(wù)器。如果FTP端口不是21,則可以訪(fǎng)問(wèn),而且實(shí)際上是本機(jī)連接本機(jī)。
function forumhottag_callback(data){ tags = data; } parsetag();
function forumhottag_callback(data){ tags = data; } parsetag();