FTP是一种文件传输协议,它支持两种模式,一种方式叫作Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server。java
下面介绍一个这两种方式的工做原理:程序员
Standard模式安全
FTP 客户端首先和FTP Server的TCP 21端口创建链接,经过这个通道发送命令,客户端须要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端经过本身的TCP 20端口发送数据。 FTP server必须和客户端创建一个新的链接用来传送数据。服务器
Passive模式网络
在创建控制通道的时候和Standard模式相似,当客户端经过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口而且通知客户端在这个端口上传送数据的请求,而后FTP server 将经过这个端口进行数据的传送,这个时候FTP server再也不须要创建一个新的和客户端之间的链接。多线程
如今的FTP软件里面包括在IE5以上的版本里面也已经支持这两种模式了。通常一些FTP客户端的软件就比较好设置了,通常都有一个PASV的选项,好比CuteFTP,传输的方式都有Standard和PASV的选项,能够本身进行选择;另外在IE里面若是要设置成PASV模式的话能够选中工具-Internet选项-高级-为FTP站点启用文件夹视图,不然就采用Standard模式。socket
IE客户端的配置:工具
不少防火墙在设置的时候都是不容许接受外部发起的链接的,因此FTP的Standard模式在许多时候在内部网络的机器经过防火墙出去的时候受到了限制,由于从服务器的TCP 20没法和内部网络的客户端创建一个新的链接,形成没法工做。固然也能够设置成功,首先要建立一条规则就是容许内部的IP链接外部的IP的21端口;第二条就是禁止外部IP的TCP 20端口链接内部IP的<1024的端口,这条是为了防止外部链接内部的常规端口;第三条验证ACK是否等于1,这个的原理就参见TCP创建链接的三次握手吧。因此若是安全的配置的话很是困难,这个时候就想起来了PASV模式,由于不用创建新的链接,因此也就不会涉及到后面的问题了。可是管理员可能不想使用PASV模式,由于这个时候FTP Server会开放一个随机的高端口,尽管在IIS4和IIS5里面端口的范围是1024-5000,可是许多FTP Server的端口范围达到了1024-65535,这个时候在这个主动开放的随机端口上是有彻底的访问权限的,若是IIS也要设置成开放的端口为1024-65535,具体方法以下:this
1. regedt32spa
2. 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3. 编辑-添加-数值
value Name: MaxUserPort Data Type: REG_DWORD value: 65534
因此若是遇到了有防火墙的话或者怕配置麻烦的话仍是采用PASV模式比较好些,可是若是真的对安全的需求很高的话建议采用Standard模式。
在IIS中的FTP服务器端对两种客户端都支持,没有办法选择单独支持某一种客户端。
FTP服务端口号20(数据端口)加一就是FTP控制端口的号码21。
CUTFTP客户端:
或:
——————————————————————————————————————————————————————————————————
内部原理文章
转载:http://useway.blog.51cto.com/736087/151495/
Java的FTP协议级客户端实现详解