FTP

**檔案傳輸協定**（英語：**F**ile **T**ransfer **P**rotocol，縮寫 **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 實現的目標

1. 促進檔案的共享（電腦程式或資料）
2. 鼓勵間接或者隱式的使用遠端電腦
3. 向使用者封鎖不同主機中各種檔案儲存系統（File system）的細節
4. 可靠和高效的傳輸資料

## 主動和被動模式

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

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

1. 客戶端打開一個隨機的埠（埠號大於 1024，在這裡，我們稱它為 x），同時一個 FTP 行程連接至伺服器的 21 號命令埠。此時，該 tcp 連接的來源地埠為客戶端指定的隨機埠 x，目的地埠（遠端埠）為伺服器上的 21 號埠。
2. 客戶端開始監聽埠（x+1），同時向伺服器傳送一個埠命令（通過伺服器的 21 號命令埠），此命令告訴伺服器客戶端正在監聽的埠號並且已準備好從此埠接收資料。這個埠就是我們所知的資料埠。
3. 伺服器打開 20 號源埠並且建立和客戶端資料埠的連接。此時，來源地的埠為 20，遠端資料 (目的地) 埠為（x+1）。
4. 客戶端通過原生的資料埠建立一個和伺服器 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 格式已在 RFC 1738 指定，格式為：`ftp://[user[:password]@]host[:port]/url-path`（方括號內為可選參數）。

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

### 下載管理器

大部分常見的下載管理器都可以收取 FTP 伺服器上代管的檔案，其中一些還提供介面來檢索 FTP 伺服器上代管的檔案。DownloadStudio 和 Internet Download Accelerator 既能從 FTP 伺服器下載檔案，又能檢視 FTP 伺服器上的檔案。

### 其他

LibreOffice 支援打開 FTP 伺服器上的檔案，但從 7.4 版本起，這一功能被標記為過時，開發者打算在將來的版本中將其移除。

## 安全性

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

* 暴力破解
* FTP 反彈攻擊
* 封包擷取
* 埠竊取（猜測下一個開放埠並篡奪合法連接）
* 欺騙攻擊
* 使用者名稱列舉

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

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

1. 使用協定的安全版本，例如 FTPS 而不是 FTP，TelnetS 而不是 Telnet。
2. 使用可以處理作業的不同的，更安全的協定，例如 SSH 檔案傳輸協定或安全複製協定 。
3. 使用安全隧道（如 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）由 RFC 913 定義，其複雜程度介於 TFTP 和 FTP 之間。它從未在網際網路上被廣泛接受。它通過埠 115 執行，支援三種類型的資料傳輸： ASCII 、 二進位和連續。該協定還支援使用使用者名稱和密碼登入、資料夾和檔案管理（包括_重新命名_、_刪除_、_上傳_、_下載_）。

## 參考文獻

### 參照

### 來源

## 參見

* 小檔案傳輸協定（TFTP）
* SSH 檔案傳輸協定（SSH file transfer protocol）
* 安全 FTP（Secure FTP）
* FTPS
* 簡單檔案傳輸協定（Simple File Transfer Protocol）
* WS FTP（FTP 工具）
* FTP 客戶端比較
* FTP 伺服器列表

## 外部連結