在我们平时上网的过程中,一般都是使用FTP的客户端对商家提供的服务器进行访问(上传、下载文件),例如我们微软的SkyDrive网盘,115网盘等。
FTP介绍
FTP文件传输协议(File Transfer Protocol),用于Internet上的控制文件的双向传输,是一个应用程序。工作在TCP/IP协议族的应用层,其传输层协议是TCP协议,目的在于提高文件传输的共享性和可靠性,是基于客户/服务器模式工作的。
FTP协议
相比其他协议,如HTTP协议,FTP协议要复杂一些。与一般的C/S模型只会建立一个socket连接,这个连接同时处理服务器和客户端的连接命令和数据传输。而FTP会建立两个连接,将命令与数据分开传输,正是因为这样,提高了传输效率。
FTP使用两个端口,分别为控制端口(命令端口)和数据端口。**控制端口号一般为21,数据端口一般为20。**控制socket用来传输命令,数据socket用来传输数据。每一个FTP命令发送后,FTP服务器就会返回一个字符串,其中包含一个响应码和一些说明信息,其中响应码主要用于判断命令是否被成功执行了。
那么,基于FTP协议的客户端和服务器端是如何进行“沟通”的?我们来一探究竟吧。
将FTP客户端和服务器端之间的“沟通”分为4个阶段:
1.启动FTP
客户通过FTP客户端软件,发起FTP交互式命令,告诉服务器,服务器上的FTP服务会接收到这个命令,并解析发来命令,然后发出回复信息,客户端对服务器说:“我想和你聊会天,可以吗?”
2.建立控制连接
客户端TCP层会根据服务器的IP地址,向服务器提供FTP服务的21端口发出主动建立连接的请求,服务器接收到请求后,经过三次握手,客户端与服务器端就建立了一个TCP连接,就好比是我们在A地和B地之间传输货物,首先应该建立一条运送货物的通道。这个TCP连接称为控制连接,用户发出的FTP命令和服务器的回应都是依靠该连接来传送的,在用户退出前一直存在。
3.建立数据连接,并进行文件传输
到目前为止,客户端和服务器端已经建立了聊天的通道,聊天过程中,对方觉得很投机,想互赠礼物(将客户端和服务器端进行文件的传输比喻为互赠礼物)怎么办,这个时候我们就需要一条通道来进行礼物的传输(将数据连接比喻为数据连接),那么是如何赠送礼物的?
(1)客户端通过控制连接发送一个上传文件的命令,会自己分配一个临时的TCP端口号。
(2)客户端通过控制连接向服务器发送一个命令告诉服务器自己的IP地址和临时端口号,然后发送一条上传文件的命令。(就好客户端要赠送礼物给服务器时,不只发送一个送礼物的命令,在这之前还要发送一条自我介绍的命令,即IP地址和端口号,来告诉服务器和他聊天的是哪一个客户)
(3)服务器接收到客户端的IP地址和临时端口号后,以这个IP地址和端口号为目标,使用服务器上的20端口(数据端口),向客户端发出主动建立连接的请求。
(4)客户端收到请求后,通过三次握手后就与服务器之间建立了另外一条TCP连接数据连接(好比礼物传输的通道)。
(5)客户端在自己的文件系统中选择要上传(赠送礼物)的文件。
(6)客户端将文件写入到文件传输的进程中(即网络流中)。
(7)文件传输完成后,由服务器主动关闭该数据的连接。
4.关闭FTP
当用户退出FTP时,客户端发送退出命令,之后控制连接被关闭,FTP服务结束。
总结:
(1)客户端和服务器端进交互的过程中,采用的是TCP协议。
(2)建立两条TCP连接。控制连接,主要做的事情是传输命令和响应信息;数据连接,必须是先有控制连接才有数据连接,因为要进行问价传输首先必须知道客户的IP地址和端口号,这个过程通过控制连接发送的命令来告知服务器,客户单的IP地址和端口号,之后再在两者之间建立数据连接来传输文件。
(3)在服务器端,控制连接(21)和数据连接(20)使用了不同的端口号。
文件传输方式
1.ASCLL传输方式
假设用户正在拷贝的文件包含的简单ASCLL文本,如果我们使用的是windows系统,而运行FTP服务器的远程机上是Linux系统,那么使用ASCLL传输模式会将\r\n转为\n。当文件传输时FTP会自动调整文件的内容以便于把文件解析为另外那台计算机存储文本文件的格式。
2.二进制传输方式
二进制传输时,在拷贝任何非文本文件时,FTP会逐字拷贝,不会对这些文件进行处理。
两种传输方式的区别
相比之下,二进制传输方式会更好一些,我们经常进行传输的文件格式不单单是文本文件,可能是程序、数据库、压缩文件。ASCLL传输方式会改变我们的文件,即使不需要也会进行转译,会导致传输稍微变慢,也会损坏数据。
文件传输模式(即赠送礼物方式)
控制连接用于传输控制命令,随客户端一同存在的,而数据连接只是短暂存在的,每次要发生数据时才建立数据连接,数据传输完就断开数据连接。FTP的控制连接总是由客户端向服务器发起的,而数据连接的建立有两种途径,一种是客户端连接到服务器端,另一种是服务器连接到客户端,分别对应两种工作模式:被动模式和主动模式。主动和被动是对于FTP服务器而言的。
Port模式(主动模式)
这里写图片描述
首先建立控制连接通道,客户端向FTP服务器的21端口发起连接,经过3次握手建立控制连接通道。控制连接建立后,双方就可以进行交换信息,在需要传输数据时,主动模式下,客户端通过控制连接通道发送一个PORT命令并告知服务器数据连接通道的端口B,然后服务器向客户端的B端口发出连接请求,数据连接通道建立,就可以进行数据的传输,传输完毕后数据连接就会关闭。
Passive模式(被动模式)
这里写图片描述
首先客户端向服务器端21端口发起连接,经过三次握手建立控制连接通道。
被动模式需要进行数据传输时,客户端向服务器发送一个PASV表示进行被动传输,数据通道的建立是由客户端向服务器发起的,此时客户端需要知道连接到服务器的是哪一个端口,服务器向客户端发送被动模式的端口X,之后客户端向服务器的X端口发起连接建立,建立数据通道。
FTP命令
1.访问命令:
访问命令 | 解释 |
---|---|
USER <username> | 用于指定登录的用户名,以便服务器进行身份验证。USER命令通常是控制连接建立后发出的第一个命令。 |
PASS <password> | 用于指定用户密码,该命令用于登录用户命令之后。 |
REIN | 重新初始化用户信息,该命令会终止当前 USER的传输,也会终止正在传输的数据,然后重置所有参数,并打开控制连接,以便客户端再次发出USER命令。 |
QUIT | 关闭与服务器之间的连接。 |
2.模式设置命令
模式设置命令 | 解释 |
---|---|
PASV | 告诉服务器,让FTP服务器在指定的数据端口进行监听,被动接受客户端的请求。是默认模式。 |
PORT <address> | 告诉FTP服务器,客户端监听的端口号是address,FTP服务器采用主动模式连接客户端。 |
TYPE <data type> | 指定要传输的数据类型,有ASCLL和二进制。 |
MODE <mode> | 指定传输模式,S(流),B(块),C(压缩)。 |
3.文件管理命令
文件管理命令 | 解释 |
---|---|
CWD <directory> | 用户可以在不同的目录或数据集下工作而不改变登录信息,directory一般是用户名与系统相关的文件集合。 |
PWD | 返回当前工作目录。 |
MKD <directory> | 返回指定路径下的目录列表,省略路径时,返回当前目录。 |
CDUP | 回到上层目录。 |
RMD <directory> | 删除指定目录。 |
LIST <name> | 返回指定路径下的子目录及文件列表,name为路径,若省略,返回当前路径下的文件列表。 |
NLIST <directory> | 返回指定路径下的目录列表,省略路径时,返回当前目录。 |
RNFR <old path> | 重新命名文件,该命令的下一条命令用RNTO指定新的文件名。 |
RNTO <new path> | 和RNFR命令共同完成对文件的重命名。 |
DELE <filename> | 删除指定路径下的文件。 |
4.文件传输命令
文件传输命令 | 解释 |
---|---|
RETR <filename> | 下载指定路径的文件。 |
STOR <filename> | 上传一个指定的文件,并将其存储在指定的位置,如果文件已经存在,原文件被覆盖,如果文件不存在,则创建新文件。 |
5.其他命令
SYST:返回服务器使用的操作系统。
FTP响应码
客户端发送FTP命令后,服务器会返回FTP的响应码,FTP响应码由ASCLL编码的3为数字开头,后接一行文本提示信息,数字和提示信息中有一个空格,每个响应码以回车换行结束。
第一位数字代表的含义:
响应码 | 含义 |
---|---|
1XX | 信息已经被服务器正确接收,但尚未处理。 |
2XX | 信息已经被服务器正确处理完毕。 |
3XX | 信息已经被服务器正在接收,并正在处理。 |
4XX | 信息处理错误,暂时的。 |
5XX | 信息处理错误,永久的。 |
第二位数字代表的含义:
响应码 | 含义 |
---|---|
X0X | 语法错误。 |
X1X | 系统状态和信息。 |
X2X | 与FTP服务器连接状态。 |
X3X | 用户认证有关信息。 |
X4X | 未定义。 |
X5X | 与文件系统有关的信息。 |
常用的响应码:
响应码 | 含义 | 响应码 | 含义 |
---|---|---|---|
110 | 重新启动标记应答 | 332 | 登录时需要账户信息 |
120 | 服务在指定时间内准备好 | 350 | 请求的文件操作需要进一步的口令 |
125 | 数据连接打开,开始传输 | 421 | 服务关闭 |
150 | 文件状态良好,将要打开数据连接 | 425 | 不能打开数据连接 |
200 | 命令成功 | 426 | 关闭连接,终止传输 |
202 | 命令没有执行 | 450 | 文件不可用 |
211 | 系统状态回复 | 451 | 中止请求操作,有本地错误 |
212 | 目录状态回复 | 452 | 磁盘空间不足 |
213 | 文件状态回复 | 500 | 无效命令 |
214 | 帮助信息回复 | 501 | 语法错误 |
215 | 系统类型回复 | 502 | 命令未执行 |
220 | 服务就绪 | 503 | 命令顺序错误 |
221 | 服务关闭控制连接,可以退出登录 | 504 | 无效命令参数 |
225 | 数据连接打开,无传输正在进行 | 530 | 未登录 |
226 | 关闭数据连接,请求的文件操作成功 | 532 | 存储文件需要账户信息 |
227 | 进入被动模式 | 550 | 未执行请求操作 |
230 | 用户已经登录 | 551 | 请求操作终止,页类型未知 |
250 | 请求的文件操作完成 | 请求文件操作终止,超过存储分配 | |
257 | 创建路径名 | 553 | 为执行请求的操作,文件名不合法 |
331 | 用户名正确,需要口令 |