FTP 的 PORT 模式,PASV 模式, FXP 协议和在 java 中使用时的一些问题

本贴最后更新于 4377 天前,其中的信息可能已经东海扬尘

这是最近一礼拜遇到的一个很头疼的问题,由于我们的系统需要需要用到 ftp 的 fxp 进行两个 ftp 服务器之间进行数据传输。 但是就是在这上出现了让我很郁闷的问题,连着几天,一个坑接一个坑,连续解决了 5,6 个问题,到今天下午才算是把所有问题解决。 在讲述我遇到的问题之前我们先了解下几个概念: * 首先是 PORT 模式和 PASV 模式,也就是 FTP 的主动模式和被动模式: > * 主动模式的 FTP 连接建立要遵循以下步骤: >> 1. 客户端打开一个随机的端口(端口号大于 1024,在这里,我们称它为 x),同时一个 FTP 进程连接至服务器的 21 号命令端口。此时,源端口为随机端口 x,在客户端,远程端口为 21,在服务器。 >> 2. 客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的 21 号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。 >> 3. 服务器打开 20 号源端口并且建立和客户端数据端口的连接。此时,源端口为 20,远程数据端口为(x+1)。 >> 4. 客户端通过本地的数据端口建立一个和服务器 20 号端口的连接,然后向服务器发送一个应答,告诉服务器它已经建立好了一个连接。 > > > * 被动模式 FTP: 为了解决服务器发起到客户的连接的问题,人们开发了一种不同的 FTP 连接方式。这就是所谓的被动方式,或者叫做 PASV,当客户端通知服务器它处于被动模式时才启用。 >> 在被动方式 FTP 中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。 >> 当开启一个 FTP 连接时,客户端打开两个任意的非特权本地端口(N > 1024 和 N+1)。第一个端口连接服务器的 21 端口,但与主动方式的 FTP 不同,客户端不会提交 PORT 命令并允许服务器来回连它的数据端口,而是提交 PASV 命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送 PORT P 命令给客户端。然后客户端发起从本地端口 N+1 到服务器的端口 P 的连接用来传送数据。 >> 对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的 FTP: >> >> 1. 从任何大于 1024 的端口到服务器的 21 端口 (客户端的初始化连接) >> 2. 服务器的 21 端口到任何大于 1024 的端口 (服务器响应到客户端的控制端口的连接) >> 3. 从任何大于 1024 端口到服务器的大于 1024 端口 (客户端初始化数据连接到服务器指定的任意端口) >> 4. 服务器的大于 1024 端口到远程的大于 1024 的端口(服务器发送 ACK 响应和数据到客户端的数据端口) * FPX 全称:File Exchange Protocol (文件交换协议)(貌似很对人对这个全称持有不赞同的意见) >  FXP 是一个服务器之间传输文件的协议,这个协议控制着两个支持 FXP 协议的服务器,在无需人工干预的情况下,自动地完成传输文件的操作。在我们的客户机上,可以简单的发送一个传输的命令,即可控制服务器从另一个 FTP 服务器上下载一个文件,下载过程中,无须客户机干预,客户机甚至可以断网关机。这种协议通常只适用于管理员作管理的用途,在一般的公开 FTP 服务器上,是不会允许 FXP 的,因为这样会浪费服务器资源,而且有可能出现安全问题。 以上这些都是我从百度百科扒出来的,也只是给各位简单的了解先 FTP 和我这几天遇到的问题的技术背景 我们的系统环境是这样的,数据是从 A 服务器(系统是 window server 2003,ftp 服务器 serv-u,使用的默认模式配置,应该是被动模式,但是貌似是主被动都支持) 先通过 FXP 传送到 B 服务器(中转服务器,是 linux,ftp 服务器是 vsftpd,被动模式,不能主被动同时开启,会出现 5XX 错误),然后在使用 fxp 分别传送到 c1,c2 服务器(windows server 2003, ftp 服务器是 serv-u,同样是使用的默认配置模式), 我们在项目中使用的是 Apache 的 net 包的 ftp 功能进行 FTP 操作,下面是我们使用 FXP 功能的代码: FTPClient srcServer = connect(source, ftpLog); FTPClient targetServer = connect(target, ftpLog); // Let's just assume success for now. srcServer.enterRemotePassiveMode(); targetServer.enterRemoteActiveMode(InetAddress.getByName(srcServer.getPassiveHost()), srcServer.getPassivePort()); // Although you would think the store command should be sent to // server2 // first, in reality, ftp servers like wu-ftpd start accepting data // connections right after entering passive mode. Additionally, they // don't even send the positive preliminary reply until after the // transfer is completed (in the case of passive mode transfers). // Therefore, calling store first would hang waiting for a // preliminary // reply. if (targetServer.remoteStoreUnique(encodepath(target.getPath())) && srcServer.remoteRetrieve(source.getPath())) { // if(ftp1.remoteRetrieve(file1) && ftp2.remoteStore(file2)) { // We have to fetch the positive completion reply. srcServer.completePendingCommand(); targetServer.completePendingCommand(); } 这段代码是我们头从 apache 网站中扒下来,稍作改动,目的就是为了从 src 服务器向 target 服务器发送一个文件,文件在 10G 左右。 代码很简单创建两个 FTP 连接,分别连接源服务器和目标服务器,告诉源服务器使用被动模式,并告诉目标服务器使用主动模式,并告诉目标服务器源服务器的 ip 和端口。 最后面的几句就简单的,if 判断条件里&&的左边的语句 targetServer.remoteStoreUnique(encodepath(target.getPath())) 的意思是,目标服务器接收数据, &&右边 srcServer.remoteRetrieve(source.getPath()) 是告诉源服务器发送数据,这样两个服务器就会进行数据传输,直到传输完成,如果这两个服务器不支持 FXP, 那么 if 语句里面的两句话就会返回 false。 从 Apache 的代码中不难看出,进行 FXP 需要两个 FTP 服务器一个是被动模式一个是主动模式,将被动模式的服务器的地址和端口告诉主动模式的服务器,有主动模式服务器连接被动模式服务器进行数据传输。 这里不一定是要源服务器是主动模式,目标服务器是主动模式,反过来也是完全可以的,我们这里之前的代码是目标服务器是被动模式,源服务器是主动模式,但是由于系统架构的变化所以这里的代码也有了变化。 这里需要注意的是: * srcServer.enterRemotePassiveMode(); 这句话需要在前面,targetServer.enterRemoteActiveMode(InetAddress.getByName(srcServer.getPassiveHost()), srcServer.getPassivePort()); 一定要在后面, 因为主动模式的服务器需要被动模式的服务器的地址和端口。 * targetServer.remoteStoreUnique(encodepath(target.getPath())) && srcServer.remoteRetrieve(source.getPath()) 这两句也是有顺序的, 最开始的时候 srcServer.remoteRetrieve(source.getPath())targetServer.remoteStoreUnique(encodepath(target.getPath())) 之前,在两个都是 serv-u 的情况下是没有问题的, 但是后面我们的源 ftp 服务器换成了 vsftpd 这样就不可以,在内网中进行测试呃时候,只有 20 字节的速度,而在公网中这两个就干脆连不上,但是改成现在的样子速度就能跑满。 我们在调试中还发现,vsftpd 是不能同时启动两种模式的,不然在执行命令的时候会返回一个 5XX 的错误,只能启动主动或者被动模式,网上的一些文章发的配置信息很多都是主被动同时启动的,我认为这是错的,但是我有一点很疑惑我们的 serv-u 使用的是默认配置, 这种的配置貌似既是主动也是被动,有点不理解,也就是说客户端连接的时候需要什么模式就会切换到什么模式。 还想提醒一下不论什么程序,只要是在程序中使用 FTP 操作的,需要注意 FTP 是否支持一些命令,比方说 vsftpd 就不支持 mlst 这个命令,还有 serv-u 默认配置下,是不能使用 list 命令的,会返回 425 错误,但是 serv-u 支持 mlst 命令,等等各种问题。 下午在闲下来的时候在和同时讨论这个问题的时候,得到结论是:FTP 的协议规范可能太简单,很多服务器的开发者,对协议支持的都不太一样,虽然大部分功能是一样的,但是在一些细节上有很大的差别,这些差别和可能就是我们需要进行攻关的地方。 当然我们也在这里拌了好几天,一个问题一个问题的解决,虽然耽误了很多时间但是收获也很多。

  • FTP
    19 引用 • 20 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    288 引用 • 4485 回帖 • 663 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 483 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 4 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 101 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    105 引用 • 127 回帖 • 370 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 1 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 588 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 394 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1737 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 5 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖
  • sts
    2 引用 • 2 回帖 • 196 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 27 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    30 引用 • 96 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    16 引用 • 130 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 49 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    407 引用 • 3578 回帖 • 1 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 3 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 158 关注
  • CodeMirror
    1 引用 • 2 回帖 • 129 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 491 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 162 关注