FTP协议
作者:互联网
基于RFC959的FTP协议梳理
目录介绍:FTP是FileTransferProtocol(文件传输协议)的英文简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
默认情况下FTP协议使用TCP端口中的20和21两个端口,其中,20口用于传输数据(数据端口),21口用于传输控制信息(命令端口)。具体是否使用20口作为传输数据的端口域FTP使用的传输模式有关:
如果采用主动模式,那么数据传输端口就是20;
如果采用被动模式,则具体最终使用那个端口需要服务器和客户端协商决定。
工作模式:
FTP支持两种模式:主动模式(PORT)和被动模式(PASV)。
被动模式(PASV):
1、FTP客户端使用一个随机端口N(一般大于1024)向FTP服务器的21端口发送连接请求;
2、ftp服务端主进程收到请求后,派生出来一个服务端控制进程,和客户端控制进程之间建立控制连接,开始会话;
3、ftp客户端和ftp服务端之间通过各自的控制进程进行用户名和密码校验等操作;
4、当ftp客户端要发起数据文件传输时,ftp客户端控制进程向服务端控制进程发起pasv命令;
5、ftp服务端控制进程收到pasv请求后,派生出来一个数据传输进程,<并将端口号告知客户端>控制进程,返回227 entering passive mode (h1,h2,h3,h4,p1,p2),其中端口号是 p1*256+p2,ip 地址为h1.h2.h3.h4;《服务端告知客户端》
6、 ftp客户端控制进程收到响应后,派生出来一个客户端数据传输进程,随 客户端数据传输端口,连接服务端的数据传输端口号(即上条中的ip+端口号),然后进行数据文件传输;
7、当数据传输完毕,服务端数据传输进程返回传输完毕,数据连接通道会关闭,保留控制连接通道;
8、如果此时没有其他文件传输,控制通道也会相继关闭。
主动模式(PORT):
1、FTP客户端使用一个随机端口N(一般大于1024)向FTP服务器的21端口发送连接请求;
2、ftp服务端主进程收到请求后,派生出来一个服务端控制进程,和客户端控制进程之间建立控制连接,开始会话;
3、ftp客户端和ftp服务端之间通过各自的控制进程进行用户名和密码校验等操作;
4、当ftp客户端要发起数据文件传输时,客户端派生出一个数据传输进程,并通过客户端控制进程将数据连接的port告知服务端控制进程。<客户端告知服务端>
5、当ftp服务端收到请求后,派生出一个服务端数据传输进程,产生一个服务端端口号,然后根据请求中ftp客户端数据传输进程序端口号建立数据传输连接。
6、ftp客户端收到服务端的响应后,进行数据文件的传输。
7、当数据传输完毕,服务端数据传输进程返回传输完毕,数据连接通道会关闭,保留控制连接通道;
8、如果此时没有其他文件传输,控制通道也会相继关闭。
主动模式和被动模式的异同:二者在控制连接过程中是一样的,在数据连接时不一样:主动模式时服务器主动连接客户端已建立数据连接;被动模式下服务器端是被动的,由客户端连接服务器以建立数据连接。
数据传输:(概念放在其前面)
文件通过数据连接进行传输。控制连接用来发送操作命令以及相应的响应命令。
数据传输命令包括:指定数据位怎样被传输的模式(MODE)命令,以及用来定义数据表示方式的结构(STRU)、类型(TYPE)命令。“流式”传输模式依赖于文件结构参数,而当使用“压缩”传送模式时,填充字节的表示依赖于表示类型。
数据结构:
由于表示类型的不同,FTP允许文件具有指定的结构。包括以下三种:
**
$$
文件结构:**如果没有使用结构命令(STRU),默认使用文件结构。在文件结构中没有内部结构,文件被当作连续的字节流。
记录结构:在所有的FTP实现中,必须支持“文本”文件,即使用TYPE ASCII或EBCDIC的记录结构,在记录结构文件中,文件由连续的记录组成。
页结构:为了传输不连续的文件,FTP定义了页结构。一般提到的“随机存取文件”或“多穴”文件属于页结构类型。对于这些文件,一般有另外的对应整个文件信息(如文件描述符),或者对应文件部分信息(如页存取控制),或者两者都有。在FTP中,文件的部分称为页。
$$
为了提供个不同页大小以及相关信息,每页传输时将额外包括一个页头。页头有以下定义的域:
头长度:包括这个字节在内的头逻辑长度。最小头长度是4.
页索引:文件区域的逻辑页号。不是传输的序列号,而是标识本页的索引号。
数据长度:页中数据的逻辑字节数。最小数据长度为0.
页类型:标识了页的类型。具体如下:
0 = 最末页
用来标识页结构传输结束。页头长度必须为4,数据长度必须为0.
1 = 单独页
对于没有页相关控制信息的单独页来说这是普通的类型。页头长度必须为4.
2 = 描述页
这个类型用来传输整个文件的描述信息
3 = 存取控制页
此类型包括一个额外的指定页存取信息的头域。头长度必须为5.
可选域:
其他的头域可能用来提供每页的控制信息,如每页的存取控制。
所有的域都是一个逻辑字节。逻辑字节长度由TYPE命令指定。
建立数据连接
传输数据的过程包括在指定端口建立数据连接选择传输参数。用户和服务器DTP都有默认的端口号。用户过程默认的数据端口与控制连接端口相同,服务器过程的默认端口与控制连接的端口相邻。
传输字节长度是8位字节长。该字节长度与实际传输数据有关,而与主机文件系统的数据表示无关。
被动数据传输过程(PASV?)应该在发送FTP请求之前监听该数据端口。FTP请求命令决定了数据传输方向。服务器在接收到传输请求后将建立到指定端口的连接。当连接建立后,数据将在两端DTP间传输,同时服务器PI向用户PI发送确认回复。
每个FTP实现必须支持是哦那个默认的数据端口,只有用户PI可以使用变化的非默认端口。
用户可能会用PORT命令指定一个其他的数据端口。若用户希望从第三方主机下载,用户PI会同时建立到两服务器的PI控制连接。一个服务器(用FTP命令)等待连接,另一个服务器建立连接。用户PI给一个服务器PI发送PORT命令只是另一台服务器的数据端口。最后,向两端发送合适的传输命令。
服务器会在以下条件下关闭数据连接:
1.服务器在传输模式下完成数据传输,需要关闭连接,表示文件结束。
2.服务器收到用户发来的ABORT命令。
3.用户命令改变了端口设定。
4.控制连接合法地或由于其他原因关闭。
5.发生了不可挽回的错误。
数据连接管理
默认数据连接端口:所有FTP实现必须支持使用默认数据连接端口,只有用户PI可能使用非默认端口。
协商非默认端口:用户PI可能使用PORT命令指定非默认用户端口。用户PI可能要求服务器用PASV命令指定非默认端口。连接用一堆地址指定,上面两种动作之一都会得到一个不同的连接,仍然允许同时使用两个命令在两端指定新的端口。
数据连接复用:当使用流模式传输数据时,在文件传输结束后必须关闭连接。这时,如果有多个文件传输时,可能带来的问题是TCP为了保证传输可靠性,要保持连接记录一段时间。因此不能马上重新连接。这种情况下,有两种解决方案,一种是协商一个非默认端口,另一种是使用其他的传输模式。
对于传输模式来说,流失传输模式有天生的不可靠性,不能确定连接是否过早的关闭。其他的传输模式(块、压缩)不用关闭连接来指示文件结束。他们使用FTP编码来确定文件结束。因此使用这些模式可以在多文件传输时保持使用同一个数据连接。
传输模式
FTP定义了三种传输模式:
流模式:
数据以字节流传输。对表示类型没有限制,可以使用记录结构。
块模式:
文件以连续的带有数据头的数据块来传输。数据头包括一个计数域和描述码。
压缩模式:
此模式下,有三种信息要发送:常规数据,以字节串发送;压缩数据;控制信息,以两字节的转义字符传送。如果发送N>0(最多127)个字节的常规数据,这N个字节前要有一个头字节,这字节的最高位为0,其余7位代表数N。
FTP命令
1.访问控制命令
用户名(USER)——用来标识用户的Telnet字符串。
密码(PASS)
账户(ACCT)
某些站点可能需要一个账户用来登陆,另一些站点仅用于特殊访问权限,比如存储文件等。
当登陆过程必须要求填写账户信息的时候,PASS命令成功的响应代码是332;如果登陆过程不要求账户信息时,PASS命令成功的响应代码时230;如果账户信息需要在随后的对话命令中给出,服务器应该根据时保留(等待ACCT命令)还是放弃命令来相应地返回332或者532.、
改变工作目录(CWD)——使用户在不改变登陆用户和账户信息的情况下改变工作目录或数据集。传输参数保持不变,CWD的参数是一个路径名,用来指定相应的目录或者其他系统上的组名。
返回上层目录(CDUP)
结构装备(SMNT)——该命令允许用户在不改变用户和账户信息的情况下装备一个不同的文件系统数据结构。参数是一个用来标识目录或者其他系统中依赖文件组的路径名。
重新初始化(REIN)——该命令除允许当前正在传输过程完成外,终止一个用户,刷新所有的I/O和账户信息。所有的参数重设为默认值,并保持控制连接。此时等同于控制连接刚刚建立的状态。这条命令之后可能需要USER命令。
注销(QUIT)——注销一个用户,且当没有文件正在传输的话,服务器将关闭控制连接。如果当前有文件正在传输,连接会保持并等待回应,之后服务器将关闭连接。如果用户进程想以不同的用户民传输文件,而不像关闭然后再重建连接的情况下,应该使用REIN而不是QUIT。
控制连接的意外关闭将会导致服务器产生等同于放弃(ABOR)和注销(QUIT)动作。
2.传输参数命令
所有的数据传输参数都有默认值,只有在默认值需要改变的时候才需要用命令去指定传送数据传输参数。默认值是最后一次指定的值,或者如果未被指定,则是标准默认值。
以下命令用来指定数据传输参数:
数据端口(PORT)——用来指定数据连接时的主机数据端口。对于用户和服务器都有默认的数据端口值,并且一般情况下这条命令以及它的响应都不需要。如果使用了这条命令,那它的参数是一个32位的因特网主机地址和一个16位TCP端口号。地址信息被分解成每8位一个段,每个段都作为十进制数(用字符串标识)传送。段间用都好隔开,一个PORT命令的示例如下:
PORT h1,h2,h3,h4,p1,p2
h1是因特网主机的高8位
被动(PASV)——此命令请求服务器DTP在一个数据端口(不是它的默认端口)上监听并等待连接,而不是在收到传输命令后主动发起连接。这个命令的响应包括服务器监听的地址和端口号。
表示类型(TYPE)
文件结构(STRU)
传输模式(MODE)
3.FTP服务命令
获得(RETR)——该命令引起服务器DTP传送一个由路径指定的文件拷贝到数据连接另一端的服务器
或用户DTP。服务器文件的状态和内容应该不受影响。
保存(STOP)——该命令引起服务器DTP接受经过数据连接传送的数据并将这些数据存储为服务器端
的一个文件。如果在路径参数里指定的文件在服务器端已经存在,那么这个文件会被传送过
来的数据覆盖。如果指定的文件不存在则会在服务器端新建一个文件 。
唯一保存(STOU)
追加(包括创建)(APPE)
分配(ALLO)
重新开始(REST)——指定了需要重新开始传输的文件的位置标记。该命令不会引起文件的传输,只是忽略文件中指定标记点前的数据。
重命名开始(RNFR)——指定了需要重新命名的文件的原始路径名。后面须跟”重命名为“命令,来指定新的文件路径。
重命名为(RNTO)
放弃(ABOR)——该命令告诉服务器放弃先前的FTP服务命令和相关的传输的数据。
$$
当前一个命令(包括数据传输)完成时,将不会产生动作。服务器不会关闭控制连接,但是数据连接必须关闭。
服务器接受打这个命令时坑能处在两种状态:(1)FTP服务命令已经完成;
(2)FTP服务命令还在执行中。
对于第一种情况,服务器关闭数据连接(如果此时数据连接是打开的),回应226代码,表示放弃命令已经成功处理;
第二种情况,服务器放弃正在进行的FTP服务,关闭数据连接,返回426代码,表示请求服务请求异常终止。然后服务器发送226响应代码,表示放弃命令成功处理。
$$
删除(DELE)——在服务器端删除指定的文件。
删除目录(RMD)
新建目录(MKD)
打印工作目录(PWD)
列表(LIST)
名字列表(NLST)
站点参数(SITE)——服务器使用这个命令提供本系统可能对传输有帮助的特殊服务。
系统(SYST)——该命令用来得到服务器端操作系统的类型。
状态(STAT)——该命令通过控制连接以响应码的形式返回状态信息。
帮助(HELP)
空操作(NOOP)——不指定任何动作,只是要求服务器返回OK响应。
$$
FTP在控制连接上的所有通信都遵守Telnet协议。
$$
4.FTP响应
响应码中第一位数字的意义:
1xx:预备状态——请求的动作已经启动,在下一个新命令之前,期望一个回应。这种类型的响应用来表明命令已被接受。
2xx:完成状态——请求动作被成功的完成。一个新的请求可以开始。
3xx:中间状态——命令被接受,但是请求动作暂时没有被执行,等待收到进一步的信息。用户应发送另一个命令来指定这个信息。这个回应用在命令组合中。
4xx:暂时拒绝状态——命令没有被接受,请求动作没有发生。但是这个错误状态是暂时的,动作可以被再次请求。用户应该重新回到命令队列的开始。
5xx:永久拒绝状态——命令不被接受,请求动作不会发生。用户进程不能重复同样的请求。
区分一个响应应该属于4xx还是5xx的一个规则是:看这个命令是否可以不加修改,并在相同的用户、服务器状态下再次重复。
响应码中第二位数字的意义:
x0x:语法错误——给出的命令不存在、没有实现或者多余。
x1x:信息——对于请求信息的响应,比如对状态或帮助的请求。
x2x:连接——关于控制连接和数据连接的响应。
x3x:身份验证和账户——对登陆过程和账户处理的响应。
x4x:目前未被使用。
x5x:文件系统——请求传输时服务器文件系统的状态或其他文件系统动作状态。
5.抓包分析:
被动模式下的抓包分析
服务器IP:192.168.106.9
客户端IP:192.168.106.7
1.在TCP的三次握手之后,成功建立了控制连接,ftp服务器响应220表明服务器已经准备就绪。可以看到,此时的ftp服务器控制连接的端口号是21,客户端控制连接的端口号是53004;
2.客户端同通过控制连接(192.168.106.7:53004→192.168.106.9:21)发送auth tls 和auth ssl鉴权命令,因为此时不是sftp所以没有执行该鉴权命令;
3.客服端发送USER anonymous,使用匿名登陆,服务器返回230,登陆成功;
4.客户端发送TYPE A命令,服务器返回200,设置ASCII传输格式成功;
4.客户端通过控制连接发送PASV命令,服务器响应227,表示服务器成功进入被动模式,IP为192.168.106.9,端口号为1039.(结合上面提到的端口计算公式:port = p1x256+p2,即4x256+15=1039)。
5.客户端发送RETR请求下载名为123test.txt的文件;
6.客户端和服务器再次经过TCP3次握手,建立数据连接(1039<===>53009),开始传输数据;
7.传输完成后,服务器21向客户端53008发送226响应,关闭数据连接。
主动模式下的抓包分析
如下图:
标签:FTP,传输,协议,端口,命令,服务器,连接 来源: https://www.cnblogs.com/northward/p/16521042.html