文件傳輸協議

文件傳輸協議（File Transfer Protocol，縮寫：FTP）是在電腦網絡的客戶端和伺服器間傳輸文件的應用層協議。傳送文件（file transfer）和存取文件（file access）之間的區別在於：前者由FTP提供，後者由NFS等應用系統提供。由RFC 959規範。

FTP是8位的客戶端－伺服器協議，能操作任何類型的文件而不需要後續處理，就像MIME或Unicode一樣，但FTP有極高的延時，意味從開始請求到第一次接收數據間的時間非常長；並且必須不時執行一些冗長的登錄進程。

## 歷史

Abhay Bhushan編寫原始規範，並於1971年4月16日作為RFC 114發布。直到1980年，FTP才在TCP/IP的前身NCP運行。該協議先被TCP/IP版本，RFC 765（1980年6月）取代，後來又被 RFC 959（1985年10月）所取代，這也是當前規範。RFC 959提出了若干標準修改，例如 RFC 1579（1994年2月）使 FTP 能夠穿越NAT與防火牆（被動模式），RFC 2228（1997年6月）提出安全擴展，RFC 2428（1998年9月）增加了對IPv6的支持，並定義了一種新型的被動模式。

## 概述

FTP服務一般運行在20和21兩個埠。埠20用於在客戶端和伺服器之間傳輸數據流，而埠21用於傳輸控制流，並且是命令通向ftp伺服器的進口。當數據通過數據流傳輸時，控制流處於空閒狀態。而當控制流空閒很長時間後，客戶端的防火牆會將其會話置為超時，這樣當大量數據通過防火牆時，會產生一些問題。此時，雖然文件可以成功的傳輸，但因為控制會話，會被防火牆斷開；傳輸會產生一些錯誤。

FTP雖然可以被終端用戶直接使用，但是它是設計成被FTP客戶端程序所控制。

運行FTP服務的許多站點都開放匿名服務，在這種設置下，使用者不需要帳號就可以登錄伺服器，默認情況下，匿名使用者的使用者名稱是：「anonymous」。這個帳號不需要密碼，雖然通常要求輸入使用者的郵件地址作為認證密碼，但這只是一些細節或者此郵件地址根本不被確定，而是依賴於FTP伺服器的配置情況。

### FTP實現的目標

- 促進文件的共享（電腦程式或數據）
- 鼓勵間接或者隱式的使用遠程電腦
- 向使用者屏蔽不同主機中各種文件存儲系統（File system）的細節
- 可靠和高效的傳輸數據

## 主動和被動模式

FTP有兩種使用模式：主動和被動。主動模式要求客戶端和伺服器端同時打開並且監聽一個埠以建立連接。在這種情況下，客戶端由於安裝了防火牆會產生一些問題。所以，創立了被動模式。被動模式只要求伺服器端產生一個監聽相應埠的進程，這樣就可以繞過客戶端安裝了防火牆的問題。

一個主動模式的FTP連接建立要遵循以下步驟：

- 客戶端打開一個隨機的埠（埠號大於1024，在這裡，我們稱它為x），同時一個FTP進程連接至伺服器的21號命令埠。此時，該tcp連接的來源地埠為客戶端指定的隨機埠x，目的地埠（遠程埠）為伺服器上的21號埠。
- 客戶端開始監聽埠（x+1），同時向伺服器發送一個埠命令（通過伺服器的21號命令埠），此命令告訴伺服器客戶端正在監聽的埠號並且已準備好從此埠接收數據。這個埠就是我們所知的數據埠。
- 伺服器打開20號源埠並且建立和客戶端數據埠的連接。此時，來源地的埠為20，遠程數據(目的地)埠為（x+1）。
- 客戶端通過本地的數據埠建立一個和伺服器20號埠的連接，然後向伺服器發送一個應答，告訴伺服器它已經建立好了一個連接。

## 軟體支持

### 瀏覽器

大部分常見的網頁瀏覽器都可以檢索FTP伺服器上託管的文件，儘管它們並不支持擴展協議，如FTPS。當瀏覽器訪問FTP格式的URL時，將以Web文件目錄顯示遠程伺服器上的可訪問內容。使用類似FireFTP客戶端可獲得FTP擴展協議的完整支持。

Chrome和Firefox等主流瀏覽器都將計劃棄用對FTP的支持，2019年推出的Chrome 82已停止對FTP支持，在2020年因COVID-19疫情增加的遠距辦公需求而短暫恢復FTP，但於2021年10月推出的Chrome95完全移除FTP相關程式碼。而Firefox原預定於版本77中停止支持FTP，最終在2021年7月發行的90版正式停止支援FTP協定。微軟的Edge瀏覽器也在2020年起停止支援FTP，Internet Explorer 11仍保留FTP使用者端，直到2022年6月15日終止支援。

#### 語法

FTP URL 格式已在指定，格式為：`ftp://[user[:password]@]host[:port]/url-path`（方括號內為可選參數）。

有關指定使用者名稱和密碼的更多詳細資訊，可以在瀏覽器的文檔中找到（例如Firefox和Internet Explorer）。默認情況下，大多數Web瀏覽器使用被動（PASV）模式，該模式更容易遍歷終端防火牆。

### 下載管理器

大部分常見的下載管理器都可以收取FTP伺服器上託管的文件，其中一些還提供界面來檢索FTP伺服器上託管的文件。

### 其他

LibreOffice支持打開FTP伺服器上的文件，但從7.4版本起，這一功能被標記為過時，最終於24.2版本中移除。

## 安全性

FTP不是一項安全的協議，並且具有許多安全漏洞。1999年5月發布的中列出了以下幾個主要的漏洞：

- 暴力破解
- FTP反彈攻擊
- 數據包捕獲
- 埠竊取（猜測下一個開放埠並篡奪合法連接）
- 欺騙攻擊
- 使用者名稱枚舉

通過FTP傳輸的流量不會被加密，所有傳輸通過明文進行的。任何能夠在網路上執行數據包捕獲（嗅探）的人都可以讀取使用者名稱、密碼、命令內容和數據。此問題在加密機制（如TLS或SSL）產生之前的許多Internet協議規範（如SMTP、Telnet、POP和IMAP）中較為普遍。

此問題的常見解決方案包括：

- 使用協議的安全版本，例如FTPS而不是FTP，TelnetS而不是Telnet。
- 使用可以處理作業的不同的，更安全的協議，例如 SSH文件傳輸協議或安全複製協議。
- 使用安全隧道（如Secure Shell或虛擬私人網路）。

## FTP 命令

可以被傳送到FTP伺服器的FTP命令列表，包含由IETF在RFC 959中標準化的所有命令。需要注意的是，大多數命令列FTP使用者端都給使用者提供了額外的命令集。例如，GET是一個常見的用來下載檔案的使用者命令，用來替代原始的RETR命令。

## FTP 伺服器返回碼

包含由IETF在RFC 959中標準化的所有伺服器返回碼。回復代碼是一個三位數值，第一個數字用於表示三種可能的結果之一————成功、失敗、表示錯誤或不完整的回覆。

## 衍生品

### FTPS

FTPS是FTP標準的擴展，添加了安全套接層（SSL）以及其繼任者傳輸層安全性協定（TLS）的支持。

### SSH文件傳輸協議

SSH文件傳輸協議（縮寫：SFTP）可用於傳輸文件並具有類似的使用者命令集，但使用Secure Shell協議（SSH）傳輸文件。與FTP不同，它對命令和數據進行加密，防止密碼和敏感資訊通過網路公開傳輸。它無法與FTP兼容。

### 小型文件傳輸協議

小型文件傳輸協議（Trivial File Transfer Protocol, TFTP），是一種於1981年在RFC 783中定義的簡化的文件傳輸協議（FTP）。

### 簡單文件傳輸協議

簡單文件傳輸協議（Simple File Transfer Protocol）由913定義，其複雜程度介於TFTP和FTP之間。它從未在網際網路上被廣泛接受。它通過埠115運行，支持三種類型的數據傳輸： ASCII、二進位和連續。該協議還支持使用使用者名稱和密碼登錄、文件夾和文件管理（包括重命名、刪除、上傳、下載）。

## 參考文獻

### 來源

- 《RFC 0959文件傳輸協議》. J. Postel; J. Reynolds. 1985.10（格式：文本，147316位元組. http://www.ietf.org/rfc/rfc959.txt）. 最早的RFC 114和之後的RFC 765已被廢除。