FTP
FTP是文件传输协议(File Transfer Protocol),是TCP/IP协议组中的协议之一。工作在TCP/IP族的应用层,传输协议是基于TCP的。
FTP是基于C/S模式工作的,且客户端和服务器之间的连接是可靠的,面向连接的,为数据的传输提供了可靠的保证。标准命令TCP端口号为21,Port方式数据端口为20。
FTP传输模式
(1)ASCII模式
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的是不同的操作系统,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。
(2)二进制模式
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。
如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。
ASCII模式和二进制模式有什么区别?
他们都是由比特位组成,差别仅仅在于处理方式上,一个标准ASCII字符有7个比特位,最高总是0,而二进制最高位有可能是1。另一个差别是,不同操作系统对换行符的表示方式不同,例如windows下是\r\n,linux下是\n,ASCII和二进制在处理字符换行符上也不同。
FTP的两种工作方式
FTP和HTTP不同,HTTP只需要创建一个TCP连接就可以实现各种服务,而FTP服务器与客户端需要创建两个TCP连接,分别为控制连接和数据连接,控制连接用于传输控制命令,生命周期是随客户端的,而数据连接是暂时存在的,在每次要发生数据传输的时候才建立数据连接,数据传输完毕后就断开连接。
FTP的控制连接是由客户端发起的,而FTP数据连接的建立则不同,它的建立有两种途径,一种是客户端连接服务器,另一种是服务器连接到客户端,这分别对应着FTP的两种工作模式:主动模式和被动模式。
主动模式
主动模式的工作过程:首先建立控制连接通道,客户端向FTP服务器的21端口发起连接,三次握手完成后,成功建立控制连接通道。当需要继续宁数据传输时,需要创建数据连接通道,选择工作模式。当选择主动模式时,客户端通过控制连接通道发送一个PORT命令并告知服务器数据连接通道的端口号,然后服务器向客户端发起连接请求,建立数据连接通道,数据连接通道一旦建立,就可以进行数据的传输,完成一个数据传输后,数据连接会立即关闭,当又需要数据传输时,再次建立。
被动模式
FTP被动模式的工作过程:和主动模式一样,需要经三次握手建立好控制连接通道。
当需要数据传输的时候,客户端向服务器发送一个PASV表示进行被动传输,也就是数据连接是由客户端发起的,而客户端需要知道应该连接服务器的哪个端口,因此服务器想客户端发送被动模式的端口,然后客户端向服务器发起连接,建立数据连接通道。
可以知道主动被动是对于数据连接而言,是针对服务器的,服务器主动连接就是主动模式,服务器被动连接就是被动模式。
说了这么多,也知道了主动模式与被动模式,可是为什么要分为主动、被动模式呢?
这里就要说到NAT或防火墙对主动模式对主动模式的影响有关了。
假如客户端处在局域网中,无法直接访问公网上的服务器,需要经过NAT服务器进行地址转换。而NAT有一个特征,如果从内部向外发起连接,则可以建立成功,如果是从外部发起的连接,则无法建立成功。
那么当客户端处在NAT或防火墙之后,当需要进行数据传输,要建立数据连接的时候,想要通过主动模式进行连接,这时就会出现问题,服务器在外部,客户端在内部,所以无法建立连接。所以数据连接通道会建立失败
而如果是被动连接的话,由客户端进行连接,这时候就可以解决这个问题,客户端在内网,服务器在外网,客户端在内部发起连接,这就不会出现问题,数据连接就可以建立,则可以完成数据传。
FTP服务器采用多进程方式实现,而且每来一条连接,创建两个进程来为这个连接服务。子进程专门负责与客户端进行交互。
另外如果用多线程的话,我们来想想,假设有多个用户连接上,但是用的却是同一个用户LCW,相当于这多个用户是共享工作区的,那么A将目录切换到a,B切换到b,这样会相互影响,当前线程对工作目录修改的话,可能会影响到其他线程,这是不应该出现的。因此不应该用多线程方式。