FTP文件传输协议学习总结
FTP协议
1.1 FTP协议基本概念
互联网文件传输协议(File Transfer Protocol ,FTP) 标准是在RFC959说明的。该协议定义了一个从远程计算机系统和本地计算机系统之间传输文件的一个标准。一般来说,传输文件的用户需要先经过认证以后才能登录网站,然后方能访问在远程服务器的文件。而大多数的FTP服务器往往提供一个GUEST的公共帐户来允许没有远程服务器的用户可以访问该FTP服务器。
一个FTP会话通常包括五个软件元素的交互。如图1.1展示了FTP的一种基本框架。
图1.1 FTP基本架构
用户接口(UI)提供了一个用户接口并使用客户端协议解释器(PI),其向远程服务器协议机发送命令并且驱动客户数据传输过程服务器PI 服务器协议解释器,响应客户协议机发出的命令并驱动服务器端数据传输过程客户 DTP 客户数据传输过程,其负责完成和服务器数据传输过程及客户端本地文件系统的通信服务DTP 服务器数据传输过程,其负责完成和客户数据传输过程及服务器端文件系统的通信
在FTP会话中,一共会存在有两个独立的网络连接,一个是由两端的PI使用的,另一个是由两端的DTP使用的。PI之间的连接一般被称作控制连接(control connection),DTP之间的连接被称做数据连接(data connection)。
对数据传输和控制命令传输来使用不同的独立连接有如下优点:两个连接可以选择不同的合适服务质量,如:对控制连接来说高需要更小的延迟时间,对数据连接来说需要更大的数据吞吐量;而且可以避免实现数据流中的命令的通明性及逃逸。
图1.2 FTP两个服务器的架构
如图1.2展示了FTP架构的另一种形式,也就是一个客户端控制两个服务器进行数据通信,由图中可以看出,客户端C分别于服务器A、B建立控制连接,而两台服务器之间建立数据连接,客户端分别向两个服务器发送控制命令,具体数据传输在服务器之间传输。
1.2 两种连接方式
FTP有两种建立连接的方式:主动模式PORT和被动模式PASV,主要是根据发送端的命令区分。
主动模式建立连接的步骤如下:
(1) 客户端打开一个随机端口(端口大于1024,记为x),同时一个FTP进程连接到服务器的21号端口。建立控制连接。
(2) 客户端监听端口x+1,同时向服务器发送PORT命令,通过此命令告知服务器,客户端正在监听的端口。
(3) 服务器打开20号端口,作为源端口与客户端的数据端口(x+1)建立数据连接。
被动模式建立连接的步骤如下:
(1) 客户端打开两个任意的非特权的本地端口(记为x和x+1)。第一个端口连接服务器的21号端口,建立控制连接。
(2) 客户端通过控制连接发送PASV命令,服务器在收到PASV命令后会开启一个任意的非特权端口,并发送PORT命令至客户端。
(3) 客户端根据服务器PORT命令给出的端口建立数据连接。
如下是两种连接模式的不同的FTP命令和响应
COMMAND:> PASV
227 Entering Passive Mode (127,0,0,1,26,108)
COMMAND:> PORT 127,0,0,1,28,37
200 PORT command successful.
使用PASV被动模式主要有两个原因:
(1) 考虑这种情况:客户端的IP是个内网的IP,服务器的IP是外网IP,当进行数据传输时,内网的IP对于服务器是不可见的,所以服务器无法找到客户端PORT命令指明的IP地址。只能由服务器启动监听才能建立数据连接,所以必须使用被动模式进行。
(2) 有些客户端的防火墙不允许从外部向客户端建立连接,因此必须使用被动模式由客户端发起连接。
1.3 请求与响应
请求与响应的格式一般如下:
FTP COMMANDS=命令*(<参数>)
FTP REPLIES =响应码<解释(报文选项)>
常用请求命令格式如下:
n USER
n PASS
n QUIT
n PORT
n PASV
n TYPE
n RETR
n STOR
n APPE
具体含义如下:
ABOR 放弃传输
APPE 将文件附加到已经存在的文件后面
PASS 提供一个用户登录密码,必须立即跟随在USER命令后
PASV 指定服务器数据传输过程监听等待客户端的数据连接连接建立请求
PORT 指定客户端监听等待服务器端建立的连接的端口号
QUIT 退出登录并终止连接
REST 从服务器的一个标识处重新开始传输
RETR 从远程系统取回一个文件
STOR 上载一个文件到服务器上,若文件已经存在则覆盖
SYST 报告远程系统的操作系统类型
TYPE 指定文件类型,参数可以是A、I
常用的响应码一般三位数字,含义如下:
1yz 主动初步应答,在发送另一个命令以前等待另一个应答
2yz 主动最后应答,最后一个命令成功结束
3yz 主动中间应答,必须再发送一个命令
4yz 暂时被动应答,要求的动作当时不能完成,但可以重试
5yz 永久被动应答,要求的动作不能完成,不应该重试
x0z语法错误
x1z 信息
x2z 连接状态
x3z 认证和记帐
x4z 保留
x5z Files文件系统状态
下面的表中展示了比较常见的几个响应代码及其解释说明。
响应代码 | 解释说明 | 响应代码 | 解释说明 |
---|---|---|---|
150 | 打开连接 | 350 | 文件行为暂停 |
200 | 成功 | 425 | 无法打开数据连接 |
220 | 服务就绪 | 426 | 结束连接 |
221 | 退出网络 | 230 | 登录因特网 |
226 | 结束数据连接 | 331 | 要求密码 |
227 | 进入被动模式(IP 地址、ID 端口) |
图1.3 FTP的一个例子
如图1.3是用wireshark捕获的一个FTP的例子,具体的时序信息由图中可以看出。图中FTP使用的是PASV模式进行连接,从中可以看出控制连接和数据连接的端口不同,属于不同的数据流。注意数据连接的建立是在客户端发出MLSD命令后进行的。
1.4 断点续传
其实FTP断点续传的原理很简单,可分为断点下载和断点上传。
客户端的实现步骤如下:
一、下载:
1、向服务器发送“REST + 本地文件长度”命令,告诉服务器,客户端要断点下载了。这时服务器还不知道客户端要下载哪个文件;
要实现FTP的断点续传,FTP服务器必须支持REST指令,这条指令在FTP协议文本RFC959中就已经定义了,不过它不是FTP服务器必须支持的指令。一般,你可以在下载前使用REST 100命令进行实验,如果服务器正常执行了这条命令,说明该服务器支持FTP断点续传。REST后面跟的数表示下载文件的起始位置,而REST 0表示从文件最开始处下载。REST命令本身并不执行下载功能,你仍需要使用RETR命令执行下载工作。
2、向服务器发送“RETR + 文件名”命令,通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。
3、客户端定位本地文件指针(文件末尾);
4、两端的准备工作都做完了以后,客户端创建socket,以被动或非被动方式建立数据通道,循环调用recv接收数据并追加入本地文件;
二、上传:
1、获取服务器上和本地要上传文件的同名文件大小;
2、向服务器发送“APPE + 文件名”,通知服务器,接下来从数据通道发送给你的数据要附加到这个文件末尾。
3、定位本地文件指针(和FTP上文件大小相同的位置)
以后,客户端创建socket,以被动或非被动方式建立数据通道,循环调用recv接收数据并追加入本地文件;
二、上传:
1、获取服务器上和本地要上传文件的同名文件大小;
2、向服务器发送“APPE + 文件名”,通知服务器,接下来从数据通道发送给你的数据要附加到这个文件末尾。
3、定位本地文件指针(和FTP上文件大小相同的位置)
4、从文件指针处读数据并发送。