认真能把事做对,用心才能把事做好,专心、专注、心注未来。 声明:本博客内容除特别注明转载外全部是个人工作总结,转载时请注明出处!

关于ftp上传问题

上一篇 / 下一篇  2013-03-22 17:51:33 / 个人分类:原创

1       问题现象:

现网深圳使用升级Portal不能正常上传文件,上传时会一直卡在上传文件操作,一直上传,但是不会结束,查看服务器上文件发现文件大小一直为0,上传一直不成功,上传程序僵死,不做反应

程序日志中显示连接成功,但是传输文件时不报错,不传输,程序挂死

 

2       FTP中的工作方式

FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式,或者叫PORT模式),一种是 Passive (也就是PASV,被动方式) Standard模式 FTP的客户端发送 PORT 命令到FTP serverPassive模式FTP的客户端发送 PASV命令到 FTP Server  

下面介绍一个这两种方式的工作原理:   

Standard模式FTP 客户端首先和FTP ServerTCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。  

缺省情况下Standard模式的数据端口是20控制端口是21(控制端口可以设定,本文假定使用21)。当进行连接时,客户端使用一个随机的端口NN大于1024)连接服务器的控制端口21然后客户端开始监听端口N+1,并向服务器发送命令PORT N+1,服务器用自己的数据端口20连回客户的N+1端口。
由于Standard模式仅仅是发送端口给服务器,由服务器连回客户端,如果客户端有防火墙,这样的连接会被认为是外部主机试图连接内部的主机,通常情况下是不允许的。

Passive模式在建立控制通道的时候和Standard模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于10245000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。

当进行连接时,客户端使用一个随机的端口NN大于1024)
连接服务器的控制端口21并向服务器发送命令PASV,服务器使用一个随机的数据端口M(M>1024)并发回客户端,客户端用数据端口N+1连接服务器的端口M由于客户端发起数据连接,这样就解决了防火墙带来的问题。

3       问题分析

由于SMSUpgrade升级Portal的实现机制为:先将文件上传到SMS上,再从SMS上传文件到升级服务器上,深圳的SMS部署有防火墙,因此怀疑为上传操作被防火墙阻止

查看代码发现上传的实现方式使用的是第一种方式(Standard模式),根据上面的说明ftp server还需要和ftp client建立一个新连接,那么有可能是此条连接不能建立造成的(被防火墙阻止),但是未进行端口查看操作(无具体证据)

将程序修改为第二种方式(PASV模式),进行上传测试OK

4       修改方法

修改起来很简单(以下对java来说,并且ftp服务使用的是org.ache.commons.net.ftp包):

在建立发ftp client的连接之前或者之后添加ftpClient.enterLocalPassiveMode();即可(目前采用在连接建立之后添加此操作) 


TAG: 缺陷分析 ftp FTP ftp工作方式

 

评分:0

我来说两句

Open Toolbar