FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,应用层的协议,它基于传输层, FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理 , FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。

FTP功能

FTP服务器功能除了单纯的进行文件的传输与管理以外,还提供一下几个主要功能。

不同等级的用户身份:user,guest,anonymous

FTP服务器在预设的情况下,根据使用者的登入情况而分为三种不用的身份

1.user:实体账号,realuser

2.guest:访客

3.anonymous:匿名登录者

当然3者在系统上的权限差异很大,例如:实体用户取得的系统权限比较完整;而对于匿名用户不对其开放太多的权限。

命令记录与登录文件记录

FTP可以利用系统的syslogd服务来进行数据的记录,而记录的数据包括用户曾今下达过的命令与用户传输数据(传输时间,文件大小)的记录,所以可以从/var/log/中找到各项登录信息

限制用户活动目录(change root 简称:chroot)

为了避免用户在你的linux系统中离开自己的家目录进入到linux系统的其他重要目录中,所以将使用者的工作范围局限在自己的家目录中。FTP可以限制用户只能在自己的家目录活动,使用者无法离开自己的家目录,登入FTP后看到的根目录就是自己的家目录

FTP运作流程

FTP是应用层的协议,它基于传输层TCP协议传输,TCP建立连接需要三次握手,FTP服务一般运行在20和21两个端口,端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流.这两种传输都需要经过三次握手。

这里以主动连接(Active)讲解运作流程

1.建立命令通信

客户端会随机取一个大与1024的端口(portAA)经过三次握手与FTP服务器21端口达成联机,此后客户端便可以通过这个联机来对FTP服务器进行指令的下达,包括查询文件名、下载、上传等指令。

2.通过FTP服务端使用主动连接

FTP服务器的21端口主要用来下达命令,当要开始传输数据时,就不适用这个联机了。客户端在需要数据的情况下,会告知服务端要用什么方式来联机,如果是主动式联机,客户端会先随机启动一个端口(portBB),通过命令通道高数FTP服务器这两个消息,并等待FTP服务器的联机。

3.服务器主动向客户机联机

服务器命令通道了解客户端的请求后,会主动的由20号端口向客户端的portBB联机,同样需要三次握手,此时FTP客户端与服务器端共建立了2条联机(命令与数据传输两个信道)。注意,数据传输信道只在有数据传输行为时才建立。

命令通道21与数据传输通道20

21端口主要接受来自客户端的主动联机,20端口则为FTP服务器主动联机至客户端。

主动连接的FTP服务器与客户端之间具有防火墙的连接问题

一般来说,很多局域网都会使用防火墙(iptables)的NAT功能,那么在NAT后端的FTP用户如何连接到FTP服务器呢。

1.用户与服务器间命令信道的建立:

因为NAT会主动记录有内部送往外部的联机信息,而由于命令信道的建立是由客户端向服务器联机的,因此这条联机可以顺利建立起来。

2.用户与服务器间数据信道的建立:

客户主机会先启用portBB,并透过命令通信告知FTP服务器,而等待服务器的主动连接。

3.服务器主动连到NAT等待转递至客户端的连接问题:

由于偷狗NAT转换后,FTP服务器只能得到NAT的IP而不是客户端的IP,因此FTP会以20端口主动向NAT的PortBB发送主动联机的要求,但是你的NAT并没有启动portBB来监听FTP的联机。所以这里就出现了问题。

如何解决这样的问题呢?

1.使用iptables所提供的FTP侦测模块:

可以使用modprobe指令来加载ip_conntrack_ftp及ip_nat_ftp等模块,这几个模块会主动分析目标是21的联机信息,所以可以得到portBB的资料,此时若接收到FTP服务器的主动联机,就能将该封包导向正确的后端主机了。

但是,如果命令通道并非是通过默认端口21来建立的,那么这两个模块就无法解析出来了。

2.客户端选择被动式(Passive)连接模式:

主动模式是由服务器向客户端发起连接,那么被动式就是客户端向服务端发起连接。

被动连接

1.客户端与服务器建立命令信道:

同样,客户端选一个大与1024的端口向服务器21号端口通过三次握手建立通道。

2.客户端发出PASV的连接请求:

当要进行数据传输时,客户端可以通过命令通道发出PASV(Passive的缩写)的被动联机求情求,并等待服务端回应。

3.FTP服务器启动数据端口,并通知客户端

这时服务器会打开一个端口port pasv(可能是随机的也可能是自定义的)处于listen状态,并通过21端口的指令通道将处在监听状态下的次端口发给客户端,并等待客户端通过此端口进行数据传输。

4.客户端随机取用大于1024的端口进行连接:

客户端随机取用大于1024的端口连接服务器的port pasv端口,那么通过portBB和port PASV数据通道就建立好了。

 

引用: http://blog.chinaunix.net/uid-26413668-id-3379352.html

FTP主动连接与被动连接的更多相关文章

  1. linux上搭建ftp、vsftp, 解决访问ftp超时连接, 解决用户指定访问其根目录,解决ftp主动连接、被动连接的问题

    linux上搭建ftp 重要 解决如何搭建ftp         解决用户指定访问其根目录         解决访问ftp超时连接         解决ftp主动连接.被动连接的问题 1.安装ftp ...

  2. Nginx主动连接与被动连接的差别

    1.主动连接是指Nginx主动发起的同上游server的连接:被动连接是指Nginx接收到的来自client主动发起的连接; 2.主动连接用ngx_peer_connection_t结构体表示:被动连 ...

  3. [服务]ftp主动模式和被动模式

    经常忘记这个东西.于是总结下这东西感受下这个协议. FTP连接方式 控制连接:标准端口为21,用于发送FTP命令信息 数据连接:标准端口为20,用于上传.下载数据 数据连接的建立类型: 主动模式:服务 ...

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

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

  5. FTP开启被动连接模式

    在Linux环境下搭建ftp服务器,具体步骤见:http://www.cnblogs.com/zjiacun/p/6896803.html 配置被动连接的方法: 找到配置文件/etc/vsftpd/v ...

  6. FTP主动/被动原理

    FTP 主动模式 1.客户端用大于1024的高位端口发起初始化连接到vsftp服务器的21端口 2.vsftp服务器的21端口主动与客户端大于1024的高位端口建立控制连接 3.vsftp服务器的20 ...

  7. ftp主动模式 被动模式 和iptables 设置

    FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式. Port模式:ftp server:tcp 21 <------client:dynamic    ftp se ...

  8. FTP主动模式和被动模式的区别

    基础知识: FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口).通常21端口是命令端口,20端口是数据端口.当 ...

  9. 【转】FTP主动模式和被动模式的比较

    总是记不住FTP主动和被动模式的区别.放在这里,以备日后查阅.   FTP是仅基于TCP的服务,不支持UDP.与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口).通常来说这 ...

随机推荐

  1. Spring 读取配置文件(一)

    注册 @Configuration 标识的类,spring 读取配置文件的时候该类会被自动装载 package cn.com.receive;import org.springframework.be ...

  2. intent 启动activity、service的方法

    1.通过intent启动service. 通过传递一个Intent对象至Context.startService()将启动一个服务(或给予正在运行的服务以一个新的指令).Android调用服务的onS ...

  3. Keil(MDK-ARM)使用教程(一)_界面+菜单

    Ⅰ.概述 今天总结Keil(MDK-ARM)界面和菜单相关的内容,详情请往下看. 关于Keil的下载.安装和新建工程我已将在前面做了详细的总结,不懂的可以参考我博客里面相关的文章.该文章是在新建好工程 ...

  4. text-encoding正确使用姿势

    蓝牙打印,需要转字符串为gb2312到uint8array.果断使用了一把text-encoding,始终不对. https://github.com/inexorabletash/text-enco ...

  5. Servlet 客户端 HTTP 请求

    当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的.您可以查看 HTTP 协议 了解更多相关信息. 以下是来自于浏 ...

  6. jQuery 数据操作函数

    函数 描述 .clearQueue() 从队列中删除所有未运行的项目. .data() 存储与匹配元素相关的任意数据. jQuery.data() 存储与指定元素相关的任意数据. .dequeue() ...

  7. php 打印debug日志

    A lesser known trick is that mod_php maps stderr to the Apache log. And, there is a stream for that, ...

  8. setTimeout里无法调用鼠标事件的event

    问题的由来是下面这段代码: middleOnmouseLeave: function (event) { setTimeout(function () { event.currentTarget.st ...

  9. Asp.net 基于Cookie简易的权限判断

    基于Cookie简易的权限判断代码,需要的朋友可以参考下. 写入Cookie页面,创建cookie后,设置cookie属性,并添加到Response.Cookies中读取cookie,利用cookie ...

  10. Java基础教程笔记

    第一部分——java基础程序设计 一:java语言特色 1:语言有点:“一次编写,到处运行” 2:相对于C++A:提供了对内存的自动管理:B:去除了C++语言中的“指针”:C:避免了赋值语句(如a=3 ...