FTP环境
Linux环境 |
|
| Window环境 |
|
| wuFtpd | 早期的ftp服务器,拥有不错的稳定性 |
| IIS |
| proFtpd | 对wuFtpd的全面重写
|
| Server-U |
| vsFtpd | 高速、稳定
|
|
|
| pureFtpd |
|
|
|
Apache FtpServer |
|
|
|
|
|
|
|
|
|
FTP的两个TCP连接
- 控制连接,用于ftp客户端与ftp服务器端传递命令
- 数据连接,用来上传/下载数据。
传输方式
FTP协议规定了两种传输方式:
- ASCII方式,这种机制指,在针对传输内容是ASCII码文本时,文件内容会被调整,有时会造成传输的文件被损坏,ASCII方式会把文件中的某些字符串位丢弃,所以不能保证文件数据的每一位都是重要的。
- 二进制方式,首先二进制方式保证了文件内容所有数据位都是重要的。
- 经过验证在传输文件类型为非文本内容的文件,使用ASCII传输方式造成传输的文件内容损坏。
FTP自身有两种工作模式,也就是说在第二步中提示“建立另外一条专有数据连接方式”的方法有两种。习惯上我们称为主动模式和被动模式:PORT方式和PASV方式。
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据,有时候这种连接往往被客户端防火墙当作一种外部攻击而据之在外。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同了。在建立数据连接的过程中,客户控制进程反客为主,成为连接的接受者,而服务器数据传输进程成了连接的请求者。
数据传输模式下,作为新的子进程,服务器传输进程可以申请一个新的端口号建立关联(一般是20端口),但是它向哪个客户端口发送连接请求呢?因为客户是没有公认端口的,这时就要用到控制连接。客户控制进程通过控制连接告诉服务器控制进程自己的数据连接端口号;服务器控制进程将它转告自己的数据传输进程,服务器便利用这个端口与客户建立数据连接。
FTP之Port模式
FTP之Passive模式
PASV模式的端口计算
端口号的计算机公式为:10*256+22=2582,所以客户端应该连接服务器的2582端口建立数据连接;
实践(Java与FTP)
Java与FTP的连接
- 简易连接方式,账户以及数据信息暴露,无法保障传输数据安全;
- 支持SSL/TLS的连接
- 支持证书双向认证;
- 支持传输数据的过程是较安全的;
Java应用与FTP传输的逻辑层
- 记录FTP访问日志;
- 访问认证机制,与应用系统认证模块集成;
- 流量统计,待验证
注意事项
- 注意数据交互方式(ASCII/BINARY),此问题会导致传输的文件内容损坏。
- 如果出现使用其它客户端传输内容丢失的情况,可考虑直接使用原生ftp命令人工进行测试
- 服务器权限问题
参考资料
- Apache FTP Server http://mina.apache.org/ftpserver/downloads.html
- FTP之telnet测试 http://hi.baidu.com/xianyang1981/blog/item/14a20e60511019cd8cb10d3a.html