背景说明

最近有个项目涉及到FTP的上传下载问题。在本地开发好的程序测试的时候能正常获取FTP内容,但一放到生产上却显示connection timeout,无法连接。经过一些研究,发现是防火墙造成的。那究竟应该怎么开通网络关系才能正常访问到FTP呢?FTP中的主动模式与被动模式,对开通的网络关系又有什么影响呢?虽然网络上已有部分解释主动模式和被动模式的文章,但是感觉还不是说得十分清楚。故我自己重新整理阐述一遍,看是否能更好的解释主动模式和被动模式。

关于FTP

FTP是基于TCP的一个服务。它之所以特别是特别在它使用了两个端口,一个用来传送数据,一个用来传送命令。大家通常理解的,是用来传送命令的使用21端口,用来传送数据的使用20端口。但实际上并不是总是用20端口进行数据传输的,这还是要看使用的模式。

FTP:主动模式

在主动模式中,FTP客户端使用一个非分配端口(N>1023)与FTP服务端的21命令端口建立连接,并开始倾听N+1端口,同时通过21端口将N+1端口告诉FTP服务端。FTP服务端获取到客户端告诉它的N+1端口后,使用数据传输的20端口与FTP客户端N+1端口建立连接,从而进行数据传输。图示如下:

第一步:FTP客户端通过1026端口(N>1023)与FTP服务端的21端口建立通讯,并告诉FTP服务端它监听的数据传输端口是1027。

第二步:FTP服务端发送ACK给FTP客户端的1026端口。

第三步:FTP服务端通过数据端口20端口与FTP客户端1027端口建立连接。

第四步:FTP客户端传送ACK给FTP服务端以确认建立连接。

根据上述描述,站在FTP服务端防火墙的角度,需要开通以下网络关系:

  1. FTP客户端任意端口到FTP服务端21端口。
  2. FTP服务端21端口到FTP客户端的大于1023端口。
  3. FTP服务端20端口到FTP客户端的大于1023端口。
  4. FTP客户端大于1023端口到FTP服务端20端口。

可以看出,FTP主动模式最大的问题是,FTP客户端不是直接创建到FTP服务端20数据传输端口的连接,而只是告诉FTP服务端自己监控的端口,由FTP服务端创建连接。这会造成FTP客户端的防火墙认为这是一个外部建立的连接而被拦截掉。

FTP:被动模式

为了解决主动模式中由于FTP服务端建立连接造成的问题,所以FTP有另一种模式——被动模式。在FTP被动模式中,FTP客户端负责创建命令传输和数据传输两条连接,从而解决防火墙拦截FTP服务端建立连接到FTP客户端的问题。当FTP客户端创建FTP连接的时候,FTP客户端会开通随机的两个端口N和N+1(N>1023)。其中,N端口与FTP服务端21端口建立通讯,并发送PASV命令到FTP服务端。FTP服务端接收到PASV命令之后,会随机创建一个端口P(P>1023),并将端口P返回给FTP客户端。FTP客户端拿到P端口后,就会通过N+1端口与P端口建立数据传输连接。图示如下:

第一步:FTP客户端与FTP服务端命令传输端口21建立通讯,并传输PASV命令。

第二步:FTP服务端通过21端口响应FTP客户端1026端口,并告诉FTP客户端它将监听2024端口作为数据传输端口。

第三步:FTP客户端1027端口与FTP服务端2024端口建立连接。

第四步:FTP服务端通过2024端口返回ACK确认给FTP客户端1027端口。

根据上述描述,站在FTP服务端防火墙的角度,需要开通以下网络关系:

1.FTP客户端任意端口到FTP服务端21端口。

2.FTP服务端21端口到FTP客户端的大于1023端口。

3.FTP客户端任意端口到FTP服务端的大于1023端口。

4.FTP服务端大于1023端口到FTP客户端大雨1023端口。

由此可见,被动模式解决了主动模式在客户端上面开通网络关系的问题。但存在另一个问题,就是FTP客户端需要开通网络关系到FTP服务端的所有大于1023端口,这可能也是网络安全不允许的。不过现在有些FTP可以指定一个范围的端口,以达到控制安全的作用。

一个细节

在使用FTP命令行打开FTP连接进行通讯的时候,有时候会有这样的响应:

  1. PORT 192,168,150,80,14,178
  2. 227 Entering Passive Mode (192,168,150,90,195,149)

这些响应中,那串数子头4个是IP地址,后两位是表示端口,端口的计算是将第5位数乘以256加上第六位数。如192,168,150,90,195,149,则端口为195*256+149=50069。

参考资料

  1. Active FTP vs. Passive FTP, a Definitive Explanation

    http://slacksite.com/other/ftp.html

    这篇文章很详细,看不明我写的中文的,可以看这篇英文的。

FTP之主动模式vs被动模式的更多相关文章

  1. FTP的主动模式和被动模式

    摘自http://blog.csdn.net/love_gaohz/article/details/50723164 http://my.oschina.net/binny/blog/17469 FT ...

  2. Linux FTP的主动模式与被动模式

    Linux FTP的主动模式与被动模式 一.FTP主被动模式        FTP是文件传输协议的简称,ftp传输协议有着众多的优点所以传输文件时使用ftp协议的软件很多,ftp协议使用的端口是21( ...

  3. ftp的主动模式和被动模式的配置和区别

    原文链接: https://www.cnblogs.com/lnlvinso/p/8947369.html ftp模式分为主动模式(active mode)和被动模式(passive mode),ft ...

  4. FTP的主动模式与被动模式

    FTP服务器使用20和21两个网络端口与FTP客户端进行通信. FTP服务器的21端口用于传输FTP的控制命令,20端口用于传输文件数据. FTP主动模式: FTP客户端向服务器的FTP控制端口(默认 ...

  5. FTP基础知识 FTP port(主动模式) pasv(被动模式) 及如何映射FTP

    您是否正准备搭建自己的FTP网站?您知道FTP协议的工作机制吗?您知道什么是PORT方式?什么是PASV方式吗?如果您不知道,或没有完全掌握,请您坐下来,花一点点时间,细心读完这篇文章.所谓磨刀不误砍 ...

  6. 【ftp】主动模式和被动模式

    来自:http://blog.csdn.net/liuhelong12/article/details/50218311 原博主不让转载全文,不过下面这部分是原博主转载别人的,所以我拿过来应该没问题吧 ...

  7. 简述FTP的主动模式与被动模式(精简)

    一.主被动 主动: 客户端从任意一个大于1024的端口现在假设为1234(非特权端口)连接到服务端的21端口(命令端口),随之客户端监听端口(N+1)即为1235端口(可以理解为这是客户端认定的数据端 ...

  8. FTP 传输中的主动模式和被动模式

    最近做一个项目用到FTP和其它系统进行文件传输,结果在FTP网络连接的问题上花了很多时间,由于太久没搞多FTP,忘记了FTP不单单开放21端口,客户端采用不同连接模式对网络有不同.在此重温一下FTP的 ...

  9. Ftp主动模式和被动模式以及java连接ftp模式设置

    Ftp主动模式和被动模式以及java连接ftp模式设置 https://www.cnblogs.com/huhaoshida/p/5412615.html (1) PORT(主动模式) PORT中文称 ...

随机推荐

  1. 慕课linux学习笔记(四)常用命令(1)

    Root 表示当前登录用户 Localhost 主机名 ~ 当前所在位置(~表示/root) # 超级用户 $ 普通用户 命令 1.pwd 显示当前所在位置 2.ls 查询目录中的内容 -a 显示所有 ...

  2. sublime text 发现一个超好的编辑器

    垂直竖行多行编辑 鼠标中建拖动或 shift+右键拖动 切换文件 ctrl+p 输入文件名 可以拖动项目文件夹到sublime text左栏, 也可文件--打开文件夹--项目所在文件夹,但会在新窗口中 ...

  3. cocos2d安卓android长音效播放不完全

    是因为安卓限制了音效的内存,一般把mp3的比特率压缩一下.就可以搞定了.

  4. 考查嵌入式C开发人员的最好的16道题

    约定:   1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了    2)数据类型             char 一个字节 1 byte        int 两个字节 2 byte ( ...

  5. 开发反模式(GUID) - 伪键洁癖

    一.目标:整理数据 有的人有强迫症,他们会为一系列数据的断档而抓狂. 一方面,Id为3这一行确实发生过一些事情,为什么这个查询不返回Id为3的这一行?这条记录数据丢失了吗?那个Column到底是什么? ...

  6. ECharts JavaScript图表库 ECharts

    ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值 ...

  7. Sum 类型题目总结

    Sum类的题目一般这样: input: nums[], target output: satisfied arrays/ lists/ number 拿到题目,首先分析: 1. 是几个数的sum 2. ...

  8. ios相册

    1, 系统图片剪裁的问题 http://www.cnblogs.com/liulunet/archive/2013/01/19/2866399.html

  9. Linux网络编程--多播

    一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情 ...

  10. SoupUI接口测试学习分享

    一.SoapUI的使用 我们主要用SoapUI的REST 测试功能来测试我们协议接口.RESTful是一种服务端API的规范,每个资源对应唯一的URI,然后用HTTP的POST.GET.PUT.DEL ...