1 背景
某客户现场,每天都会批量生成大量 CSV 文件存放到 FTP 系统,这些 CSV 文件需要导入到大数据平台 HIVE 数仓中做后续离线分析,且 HIVE 数仓中的离线分析作业目前是使用 JENKINS 来调度的。
由于这些 CSV 文件是每天都会生成,且文件数比较多数据量也比较大,初步计划使用 DATAX 来导入 FTP 上的 CSV 文件。
但在调度系统 JENKINS 中,如何检测 ftp 上的 csv 文件是否 ready,并及时触发 DATAX 导入作业,成为了一个问题。
为探索和验证 JENKINS 中 FTP 文件的检测和触发机制,笔者搭建了 FTP 服务器。
在此通过系列文章,跟大家分享一个开源的 FTP 服务器 vsftpd, 介绍下其安装配置和使用,然后介绍下 FTP 的 ACTIVE 与 PASSIVE 模式,最后介绍下 CurlFtpFS.
本片文章是系列文章第二篇,介绍下FTP 的 ACTIVE 与 PASSIVE 模式。
2 FTP 的工作模式概述
FTP 协议不同于其他协议的一大特点是,其底层的 CLIENT 和 SERVER 之间有两个通信管道,即 command channel 和 data channel;
command channel 用来在客户端和服务器之间,传输命令和对命令的响应(客户端会发送命令给服务端,服务端也会发送命令给客户端);
data channel 用来进客户端和服务器之间,进行实际的文件数据的传输;
客户端的 command channel 和 data channel,使用的端口都是随机的;
默认情况下,服务端的 command channel 使用端口 21;
默认情况下,在 active 模式下,服务端的 data channel 使用端口 20;
在 passive 模式下,服务端的 data channel 使用一个随机的端口(其 range 可配置);
两个通信通道,和端口使用情况,简化示意图如下:
3 FTP 的 ACTIVE 工作模式详解
所谓 ACTIVE 工作模式,是指 FTP SERVER 端主动发起并建立了到客户端的 TCP 连接,此时 FTP SERVER 端是 TCP 连接的发起方,而 FTP CLIENT 是 TCP 连接的响应方;
FTP ACTIVE 模式的产生早于 FTP passive 模式,是早期网络安全攻击还不那么猖獗的早期时代的产物;
FTP ACTIVE 模式下,文件上传/下载底层的工作机制如下:
客户端使用一个随机端口,发起并建立到服务端 21 端口的 TCP连接;
建立 TCP 连接后,客户端会通过一系列命令跟服务端交互以登录服务端(具体的命令,包括 AUTH,USER,PASS,OPTS等);
客户端成功登录服务端后,在需要建立 data channel 数据通道时(即在进行文件上传/下载操作时),会首先通过 PORT 命令告知服务端,接下来建立 data channel 连接时,客户端可以使用的端口号;
服务端在获知客户端可以使用的 data channel 端口后,会主动通过自己的 20 端口,发起并建立到客户端上述 data channel 端口的 TCP 连接,此后该 session 下的文件上传和下载,就使用该 data channel 底层的 tcp 连接来进行;
后续再有文件上传/下载操作时,同样需要重复上述步骤建立 data channel,这些不同时刻建立的 data channel,其底层使用的客户端的端口号,并不一定相同;
ACTIVE 模式下,客户端和服务器端的交互机制,示意图如下:
![3452953c7fac640caa0e4ba7469f44f7.png](https://i-blog.csdnimg.cn/blog_migrate/33d38325a2c540dd53614fc9df006e7e.png)