檔案傳輸協定(FTP)
/ eff-tee-PEE /
FTP 是網際網路上最古老的應用協定之一,為單一任務而生:在用戶端與伺服器之間搬移整個檔案——上傳與下載。早在網頁出現之前,你若想抓一支程式、或把一份文件發布到伺服器,用的就是 FTP。它留下的恆久啟示是一個由它首創的設計選擇:它把工作分到兩條獨立的連線上,一條負責交談,一條負責運送貨物。
不尋常之處在這裡。FTP 使用一條控制連線(control connection)與一條資料連線(data connection)。用戶端先開一條到伺服器的控制連線(TCP port 21),並在其上以可讀的文字送出命令——登入、切換目錄、列出檔案、「請把 report.pdf 傳給我」。但檔案內容本身並不走那條控制連線。每一次傳輸,都另開一條資料連線專門承載該檔的位元組,那個檔傳完它就關閉;而控制連線在整個會話期間都保持開著,負責協調。這稱為頻外控制(out-of-band control):命令與資料搭在不同的通道上。(究竟由誰來開那條資料連線,正是把 FTP 分成「主動」與「被動」兩種模式的細節,這很要緊,因為防火牆與 NAT 對主動模式很頭痛。)
把控制與資料分開是個乾淨的構想——你能在一個檔案傳輸途中發出新命令或中止傳輸——它也影響了後來的協定設計。但傳統 FTP 有個嚴重而誠實的缺陷:它把一切,包括你的帳號與密碼,都以可讀的純文字、毫不加密地送出。任何在網路上監看的人都能讀到你的憑證。這就是為什麼對任何敏感事務,純 FTP 大多已被安全的替代品取代,例如 SFTP(透過 SSH 的檔案傳輸)與 FTPS(包在 TLS 裡的 FTP),也是你在現代網頁上很少遇到赤裸 FTP 的原因。
你連到 ftp.example.com 的 port 21、登入、打「GET report.pdf」。控制連線承載這個命令與伺服器「OK,開啟資料連線」的回覆;接著一條第二、獨立的連線冒出來,專門串流 report.pdf 的位元組,等檔案完整抵達後便關閉。
FTP 把命令放在控制連線上,把檔案位元組放在另一條獨立的資料連線上。
純 FTP 什麼都不加密——憑證與檔案都以明文傳送。SFTP 與 FTPS 是不同的、有加密的協定;別只因為一次傳輸成功了,就以為「FTP」是安全的。