# FTP 协议

# FTP 原理

FTP(File Transfer Protocol)

文件传输协议(FTP)使得主机间可以共享文件。FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。

FTP 采用两个 TCP 连接来传输一个文件.

  1. 控制连接以通常的客户服务器方式建立。服务器以被动方式打开众所周知的用于 FTP 的端口(2 1) ,等待客户的连接。

客户则以主动方式建立连接。控制连接始终等待客户与服务器之间的通信。该连接将命令从客户传给服务器,并传回服务器的应答。

由于命令通常是由用户键入的,所以 I P 对控制连接的服务类型就是 “最大限度地减小迟延” 。

  1. 每当一个文件在客户与服务器之间传输时,就创建一个数据连接。

由于该连接用于传输目的,所以 I P 对数据连接的服务特点就是 “最大限度提高吞吐量” 。

img

FTP 的主要功能如下:

提供文件的共享(计算机程序 / 数据);

支持间接使用远程计算机;

使用户不因各类主机文件存储器系统的差异而受影响;

可靠且有效的传输数据。

FTP,尽管可以直接被终端用户使用,但其应用主要还是通过程序实现。

FTP 控制帧即指 TELNET 交换信息,包含 TELNET 命令和选项。然而,大多数 FTP 控制帧是简单的 ASCII 文本,可以分为 FTP 命令或 FTP 消息。FTP 消息是对 FTP 命令的响应,它由带有解释文本的应答代码构成。

# 主动模式

客户端从任意一个非特权端口 N 连接到服务端的 21 端口,发送 PORT 命令告诉服务端处于主动模式,该客户端的数据端口。

服务端确认后用数据端口 20 连接到客户端端口 N+1

# 被动模式

客户端从任意一个非特权端口 N 连接到服务端 21 端口,然后发送 PASV 命令,通知服务器处于被动模式。

服务端收到命令后开放随机端口 P,并使用 PORT 命令告诉客户端,数据端口为 P。

客户端收到命令后,将 N+1 端口连接到 P

# 主被动模式使用场景

主动模式适合客户端不在防火墙后,此时服务端主动连接到客户端的端口

被动模式适合客户端在防火墙后,此时客户端主动连接到服务端数据端口

# FTP 断点续传

要求服务端必须支持 REST 命令

下载过程

  1. 客户端登录并连接到 ftp 服务端
  2. 客户端使用 REST 命令指定断点字节偏移
  3. 服务端收到 REST 命令并记录下断点字节偏移
  4. 客户端使用 RETR 命令指定文件路径名

上传过程

  1. 登录
  2. 获取服务端和本地要上传文件的同名文件大小
  3. 客户端发送 APPE 命令,通知服务端,上传文件位置
  4. 定位本地文件指针
  5. 读取文件并发送

# 多线程同时下载文件中各个部分

客户端登录后获取文件大小,将文件分为 n 份,启动 n 个线程。每个线程登录 ftp 服务端,使用 REST 命令获取各自的数据片段进行下载,最好进行组装。