簡單介紹FTP

Michael
7 min readSep 9, 2021

--

最近在因緣際會下稍微研究了一下FTP,以前都只是會用而已根本不管他背後是怎麼搞的XD

雖然網路上可以找到很多相關文章,我還是以我自己理解的方式記錄下吧!

What is FTP?

FTP是File Transfer Protocol的縮寫,是一種基於TCP的檔案傳輸協定,我們可以透過FTP在客戶端(Client)跟主機端(Server)進行檔案傳輸。

FTP在使用上會用到兩個port:

  1. data port
  2. 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,必須要確保:

  1. port 21要能接受來自任何地方的連線(client要能夠對server發起連線請求)
  2. port 21能夠將response回到client端的command port (>1024)
  3. port 20要能夠對client端的data port發起連線請求(>1024)
  4. port 20要能接受client端的ACKs(>1024)

畫成流程圖的話會是像這樣子:

(圖片來源:https://www.cosmos.esa.int/documents/772136/977578/psa_activeVsPassiveFtp.pdf/5e36a7b8-8732-4e65-ab6b-6cf94a742ea6)

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,必須要確保:

  1. port 21可以接受任何外部的連線
  2. port 21要能夠連到client端的command port (>1024)
  3. server端>1024的ports要能夠接受任何外部的連線(client端的data port連到server端隨機開的data port)
  4. 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

--

--