起初, FTP并不是应用于IP网络上的协议,而是ARPANEt网络中计算机间的文件传输协议, ARPANET是美国国防部组建的老网络,于1960-1980年使用。在那时, FTP的主要功能是在主机间高速可靠地传输文件。目前FTP仍然保持其可靠性,即使在今天,它还允许文件远程存取。这使得用户可以在某个系统上工作,而将文件存贮在别的系统。例如,如果某用户运行Web服务器,需要从远程主机上取得HTML文件和CGI程序在本机上工作,他需要从远程存储站点获取文件(远程站点也需安装Web服务器)。当用户完成工作后,可使用FTP将文件传回到Web服务器。采用这种方法,用户无需使用Telnet登录到远程主机进行工作,这样就使Web服务器的更新工作变得如此的轻松。
FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server。
FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的"三次握手"的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。 下面,让我们来看看,一个FTP客户在和服务器连接是怎么样的一个过程(以标准的FTP端口号为例)。 首先,FTP并不像HTTP协议那样,只需要一个端口作为连接(HTTP的默认端口是80,FTP的默认端口是21),FTP需要2个端口,一个端口是作为控制连接端口,也就是21这个端口,用于发送指令给服务器以及等待服务器响应;另一个端口是数据传输端口,端口号为20(仅PORT模式),是用来建立数据传输通道的,主要作用是从客户机向服务器发送一个文件。 从服务器向客户发送一个文件。 从服务器向客户发送文件或目录列表。 其次,FTP的连接模式有两种,PORT和PASV。PORT模式是一个主动模式,PASV是被动模式,这里都是相对于服务器而言的。
FTP的数据连接和控制连接的方向是相反的。也就是说,是服务器向客户端发起一个用于数据传输的连接。客户端的连接端口是由服务器端和客户端通过协商确定的。
FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,当经过TCP的三次握手后,连接(控制信道)被建立。然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。
服务器接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
FTP的数据连接和控制连接的方向是一致的。也就是说,是客户端向服务器发起一个用于数据传输的连接。客户端的连接端口是发起这个数据连接请求时使用的端口号。
FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接, 同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。
服务器收到命令后,会开放一个大于1024的端口P进行监听然后用PORT P命令通知客户端,自己的数据端口是P口客户端收到命令后,会通过N+1号端后连接服务器的端口P,然后在两个端口之间进行数据传输
被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况。
本文使用CentOS 7系统,首先配置静态IP,确保win7测试机能ping通ftp服务器的IP地址,网路具体方法不再介绍。
为了避免一些不可预测的错误,需要关闭selinux。
getenforce #获取selinux状态
vi /etc/selinux/config #修改/etc/selinux/config文档
SELINUX=disabled #关闭selinux
reboot #重启
yum -y install vsftpd #安装vsftpd
systemctl enable vsftpd #设置开机自启动vsftpd
systemctl start vsftpd #启动vsftpd服务
systemctl status vsftpd #查看vsftpd服务状态
firewall-cmd --add-service=ftp --permanent #将vsftpd服务添加到防火墙规则,使其通过防火墙
firewall-cmd --reload #重新加载防火墙规则
firewall-cmd --list-all #查看所有防火墙规则列表
修改文件/etc/vsftpd/vsftpd.conf
vi /etc/vsftpd/vsftpd.conf
useradd -d /home/ftp2 -s ftpUser2 #新建用户ftpUser2
passwd ftpUser2 #设置密码
useradd -d /home/ftp3 -s ftpUser3 #新建用户ftpUser3
passwd ftpUser3 #设置密码
cd /home/ftp2 #进入/home/ftp2目录下
mkdir a b c #新建文件夹a b c
cd /home/ftp3 #进入/home/ftp3目录下
mkdir c x z #新建文件夹c x z
vi /etc/vsftpd/chroot_list
在里面添加用户名ftpUser2
systemctl restart vsftpd #重启vsftpd服务
限速100KB的建立过程:
vi /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd #重启vsftpd服务
进入win7 虚拟机,打开WinSCP,分别用ftpUser和ftpUser3登录ftp
测试结果如下:
ftpsUer2可以切换目录:
ftpUser3只能在自己的目录,不能切换到上级目录:
在win7 虚拟机中向ftpUser2的ftp目录下粘贴一个几十兆的文件,查看传输速率。
传输速率被限制在100KB以内: