文件传输协议用于在计算机网络上的客户端和服务器之间传输计算机文件的标准网络协议。
FTP建立在客户端-服务器模型架构上,在客户端和服务器之间使用单独的控制和数据连接。[1]FTP用户可以使用明文登录协议(通常以用户名和密码的形式)进行身份验证,但如果服务器配置允许,则可以实现匿名连接。为了实现保护用户名和密码并加密内容的安全传输,FTP通常使用SSL/TLS协议 (FTPS)来保护,或者用SSH文件传输协议(SFTP)来代替。
第一个FTP客户端应用程序是在操作系统具有图形用户界面之前开发的命令行程序,并且仍然集成在大多数Windows、Unix和Linux操作系统里。[2][3] 此后,许多FTP客户端和自动化实用程序已被开发用于台式机、服务器、移动设备和硬件设备,而FTP也已集成到生产力应用程序中,如超文本标记语言(HTML)编辑器。
FTP可以在主动或被动模式下运行,这决定了数据连接的建立方式。[5] 在这两种情况下,客户端都会创建一个从随机N端口(通常是非特权端口)到FTP服务器命令21端口的TCP控制连接。
这两种模式都在1998年9月进行了可以支持IPv6的更新。当时对被动模式进行了进一步的修改,将其更新为扩展被动模式。[7]
服务器的响应由控制连接(control connection)返回,使用ASCII中的三位数状态码外加一个可选的文本消息组成。例如,“200”(或“200OK”)表示上一条命令是成功的。数字表示响应的代码,可选文本表示人类可读的解释或请求(例如<存储文件需要帐户>)。[1] 通过在控制连接上发送一个中断消息可以终止正在数据连接上进行的文件传输。
在通过网络传输数据时,可以使用四种数据表示形式,分别是:[2][3][4]
对于文本文件提供了不同的格式控制和记录结构选项。这些功能是为了方便包含Telnet或ASA的文件传输而设计的。
一些FTP软件还采用了一种基于DEFLATE算法的压缩模式,有时在启用它的命令后也会称为“Z模式”。该模式在一个互联网草案(Internet Draft)中有描述,但未标准化。[8]
FTP登录使用常规用户名和密码方案来授予访问权限。[2]用户名使用USER命令发送到服务器,密码使用PASS命令发送。[2] 该序列在传输线路上并未加密的,因此可能容易受到网络嗅探攻击。[9] 如果服务器接受客户端提供的信息,就会向客户端发送问候语,然后会话将开始。[2] 如果服务器支持,用户可以在不提供登录凭据的情况下登录,但同一服务器可能对该类会话只提供受限的访问。[2]
提供FTP服务的主机可以提供匿名FTP访问。[2] 当提示输入用户名时,用户通常使用“anonymous”(在某些FTP服务器为小写并要区分大小写)帐户登录服务(系统)。虽然用户通常被要求发送他们的电子邮件地址而不是密码,[3] 但实际上并没有对用户提供的数据进行验证。[10]许多FTP主机以提供软件更新为目的,所以会允许匿名登录。[3]
在客户端发送PORT命令后,FTP通常通过让服务器连接回客户端来传输数据。这对于NAT和防火墙来说都是有问题的,因为它们不允许互联网连接到内部主机。[11] 对于NAT来说,还有一个更复杂的问题是PORT命令中的IP地址和端口号表示是指NAT内部主机的IP地址和端口,而不是NAT的公共IP地址和端口。
有两种方法可以解决这个问题。一种方法是,FTP客户端和FTP服务器使用PASV命令,这将导致建立从FTP客户端到服务器的数据连接。[11] 现代FTP客户端广泛使用了这种方法。另一种方法是从NAT着手,为达到这一目的而使用应用程序级网关来修改PORT命令的值。[11]
HTTP本质上修复了FTP中的缺陷,这些缺陷使得许多网页中常见的小型临时传输不方便使用。
FTP通过一个有状态的控制连接来维护当前的工作目录和其他标志,并且每次传输都需要一个辅助连接来传输数据。在“被动”模式下,该辅助连接是从客户端到服务器,而在默认的“主动”模式下,该连接则是从服务器到客户端。这种在主动模式下明显的角色转换,以及所有传输都使用随机端口号,就是防火墙和NAT网关难以使用FTP的原因。HTTP是无状态协议,并且在熟知的端口号上通过从客户端到服务器的单个连接上多路复用控制和数据,这种方式使得HTTP很容易通过NAT网关和防火墙。
由于发送所有必须命令和等待响应的往返延迟,使得建立FTP控制连接非常慢,因此一贯的处理方法是,建立起一条控制连接后并保持链接对多个文件传输开放,而不是每次都中断关闭并重新建立会话。相比之下HTTP独创性的在每次传输后都会中断连接,因为这样做并不花太多功夫。虽然随后HTTP也增加了在多个传输中复用TCP连接的能力,但其概念模型仍然是独立的请求而不是会话。
当FTP通过数据连接传输时,控制连接处于空闲状态。如果传输时间过长,防火墙或NAT可能会认为控制连接已关闭并停止跟踪,从而导致连接关闭并造成下载中断。单个HTTP连接仅在请求之间处于空闲状态,这是正常的,并且在超时后会中断连接。
大多数常见的网页浏览器可以检索托管在FTP服务器上的文件,尽管他们可能不支持FTPS之类的协议扩展。[3][12] 当提供FTP(而不是一个HTTP)网址时,远程服务器上的可访问内容以类似于其他网络内容的方式显示。一个功能齐全的FTP客户端可以在火狐浏览器(Firefox)中以名为FireFTP扩展组件的形式运行。
FTP URL语法在1738号RFC文档中有描述,其格式为: ftp: @]host /url-path(方括号中的部分可选)。
例如,URL为ftp: public.ftp-servers.example.com/mydirectory/myfile.txt指的是,将服务器public.ftp-servers.example.com上目录为mydirectory下的文件myfile.txt作为FTP资源。URL为ftp:user 001:secretpassword @ private . FTP-servers . example . com/my directory/my file.txt则添加了关于用户名和密码的规范,即访问此资源必须使用该用户名和密码。
关于指定用户名和密码的更多细节可以在浏览器文档中找到(例如火狐浏览器(Firefox)[13] 和IE浏览器[14])。默认情况下,大多数网页浏览器使用被动(PASV)模式,这种模式更方便终端用户穿越防火墙。
在用户有非根目录的情况下,不同浏览器处理路径解析的方式存在一些差异。[15]
FTP并不是一项安全的协议,它有许多安全漏洞。[16] 1999年5月,2577号RFC文档的作者列出了容易受下列问题影响的漏洞:
暴力破解
FTP跳转攻击
数据包捕获
端口窃取(猜测下一个开放端口并窃取合法连接)
IP欺骗攻击
用户名枚举
DoS攻击或DDos攻击
FTP不对其传输内容加密;所有传输都是明文形式,任何能够在网络上执行数据包捕获(嗅探)的人都可以读取用户名、密码、命令和数据。[2][16] 这个问题在加密机制(如TLS或SSL)产生之前的许多网际协议规范(如SMTP、Telnet、POP和IMAP)中较为普遍。[4]
这个问题的常见解决方案包括:
1. 使用非安全协议的安全版本,例如FTPS代替FTP,TelnetS代替Telnet。
2. 使用不同的、更安全的协议来处理作业,例如SSH文件传输协议或安全拷贝协议。
3. 使用安全隧道,如安全外壳协议(SSH)或虚拟专用网络(VPN)。
SSH上的FTP是通过安全外壳连接隧道传输正常FTP会话的做法。[16] 因为FTP使用多个TCP连接(对于仍在使用的TCP/IP协议来说是不常见的),所以通过SSH进行隧道传输尤其困难。对于许多SSH客户端,尝试为控制通道(21端口上的初始客户端到服务器连接)建立隧道将仅仅保护该通道;传输数据时,两端的FTP软件都会建立新的TCP连接(数据通道),因此没有机密性或完整性保护可言。
另外,SSH客户端软件必须具备特定的FTP协议知识,才能监控和重写FTP控制信道消息,并自主为FTP数据信道开启新的数据包转发。支持这种模式的软件包包括:
显式FTPS是FTP标准的扩展,可以让客户端请求加密FTP会话。这是通过发送“AUTH TLS”命令来完成的。服务器可以选择允许或拒绝不请求TLS的连接。217号RFC文档中定义了该扩展协议。隐式FTPS是一个过时的FTP标准,它要求使用SSL或TLS连接。它被指定使用不同于普通FTP的端口。
SSH文件传输协议(按时间顺序,这两个协议中的第二个缩写为SFTP)传输文件并为用户提供了类似的命令集,但是使用安全外壳协议(SSH)来传输文件。与FTP不同,它对命令和数据同时加密,防止密码和敏感信息在网络上公开传输。它不能与FTP软件进行互操作。
小型文件传输协议(TFTP)是一种简单的锁步FTP,客户端可以从远程主机获取文件或将文件放入远程主机。因为TFTP的实现非常简单,所以它的最初用途之一是在早期局域网启动阶段作为内部文件传输的方式。TFTP缺乏安全性,同时也不具有FTP等更强大的文件传输协议所提供的大多数高级功能。TFTP首次标准化是在1981年,目前的协议规范可以在1350号RFC文档中找到。
简单文件传输协议(缩写为SFTP的第一个协议)由193号RFC文档定义,是一个(不安全的)文件传输协议,其复杂程度介于TFTP和FTP之间。它从未在互联网上被广泛接受,而现在被国际互联网工程任务组(IETF)赋予了历史地位。该协议运行在115端口上,并且经常接收SFTP的初始化。它有一个由11个命令组成的命令集,并支持三种类型的数据传输:ASCII模式、二进制模式和连续模式。对于字长为8比特倍数的系统,对二进制模式和连续模式的操作是相同的。该协议也支持使用用户名和密码登录、分层文件夹和文件管理(包括重命名、删除、上传、下载、覆盖下载和附加下载)。
以下是FTP服务器可能返回的FTP应答码的摘要。这些代码已由IETF在959号RFC文档中标准化。应答码是一个三位数的值。第一个数字用于表示三种可能结果之一——成功、失败,或者表示错误或应答不完整:
2yz–应答成功
4yz或5yz–应答失败
1yz或3yz–错误或应答不完整
第二个数字定义了错误的种类:
x0z–语法。这些应答涉及语法错误。
x1z–信息。对信息请求的应答。
x2z–连接。涉及控制和数据连接的应答。
x3z–鉴权和登陆过程。鉴权认证和登陆过程的应答应答。
x4z–未定义。
x5z–文件系统。这些应答转发自服务器文件系统的状态代码。
回复代码的第三个数字用来为第二个数字定义的每个类别的提供细节补充。
^Forouzan, B.A. (2000). TCP/IP: Protocol Suite (1st ed.). New Delhi, India: Tata McGraw-Hill Publishing Company Limited..
^Kozierok, Charles M. (2005). "The TCP/IP Guide v3.0". Tcpipguide.com..
^Dean, Tamara (2010). Network+ Guide to Networks. Delmar. pp. 168–171..
^Clark, M.P. (2003). Data Networks IP and the Internet (1st ed.). West Sussex, England: John Wiley & Sons Ltd..
^"Active FTP vs. Passive FTP, a Definitive Explanation". Slacksite.com..
^RFC 959 (Standard) File Transfer Protocol (FTP). Postel, J. & Reynolds, J. (October 1985)..
^RFC 2428 (Proposed Standard) Extensions for IPv6, NAT, and Extended Passive Mode. Allman, M. & Metz, C. & Ostermann, S. (September 1998)..
^Preston, J.. Deflate transmission mode for FTP. IETF. January 2005 [27 January 2016]. I-D draft-preston-ftpext-deflate-03.txt..
^Prince, Brian. "Should Organizations Retire FTP for Security?". Security Week. Security Week. Retrieved 14 September 2017..
^RFC 1635 (Informational) How to Use Anonymous FTP. P. & Emtage, A. & Marine, A. (May 1994)..
^Gleason, Mike (2005). "The File Transfer Protocol and Your Firewall/NAT". Ncftp.com..
^Matthews, J. (2005). Computer Networking: Internet Protocols in Action (1st ed.). Danvers, MA: John Wiley & Sons Inc..
^"Accessing FTP servers | How to | Firefox Help". Support.mozilla.com. 2012-09-05. Retrieved 2013-01-16..
^"How to Enter FTP Site Password in Internet Explorer". Support.microsoft.com. 2011-09-23. Retrieved 2015-03-28. Written for IE versions 6 and earlier. Might work with newer versions..
^Jukka “Yucca” Korpela (1997-09-18). "FTP URLs". "IT and communication" (www.cs.tut.fi/~jkorpela/). Retrieved 2016-01-06..
^"Securing FTP using SSH". Nurdletech.com..
^"Access using SSH keys & PCI DSS compliance". ssh.com..
暂无