FTP (File Transfer Protocol) 定義於 RFC 959,是網際網路最早的標準協議之一。深入理解其**五大軟體元素交互**、**雙通道架構**、**四大傳輸屬性協商**、**指令/回應格式**,是架設、除錯、優化 FTP 服務的理論基石。
| 元素 | 角色 | 核心職責 |
|---|---|---|
| 使用者介面 (User Interface) | 人機交互 | 提供 CLI/GUI,調用客戶端 PI 服務 |
| 客戶端 PI (Client Protocol Interpreter) | 控制連線發起端 | 發送 FTP 指令、驅動客戶端 DTP、解譯伺服器回應 |
| 伺服器 PI (Server Protocol Interpreter) | 控制連線接收端 | 監聽埠 21、解譯指令、回應狀態碼、驅動伺服器 DTP |
| 客戶端 DTP (Client Data Transfer Process) | 資料連線客戶端 | 與伺服器 DTP 交換資料、對接本地檔案系統 |
| 伺服器 DTP (Server Data Transfer Process) | 資料連線伺服器端 | 與客戶端 DTP 交換資料、對接伺服器檔案系統 |
關鍵點:PI 與 DTP 通常整合在同一程式模組;使用者介面非協議標準一部分。
優勢**:
① 服務品質分離:控制連線優先低延遲,資料連線優先高吞吐。
② 避免指令與資料流混淆,無需跳脫字元機制。
③ 支援第三方傳輸 (FXP):Client A 告訴 Server 1 連線 Server 2,實現伺服器間直傳。
被動模式 (PASV)**:客戶端發送 `PASV`,伺服器回應監聽 IP:Port,客戶端主動連線資料埠,適用於客戶端處於 NAT/防火牆後場景。
| 屬性 | 選項 | 說明 |
|---|---|---|
| 檔案類型 (TYPE) | ASCII (A) | 文字檔:本地格式 ↔ NVT-ASCII (CRLF 換行),雙向轉換。Unix 間傳輸文字檔體積變大因 CRLF。 |
| EBCDIC (E) | 大型機字元集,類似 ASCII 轉換邏輯。 | |
| Image/二進位 (I) | 位元級完全複製,無轉換。最常用、最安全。 | |
| Local (L) | 非 8-bit 位元環境,由發送端指定位元長度。 | |
| 格式控制 (FORM) | Non-print (N) | 無列印格式控制 (預設)。 |
| Telnet (T) | 內含 Telnet 控制字元。 | |
| Fortran (F) | Fortran 列印控制,極少用。 | |
| 結構 | File (F) | 連續位元組流,無內部結構 (預設、最常用)。 |
| Record (R) | 記錄序列,僅適用文字檔。 | |
| Page/Block (P) | 分頁/區塊結構,帶頁碼順序傳輸,極少用。 | |
| 傳輸模式 (MODE) | Stream (S) | 位元組流模式 (預設、最常用)。 |
| Block (B) | 區塊鏈結,每區塊含頭部。 | |
| Compressed (C) | 游程長度編碼壓縮 (RLE),現多由應用層/工具完成。 |
協商機制**:客戶端提議 → 伺服器接受/拒絕 (錯誤碼) → **無協商回退機制**。實務上絕大多數傳輸採用 `TYPE I` + `STRU F` + `MODE S`。
指令格式:`<指令碼> [參數]
回應格式:`<三位數碼> [訊息]
| 指令 | 功能 | 備註 |
|---|---|---|
| ABOR | 中止傳輸 | |
| ACCT* | 帳號關聯 | 少用 |
| ALLO* | 預留空間 | 參數為位元組數 |
| APPE* | 附加寫入 | 少用 |
| CDUP | 切換至父目錄 | |
| CWD | 變更工作目錄 | |
| DELE | 刪除檔案 | |
| HELP | 取得說明 | 回應支援指令清單 |
| LIST | 目錄詳細列表 | 需資料連線 |
| MKD | 建立目錄 | |
| MODE | 設定傳輸模式 | S/B/C |
| NLST | 精簡目錄列表 | 需資料連線 |
| NOOP | 空操作 (保持連線) | |
| PASS | 送出密碼 | 緊接 USER 之後 |
| PASV* | 被動模式 | 伺服器監聽資料埠 |
| PORT | 指定客戶端資料埠 | 主動模式核心 |
| PWD | 顯示當前目錄 | |
| QUIT | 登出並斷開 | |
| REIN* | 重新初始化 | 不斷控制連線,需新 USER |
| REST* | 斷點續傳 | 標記位移 |
| RETR | 下載檔案 | 核心指令 |
| RMD | 刪除目錄 | |
| RNFR* | 重命名來源 | 必接 RNTO |
| RNTO* | 重命名目標 | |
| SITE* | 站點專用指令 | 擴展功能 |
| SMNT* | 掛載檔案系統 | 少用 |
| STAT* | 狀態資訊 | |
| STOR | 上傳檔案 (覆蓋) | 核心指令 |
| STOU* | 上傳不覆蓋 | 唯一檔名 |
| STRU | 設定檔案結構 | F/R/P |
| SYST* | 查詢作業系統類型 | |
| TYPE | 設定檔案類型 | A/E/I/L (常用 A/I) |
* 為選用指令,具體實作常不支援。
| 範圍 | 含義 | 動作 |
|---|---|---|
| 1yz | 肯定初步回應 | 等待後續回應 |
| 2yz | 肯定完成回應 | 指令成功,可發送新指令 |
| 3yz | 肯定中間回應 | 需發送進一步指令 (如 PASS) |
| 4yz | 暫時否定回應 | 指令失敗,可重試 |
| 5yz | 永久否定回應 | 指令失敗,不應重試 |
第二位數 `y` 細分:0=語法、1=資訊、2=連線、3=認證/計費、4=保留、5=檔案系統。
| 碼 | 含義 |
|---|---|
| 125 | 資料連線已開啟,開始傳輸 |
| 200 | 指令 OK |
| 220 | 服務就緒 |
| 221 | 服務關閉控制連線 |
| 230 | 使用者登入成功 |
| 331 | 使用者名稱 OK,需密碼 |
| 425 | 無法開啟資料連線 |
| 450 | 檔案動作未執行 (忙/不可用) |
| 452 | 寫入檔案錯誤 (空間不足) |
| 500 | 語法錯誤/指令不支援 |
| 530 | 未登入 |
| 550 | 檔案動作未執行 (不存在/無權限) |
FTP 協議看似古老,其**雙通道分離、屬性協商、指令/回應標準化**設計思想仍具現代啟發。掌握 RFC 959 核心規範,配合 `tcpdump`/`Wireshark` 抓包分析控制/資料連線交互,即可精準診斷「能登入卻無法列表」、「被動模式連不上」、「ASCII 模式二進位檔損壞」等經典疑難雜症。wu-ftpd 官方站點:https://www.wu-ftpd.org。