What is FTP?
FTP是File Transfer Protocol的縮寫,是一種基於TCP的檔案傳輸協定,我們可以透過FTP在客戶端(Client)跟主機端(Server)進行檔案傳輸。
FTP在使用上會用到兩個port:
- data port
- command port (或叫做control port)
一般來說server端的port 21通常是command port,而port 20是data port,但FTP有兩種不同的模式——主動模式(Active)及被動模式(Passive),而上面所說的是指主動模式。
Active FTP
在這個模式下,client端會隨機選則一個port(通常>1024)跟server端的command port(21)連線並告訴server自己會用哪一個port來傳輸資料(通常是N+1),接著server就會透過自己的data port(20)來跟client指定的傳輸port連線。
從server的角度來看,要能夠支援active mode,必須要確保:
- port 21要能接受來自任何地方的連線(client要能夠對server發起連線請求)
- port 21能夠將response回到client端的command port (>1024)
- port 20要能夠對client端的data port發起連線請求(>1024)
- port 20要能接受client端的ACKs(>1024)
畫成流程圖的話會是像這樣子:
Step 1:
client透過command port發送連線請求到server的command port,並告訴server自己的data port是1027(N+1)。
Step 2:
server回一個ACK到client的command port(1026)。
Step 3:
server會從自己的data port(20)跟client在Step 1指定的port(1027)做連線。
Step 4:
建立連線成功後client會回一個ACK給server的data port(20)。
Problem
Active mode中會有一個主要的問題,client端是隨機告訴server它要使用哪一個port當作data port,然後server在由port 20跟client指定的port連線。對client來說,這是一個外部網路要跟內部網路發起的連線,所以很多時候可能會被防火牆給擋住了。
Passive FTP
這是FTP的另一種模式,又叫做PASV,有client告訴server我現在使用的是passive mode。
這個模式主要就是來解決active mode會碰到的問題,server處於被動狀態,統一由client端主動對server發起連線請求。
一開始client端會先開兩個沒被使用的port N(N>1024與N+1),第一個port跟server端的command port(21)連線,與active mode不同的是:
- 在active mode下,client會告訴server說:“嗨!我用port N當作data port哦“
- 在passive mode則是告訴server:“嗨!我是用passive mode哦“
接著server就會隨機選擇一個未被使用的port P(P > 1024)回給client端,最後client就會使用data port(N+1)跟server的port P連線來傳輸資料。
同樣的,server要支援passive mode,必須要確保:
- port 21可以接受任何外部的連線
- port 21要能夠連到client端的command port (>1024)
- server端>1024的ports要能夠接受任何外部的連線(client端的data port連到server端隨機開的data port)
- server端>1024的ports要能夠連到遠端>1024的ports(server要回ACKs到client端的data port,當然還有資料傳輸)
一樣上個流程圖:
(來源同上面的Active mode)
Step 1:
跟active mode基本一樣,取而代之的是client主動跟server連線後告訴server使用passive mode而不是自己的data port。
Step 2:
server回ACK並告訴client自己開了一個data port。
Step 3:
client主動跟剛才server指定的data port連線。
Step 4:
最後server回一個ACK給client的data port。
Problem
Passive mode當然也是會有一些缺點的,在這個模式下最大的問題是,server自己>1024的port都必須對外開放才行,不過現在很多的FTP工具都可以限定port的range,所以其實也不用太過擔心。
另一個問題是,似乎不是所有的FTP client都有支援被動模式呢,一般人應該都是比較偏好使用瀏覽器當作FTP client,目前大部分的瀏覽器應該是都有支援passive mode了。
Summary
這邊提供一個比較好記的方式:
- Active FTP:
commnad:client ports > 1024 → server port 21
data:client ports > 1024 ← server port 20 - Passive FTP:
command:client ports > 1024 → server port 21
data:client ports > 1024 → server ports > 1024
簡單來說呢,active mode就是對client端的風險會比較高,因為client端必須將自己的一些port要對外開放,否則server要對client連線時很可能會被防火牆給擋住。
那passvie mode當然就是反過來啦,對server端相對高風險,因為server端要將自己的許多port都對外開放才能讓client端連線。
這邊我比較好奇的是為何passive mode的情況下server還要隨機指定data port,而不乾脆就繼續使用port 20就好呢?如果有知道的高手請歡迎在下面留言補充!
好啦,以上就是關於FTP的介紹,如果有任何地方我理解錯誤,希望大家能夠指出,免得誤導大家了XD