FTP简介

时间:2024-04-08 10:08:41

什么是FTP?

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

在TCP/IP协议族的应用层,其传输层使用的是TCP协议,它是基于客户服务器模式工作的。

FTP支持哪些文件类型?

(1)ASCII码文件(也称为文本文件)(常用)

(2)EBCDIC码文件,该文本文件在传输时要求两端都使用EBCDIC码。

(3)图像文件,也称作二进制文件类型。发送的数据为连续的比特流。(常用)

(4)本地文件,字节的大小由本地主机定义,即每一字节的比特数又发送方规定。

如果以二进制形式传输文件,\r\n不做任何解析,而ASCII码形式传输文件,\r\n会做解析。(\n是linux系统上的换行符,\r\n是windows上的换行符)。FTP一般默认二进制传输,ASCII码传输不太安全。

FTP工作原理

FTP简介

FTP是一个CS架构的软件,左边是客户端,右边是服务端。客户端有一个用户界面,可以是LeapFTP这样的图形界面,也可以是命令行形式的文本文件方式来使用。一旦用户有一个操作,就会通过用户协议解释器转换成对应的FTP命令,通过控制连接发送给服务器端,控制连接的端口号是21,首先是客户端去连接服务器端的21端口,建立了控制连接,控制连接主要是用于FTP命令以及FTP命令的响应。一旦服务器端收到一个命令以后就要进行相应的工作,比如收到了用户名和密码,就要进行相应的验证。验证成功之后就给客户端响应,验证失败的话就给一个失败的响应。FTP传送命令的时候,主要是为了文件传输,也就是会涉及到文件传输的命令,这些命令也是通过控制连接来发送的,一旦服务器端解析到一个文件传输的命令之后,就要和客户端建立一个新的连接通道,这个通道称为数据连接通道,用于传输文件。这个连接的建立,可以由客户端主动发起,也可以由服务器端发起。这就对应到了两种不同的工作模式。如果是客户端上传文件的话,就会读取本地文件系统中的文件,传输给服务器端,服务端就将它写到服务器端对应的文件系统。如果是下载的话,服务器端读取文件系统中的数据,写入到数据连接,通过数据连接发送给客户端,客户端就读取数据连接中的数据,写入到本地的文件系统。这就是FTP工作的基本原理。

数据连接并不是永久性存在的,一旦传输完毕就会将这个连接关闭掉,但是控制连接不会关闭,除非将客户端关闭了,控制连接才会随之关闭。控制连接是随客户端一起存在的,而数据连接是短暂存在的,只要文件传输或者列表传输完成,数据连接就关闭了。

FTP常用命令

FTP简介

FTP简介

FTP简介

FTP两种工作模式

主要是针对数据连接而言的,控制连接的建立总是由客户端向服务器端发起。而数据连接通道的建立则不同,既可以是服务器端向客户端发起连接建立数据连接通道,这种模式称为主动模式。也可以是客户端向服务器端发起连接建立数据连接通道,这种模式称为被动模式。

主动模式

首先建立一个控制连接通道,客户端向服务端的21端口号发起连接,经过三次握手建立了数据连接通道。客户端本地也会动态选择一个端口号AA,一旦控制连接通道建立好之后,双方就可以交换信息了。客户端可以通过控制连接通道向服务器端发起命令请求,服务器端也可以通过控制连接通道对这些命令请求进行应答。

       在创建数据连接之前,要选择工作模式,如果是主动模式,客户端会向服务器端21端口号发送一个PORT命令,这个命令也是通过控制连接通道来完成的,并且告知一个客户端的端口号,这样服务器端才知道要连接客户端的哪一个端口号,服务器端得到这个信息,就向BB端口号发起一个连接请求,建立了一个数据连接通道,数据连接通道一旦建立完毕,就可以进行数据的传输了。包括目录表传输以及文件传输等等。一旦这些传输完毕,数据连接通道就会关闭,它是临时的。服务器端主动连接客户端的时候,服务器端要选择一个20的端口。

FTP简介

FTP简介

(1)客户端向服务器端发送PORT命令

客户端创建数据套接字

客户端绑定一个临时端口bind(0),由于是临时的端口号,并不知道是哪个端口号,到时候通过getsockname查看到底绑定的是哪个端口号,以便格式化为下面的格式

客户端在套接字上监听

将IP与端口格式化为h1,h2,h3,h4,p1,p2

(2)服务器端以200响应

        服务器端解析客户端发过来的IP和端口号暂存起来,以便后续建立数据连接

(3)客户端向服务器端发送LIST

        服务器端检测在收到LIST命令之前是否接受过PORT或PASV命令

        如果没有接受过,则响应425Use PORT or PASV first

        如果有接收过,并且是PORT则服务器端创建数据套接字(bind20端口),调用connect主动连接客户端IP和端口,从而建立数据连接。

(4)服务器发送150应答客户端,表示准备就绪,可以开始传输了。

(5)开始传输列表

(6)服务器发送226应答给客户端,表示数据传输结束

       数据传输结束,服务器端主动关闭数据套接字

被动模式

FTP简介

FTP简介

1)客户端向服务器端发送PASV命令

(2)服务器端以227响应

     服务器端创建数据套接字

        服务器端绑定一个临时端口

     服务器在套接字上监听

        将IP和端口格式化为h1,h2,h3,h4,p1,p2响应给客户端,以便客户端发起数据连接

(3)客户端向服务器端发送LIST

        服务器端检测在收到LIST命令之前是否接受过PORT或PASV命令

        如果没有接受过,则响应425Use PORT or PASV first

        如果有接收过,并且是PASV则调用accept被动接受客户端的连接返回已连接套接字,从而建立数据连接。

(4)服务器发送150应答客户端,表示准备就绪,可以开始传输了。

(5)开始传输列表

(6)服务器发送226应答给客户端,表示数据传输结束。数据传输结束,客户端主动关闭数据套接字。一旦关闭,服务器端也能收到这个信息,因为客户端主动关闭套接字,服务器端read返回0,就会将本地的数据套接字关闭掉。

NAT或防火墙对主被动模式的影响

NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。除转换IP地址外,还出现了可以转换TCP、UDP端口号的NAPT技术,由此可以实现用一个全局IP地址与多个主机的通信。具体看TCP/IP详解P179页


FTP客户端处于NAT或防火墙之后的主动模式


由于客户端处于局域网之中,无法直接访问公网上的服务器,需要经过NAT服务器(中间那个)进行地址转换。而NAT有一个特征,如果是从内向外发起连接,则可以建立成功(NAT会维护一个IP的表目),如果是从外部发起的连接,则无法建立连接。
开始时客户端想服务器发起连接建立控制连接通道,接着客户端向服务器发送PORT命令和数据通道的端口BB,欲通过主动模式建立数据连接通道,而因为实际上连到FTP服务器的IP地址是经过NAT服务器进行转换的,故服务器实际上是连接到了NAT服务器的BB端口(此时NAT的BB端口没有启用,故连接被拒绝),并且并没有相应的条目可以找到客户端,所以此时的主动模式时不能成功的。
解决方式可以自己在NAT配置映射信息,允许FTP服务器连接过来。如果手工配置映射条目,那么就必须知道FTP服务器是哪一个端口发起连接过来,所以FTP的主动模式发起连接的端口规定为20端口而不是动态选择,否则NAT映射的信息会很多。

FTP简介

FTP客户端处于NAT或防火墙之后的被动模式


如果FTP客户端处于NAT或防火墙之后,并且使用被动连接,此时是可以连接成功的,示意图如下图所示,过程和之前的类似,这里不再重复。

FTP简介

FTP服务器处于NAT或防火墙之后的被动模式


如果FTP服务器处于NAT或防火墙之后,在建立控制连接通道的时候,由于是客户端向服务器发起连接,因此需要在NAT配置一个映射条目(FTP服务器固定是21端口),经过三次握手建立控制连接通道。若使用被动模式,则在建立数据连接通道的时候,处于外网的客户端向处于内网的服务器发起的连接可能建立不能成功,这个和之前的也是类似的。所以我们可以知道,当FTP服务器处于NAT或防火墙之后的被动模式可能建立不成功。

FTP简介

FTP服务器处于NAT或防火墙之后的主动模式


 从上面的分析我们应该可以得到,FTP服务器处于NAT或防火墙之后的主动模式是可以建立成功的。如下图所示

FTP简介

FTP中的21端口和20端口的作用

进行FTP文件传输中,客户端首先连接到FTP服务器的21端口(当然这个端口可以在配置文件中进行修改),进行用户的认证,接受客户端的来连接。认证成功后,要传输文件时,如果ftp服务是主动模式,服务器端就会开一个端口20来进行传输数据文件。被动模式,则是随机选择一个端口号。