文件传输协议FTP

文件传输协议FTP(File Transfer Protocol)是因特网中使用最普遍的文件传输协议。FTP使用交互式的访问,容许客户指定文件的类型和格式(如指明是否使用ASCII码),并容许文件具备存取权限(如访问文件的用户必须通过受权,并输入有效的口令)。html

  文件传输协议有基于TCP的FTP和基于UDP的简单文件传输协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特色是:若要存取一个文件,就必须先得到一个本地的文件副本。若是要修改文件,只能对文件的副本进行修改,而后再将修改后的文件传回到原节点。面试

1 FTP基本工做原理

  FTP屏蔽了各计算机系统的细节,于是适合在异构网络中任意计算机之间传送文件。FTP只提供文件传送的一些基本服务,它使用TCP可靠地运输服务,FTP主要功能是减少或消除在不一样系统下处理文件的不兼容性。服务器

  FTP使用客户端-服务器模型,一个FTP服务器进程能够为多个客户进程提供服务。FTP服务器有两大部分组成:一个主进程,负责接受新的请求;还有若干从属进程,负责处理单个请求。主进程工做步骤网络

  • 打开熟知端口(21),使客户进程可以链接上
  • 等待客户进程发送链接请求
  • 启动从属进程处理客户进程发送的链接请求,从属进程处理完请求后结束,从属进程在运行期间可能根据须要可建立其余一些子进程
  • 回到等待状态,继续接受其余客户进程发起的请求,主进程与从属进程的处理是并发进行的

FTP工做时状况并发

 

  FTP控制链接在整个会话期间都保持打开,只用来发送链接/传送请求。当客户进程向服务器发送链接请求时,寻找链接服务器进程的熟知端口21,同时还要告诉服务器进程本身的另外一个端口号码,用于创建数据传送链接。接着,服务器进程用本身传送数据的熟知端口20与客户进程所提供的端口号码创建数据传送链接,FTP使用了2个不一样的端口号,因此数据链接和控制链接不会混乱。spa

1.1 FTP数据表示

  FTP协议规定了控制协议传送与存储的多种选择,在如下4个方面必须作出一个选择。htm

  • 文件类型:ASCII码文件(默认的)/ 图像文件类型(二进制的)/ 本地文件类型(用于在具备不一样字节大小主机间传送二进制数据)
  • 格式控制:该选项针对ASCII类型文件适用,非打印(默认选择,文件中不包含垂直格式信息)/ 远程登陆格式控制
  • 结构:文件结构(默认选择,文件被认为是一个连续的字节流,不存在内部的文件结构)/ 记录结构(用于文本文件)
  • 传输方式:流方式(模式选择,文件以字节流方式传输,对于文件结构,发送方在文件尾提示关闭数据链接,对于记录结构,有专用的两字节序列码记录结束和文件结束)/ 块方式(文件以一系列块来传送,每块前面有一个或多个首部字节)/ 压缩方式

1.2 FTP命令和应答

  命令和应答在客户和服务器的控制链接上以 NVT ASCII码形式传送。这就要求在每行结尾都要返回C R、 L F对(也就是每一个命令或每一个应答)。这些命令都是3或4个字节的大写ASCII字符,其中一些带选项参数。从客户向服务器发送的FTP命令超过30种。下图是比较经常使用的几种命令:blog

  应答都是A S C I I码形式的3位数字,并跟有报文选项。其缘由是软件系统须要根据数字代码来决定如何应答,而选项串是面向人工处理的。因为客户一般都要输出数字应答和报文串,一个可交互的用户能够经过阅读报文串(而没必要记忆全部数字回答代码的含义)来肯定应答的含义。进程

2 FTP工做模式

  FTP有两种工做模式,分别是主动模式(PORT)和被动模式(PASV)两种模式,这两种模式是按照FTP服务器的“角度”来讲的,更通俗一点说就是:在传输数据时,若是是服务器主动链接客户端,那就是主动模式;若是是客户端主动链接服务器,那就是被动模式。关于主动模式和被动模式更具体的讲解请点击:图解FTP的主动模式与被动模式以及客户端设置ip

不一样的模式创建数据链接的方式有所不一样。在两种模式下,都是客户端从一个随机端口N向FTP服务器的命令端口21创建TCP链接。

  • 主动模式:客户端从端口M上侦听服务器发来的数据链接经过控制链接向服务器发送PORT M命令来通知服务器它正在侦听的端口号和本地ip地址。而后服务器从它的数据端口port 20上向客户端(端口M)发起一条数据通道。(S -> C)
  • 被动模式:在客户端被防火墙隔离而没法接收传入的TCP链接时,能够采用FTP的被动模式。在这种模式下,客户端首先经过控制链接(control connection)向服务器发送一个PASV命令,服务端收到此命令开启一个数据端口( 任意非特权端口P>1024 ),并经过控制链接告诉设备,服务端 “监听 ” 并等待客户端链接,客户端接收服务器返回的服务器IP地址和端口号,客户端再在本身的任意端口上向接收到的服务器IP地址和端口号创建数据链接。(C -> S)

3 关于FTP经典的问题

3.1 如何知道FTP传送一个文件结束?

  这个问题比较经典,也是一次面试被问到的问题。前面说过,通用传输方式是流方式,而且文件的结尾是以关闭数据链接为标志,这意味着对每个文件传输或目录列表来讲都要创建一个全新的数据链接。其通常过程以下:

  1. 正因为是客户发出命令要求创建数据链接,因此数据链接是在客户的控制下创建的。
  2. 客户一般在客户端主机上为所在数据链接端选择一个临时端口号。客户从该端口发布一个被动的打开。
  3. 客户使用PORT命令从控制链接上把端口号发向服务器。
  4. 服务器在控制链接上接收端口号,并向客户端主机上的端口发布一个主动的打开。服务器的数据链接端一直使用端口20。

  图27- 4给出了第3步执行时的链接状态。假设客户用于控制链接的临时端口是 11 7 3,客户用于数据链接的临时端口是 11 7 4。客户发出的命令是PORT命令,其参数是6个ASCII中的十进制数字,它们之间由逗点隔开。前面 4个数字指明客户上的 I P地址,服务器将向它发出主动打开(本例中是 140.252.13.34),然后两位指明16 bit端口地址。因为16 bit端口地址是从这两个数字中得来,因此其值在本例中就是 4×256+150=1174。
  图27-5给出了服务器向客户所在数据链接端发布主动打开时的链接状态。服务器的端点是端口20。

  服务器老是执行数据链接的主动打开。一般服务器也执行数据链接的主动关闭,除非当客户向服务器发送流形式的文件时,须要客户来关闭链接(它给服务器一个文件结束的通知)。


与HTTP的不一样之处

HTTP本质上解决了FTP传输许多小而短的网络内容不方便的问题。

FTP经过一个有状态的控制链接(control connection)来维护当前的工做目录和其余flags,而数据传输须要另起一路链接(data connection)来实现。在被动模式下,data connection是由客户端向服务器发起的,而在默认的主动模式下,data connection则是由服务器向客户端发起。在主动模式下的这种明显的角色转换,以及全部传输都使用随机端口号,使得FTP在穿越防火墙和NAT时很是困难。相反,HTTP是无状态协议,而且控制和数据都被复用在一个从客户端到服务器的单一链接上,使用熟知端口,使得HTTP可以很容易穿透NAT网关和防火墙。

因为发送命令并等待接收响应的所需的往返时间,使得创建FTP链接的速度很慢,所以,一向的处理是,创建起一条控制链接后即保持该链接的开放状态,该控制链接可用于多个文件的传输控制,而不是在多个文件之间反复地关闭并重建会话。相比之下,HTTP在最初的实现中,每当传输完一个文件(或其余数据)后,都会关闭链接,虽而后来HTTP也支持了重用一个TCP链接实现屡次传输的功能,但其基本的概念模型仍然是独立的请求而非会话。

当FTP在数据链接上传输数据时,控制链接处于空闲状态,若是传输时间过长,防火墙或NAT会认为控制链接已断开而中止跟踪,从而使得文件下载中断。而HTTP链接仅在多个请求之间处于空闲态,所以在超时后将该链接断开是正常的,也是合理的。