File Transfer Protocol(FTP) gaunthan Posted on May 26 2016 ? Application Layer ? ? Computer Networking ? ## 概述 **FTP**(File Transfer Protocol,文件传输协议)是TCP/IP提供的标准机制,用于将文件从一个主机复制到另一个主机。 <!--more--> FTP使用**客户端-服务器模型**,其中: - 客户有三个组件:客户接口、客户控制进程、客户数据传输进程。 - 服务器有两个组件:服务器控制进程、服务器数据传输进程。 控制连接是在控制进程之间进行的,而数据连接是在数据传输进程之间进行的。将命令和数据传输分开使得FTP效率更高。 ## FTP的连接 ### 简介 FTP有两种连接:**数据连接**和**控制连接**。它们有不同的寿命。在整个交互的FTP会话期间,控制连接始终处于连接状态,数据连接则在每次传输文件时开启然后关闭。每当涉及文件传输的命令被使用时,数据连接就被打开,而当文件传输完毕时连接就关闭。换言之,当用户开始FTP会话时,控制连接就被打开。在控制连接处于打开状态期间,如果传输多个文件,那么数据连接可以打开和关闭多次。FTP使用两个端口:端口`21`用于**控制连接**,端口`20`用于**数据连接**。 由于FTP使用一个独立的控制连接,所以也称FTP的控制信息是**带外**(out-of-band)传送的。相对应的,HTTP是**带内**(in-band)发送控制信息的,因为它是在传输文件的同一个TCP连接中发送请求和响应首部行的。 ### 控制连接 **控制连接**(control connection)用于在两主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及“存放(put)”和“获取(get)”文件的命令。 对于控制通信,FTP与TELNET一样使用NVT ASCII字符集。通信是通过**命令**和**响应**来完成的。这种简单方法适合控制连接。每一条命令或响应都是一个短行,因此不必担心它的文件格式或文件结构,每一行结束处是两个字符(回车和换行)的行结束标记。 #### 命令 在控制连接期间,命令从客户端发送到服务器,随后响应从服务器发送到客户端。从FTP客户控制进程发送的命令由4个7位的ASCII大写字母组成,有些还具有可选参数。为了区分连续的命令,每个命令后跟回车换行符。 一些常用命令在下表给出(为了可读性,我们使用小写来给出它们,实际上输入命令时,使用大小或小写都没关系。程序会替我们处理): |命令|功能|例子| |--|--|--| |open server|连接到指定的远程主机。|`open ftp.tr.debian.org`| |user username|向服务器传送用户标识username|| |pass password|向服务器传送口令password|| |lcd [local-diretory]|更改本地目录,下载的文件将保存到该目录|Windows: `lcd f:\tmp` <br> Linux: `lcd /tmp/`| |get [remote-file] <local-file>|从远程主机获取单文件|`get README.md`| |mget [remote-file]|从远程主机获取多文件|`mget *`| |put [local-file] [remote-file]|将一个本地文件传送到远程主机。|`put hello.mes /pub/`| |mput [local-file]|将多个本地文件传送到远程主机。|`mput *.c`| |bye|断开连接|| |**help [command]**|输出命令帮助信息|`help bye`| 通过在终端中输入`ftp`进入ftp交互终端。可以通过在终端中输入`ftp server_address`或在ftp交互终端中输入`open server_address`打开指定服务器的控制连接。 对于支持匿名访问的ftp服务器,其帐号为*anonymous*,密码任意,如:  #### 响应 每个FTP命令至少产生一个响应。一个响应有两部分: - 三位十进制数字,定义了编码。 - 跟随在数字后的文本部分,定义了需要的参数或进一步的解释。 三位十进制数字具有不同的含义: - 第一个数字定义了命令状态。 - 第二个数字定义了状态应用的区域。 - 第三个数字提供了额外信息。 一些常见响应如下: |编码|说明|编码|说明| |--|--|--|--| |125|数据连接打开|250|请求文件动作成功| |150|文件状态良好|331|用户名成功;需要密码| |200|命令成功|425|无法打开数据连接| |220|服务就绪|450|文件动作未被采用:文件不可用| |221|服务关闭|452|动作被放弃:磁盘空间不足| |225|数据连接打开|500|语法错误:无法识别的命令| |226|关闭数据连接|501|参数或变量语法错误| |230|用户登陆成功| ### 数据连接 #### 创建过程 数据连接的创建和控制连接是不同的,具体步骤如下: 1. 客户使用临时端口发起一个**被动打开**; 2. 客户使用`PORT`命令**发送临时端口号**到服务器; 3. 服务器接收到临时端口号,使用端口20发出**主动打开**。 通过数据连接通信,客户必须定义传输文件的类型、数据结构以及传输模式。 #### 文件类型 FTP可以在数据连接上传送下列文件中的一种: - ASCII文件 - EBCDIC(Extended Binary Coded Decimal Interchange Code)文件 - 图形文件 #### 数据结构 FTP可以使用下列数据结构中的一种在数据连接上传送文件: - 文件结构:默认没有结构,它是连续的字节流。 - 记录结构:把文件分成一些记录,只能用于文本文件。 - 页面结构:把文件划分成页面,每一个页面有一个页面号和页面头部,页面可以随机地或顺序地存储或访问。 #### 传输方式 FTP可以使用下列三种传输方式之一: - 流方式:默认方式,数据作为连续的字节流从FTP传递给TCP。 - 块方式:数据按块从FTP传递给TCP,每个块前面有一个3字节的头部,第一字节称为块描述符,后面两个字节以字节为单位定义块的大小。 - 压缩方式:通过协商规定的压缩算法把数据压缩后再以流方式传输。 ## Linux下搭建FTP服务器 ### 安装vsftpd #### Red Hat系列 sudo yum -y install vsftpd* #### Debian系列 sudo apt install vsftpd* -y ### 配置vsftpd vsftpd的配置文件为`/etc/vsftpd/vsftpd.conf`,根据需要对文件内容进行相应修改即可。其中比较重要的参数有: ``` anonymous_enable=yes/no # 是否允许匿名用户访问 anon_upload_enable=yes/no # 是否允许匿名用户上传文件 anon_mkdir_write_enable=yes/no # 是否允许匿名用户创建目录 anon_other_write_enable=yes/no # 匿名用户和虚拟用户是否拥有删除权限 local_enable=yes/no # 是否允许本地用户登陆 write_enable=yes/no # 设置全局是否可写 anon_root=/var # 指定匿名用户目录 chroot_local_user=yes # 锁定所有用户到用户主目录 chroot_list_enable=yes/no # 锁定列表中的用户到主目录,需要配合下一参数使用 chroot_list_file=/etc/vsftpd/chroot_list # 指定存储被锁定用户的列表文件位置 chown_uploads=yes/no # 匿名用户上传所有者指定功能,需要与下一参数配合使用 chown_username=用户名 # 指定匿名用户上传文件的所有者 max_clients=300 # 最大客户端连接数为300 anon_max_rate=30000 # 匿名用户和虚拟用户限速为30K/S local_max_rate=30000 # 本地用户限速为30K/S max_per_ip=10 # 每个IP最大连接数 listen_port=22 # 更改监听端口 ``` ### 启动服务 在Shell中输入以下命令以重新启动服务: sudo service vsftpd restart ### 访问ftp服务器 #### 服务器端防火墙的设定 由于Linux服务器防火墙的默认设置,从外部访问ftp会失败,需要先修改Linux服务器的防火墙设定,步骤如下: 1. 在Shell下输入`setup`并回车 2. 选择`firewall configuration` 3. 选择`Customize` 4. 在列表中勾选`FTP`后返回并保存退出 #### 使用Windows CMD匿名访问 在Windows下按下`Win+R`,输入`cmd`并回车以打开控制台。在控制台中输入`ftp server_ip`(注意,`server_ip`需要事先知道,可以在Linux下输入`ifconfig`命令查看),这时候会要求提供用户名。若ftp服务器支持匿名登录,则可以以`anonymous`作为用户名、密码任意的方式登录。 #### 从浏览器访问 在浏览器地址栏中输入`ftp://server_ip`,如`ftp://192.168.1.100`即可。 注意在浏览器模式下访问FTP服务器,无法上传文件。如果需要上传文件,请使用Telnet或者在操作系统的资源管理器中访问该服务器。 ## References - JamesF.Kurose, KeithW.Ross, 库罗斯,等. 计算机网络:自顶向下方法[M]. 高等教育出版社, 2009. - 谢希仁. 计算机网络.第6版[M]. 电子工业出版社, 2013. 赏 Wechat Pay Alipay Proxy, Gateway, Tunnel Internet Protocol v4(IPv4)