# FTP 协议
# FTP 原理
FTP(File Transfer Protocol)
文件传输协议(FTP)使得主机间可以共享文件。FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。
FTP 采用两个 TCP 连接来传输一个文件.
- 控制连接以通常的客户服务器方式建立。服务器以被动方式打开众所周知的用于 FTP 的端口(2 1) ,等待客户的连接。
客户则以主动方式建立连接。控制连接始终等待客户与服务器之间的通信。该连接将命令从客户传给服务器,并传回服务器的应答。
由于命令通常是由用户键入的,所以 I P 对控制连接的服务类型就是 “最大限度地减小迟延” 。
- 每当一个文件在客户与服务器之间传输时,就创建一个数据连接。
由于该连接用于传输目的,所以 I P 对数据连接的服务特点就是 “最大限度提高吞吐量” 。
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 命令
下载过程
- 客户端登录并连接到 ftp 服务端
- 客户端使用 REST 命令指定断点字节偏移
- 服务端收到 REST 命令并记录下断点字节偏移
- 客户端使用 RETR 命令指定文件路径名
上传过程
- 登录
- 获取服务端和本地要上传文件的同名文件大小
- 客户端发送 APPE 命令,通知服务端,上传文件位置
- 定位本地文件指针
- 读取文件并发送
# 多线程同时下载文件中各个部分
客户端登录后获取文件大小,将文件分为 n 份,启动 n 个线程。每个线程登录 ftp 服务端,使用 REST 命令获取各自的数据片段进行下载,最好进行组装。