文件传输协议

文件传输协议（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实现的目标

- 促进文件的共享（计算机程序或数据）

<image>

- 鼓励间接或者隐式的使用远程计算机
- 向用户屏蔽不同主机中各种文件存储系统（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已被废除。