ftp服务器日常维护结论,FTP出现的问题—经验总结二

一、问题描述

一般情况下,我们都会采用FTP来迁移文件,即把文件从FTP服务器迁移到客户端。而且为了提高我们系统的通用性,我们不关心FTP服务器和客户端的具体部署,即使它们被配置在同一台主机上,我们也照样使用FTP来进行文件的迁移。

这时隐患就出现了。当FTP服务器和客户端被配置在同一台主机上时,如果我们需要迁移大量的小文件,文件总数可达几千甚至上万,那么在迁移过程中,很可能会突然出现文件传输失败的现象,而且如果小文件总数较多的话,这种现象很容易就会复现。

如果我们使用MFC提供的CFTPConnection应用程序,它会返回给你一个错误信息,错误类型是:ERROR_INTERNET_EXTENDED_ERROR

12003,解释就是内部错误。

二、问题分析

首先,我们需要再次确定这个问题发生的两个前提条件:

1. FTP服务器和客户端都配置在了同一台主机上。

2. 需要迁移大量小文件。

我们下面的分析都是基于这两个前提条件的。

我们可以通过一些工具(比如TCPView)来分析此时这台主机的TCP连接情况,结果发现所有可用的用户端口都被占满了。为什么会出现这种情况呢?我们可以从FTP的连接机制入手,来分析这个问题。

客户端和FTP服务器的连接方式分为主动模式和被动模式。

主动模式,当打开一个

FTP连接时,客户端选择一个正处于空闲状态的用户端口N(N>1024)连接到FTP服务器的命令端口(21端口),然后客户端再选择一个空闲的端口N+1作为数据端口,并创建监听套接字来绑定这个端口,进入监听模式后开始监听这个端口。与此同时,发送FTP命令“port

N+1”到FTP服务器。FTP服务器接到命令后,就把它自己的数据端口(20端口)连接到客户端指定的数据端口。

被动模式,客户端选择两个正处于空闲状态的用户端口N(N >

1024)和N+1,分别作为命令端口和数据端口。N端口连接FTP服务器的命令端口(21端口),但与主动模式不同的是,客户端不发送port命令,从而不允许服务器来回连它的数据端口,而是发送pasv命令。FTP服务器接收到该命令后,就会再打开一个正处于空闲状态的用户端口P(P

> 1024),并发送命令“port

P”到客户端,客户端接收到该命令后,就把N+1端口连接到服务器的P端口用来传输数据。

通过以上分析,我们可以看到:主动模式下,传输一个文件需要占用主机2个用户端口。被动模式下,传输一个文件则需要占用主机3个用户端口。

在Windows XP和Windows Server 2003中用户端口默认为1025 ~

5000,在注册表中,最大用户端口MaxUserPort默认为5000。在TCP协议中,为了保证正常关闭连接,在任何一方提出关闭连接请求后,操作系统并不会立即释放连接,而是会等待一段时间后才将连接释放,然后再释放绑定的端口。在注册表中也可以设置这个等待时间(TcpTimedWaitDelay),它的取值在30~300秒之间,默认是60秒。也就是说,在默认情况下一个端口的释放需要等待60秒。

在被动模式下,调用一次CFTPConnection中的GetFile方法,就会打开3个用户端口,那么在60秒之内调用GetFile方法不能超过1666次,否则,就会超过默认的5000个用户端口数限制,这时GetFile方法因为没有空闲端口可用,从而返回错误码12003,提示用户数据传输失败。

总之,出现问题的主要原因就是传输完毕一个小文件后,FTP不能够及时释放所占用的用户端口,造成大量用户端口的占用,直至出现超出系统默认的用户端口总数现象,从而造成数据传输失败。

三、问题解决

通过上节的分析,我们就很容易解决这个问题:

1. 修改注册表,把关闭连接的等待时间设置为最小值30秒。

2. 修改注册表,把系统默认的最大用户端口的值设置为65535。

修改注册表文件内容过程如下:

1. 打开文本编辑器,编辑下面的内容。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

"TcpTimedWaitDelay" = dword:0000001e

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

"MaxUserPort" = dword:0000ffff

2. 编辑完毕,保存文件,扩展名为.reg,例如:1.reg。

3. 双击运行保存后的文件,系统会提示是否把文件中的内容添加进注册表,点击是按钮,弹出确认框后,接着点击确认按钮,就可以把内容添加进注册表了。

4. 在命令行运行regedit命令,根据编辑内容中的路径信息,就可以查询内容是否添加进注册表。

四、问题总结

如果应用程序需要在本地采用FTP迁移大量的小文件,就必须修改操作系统有关FTP的参数设置,否则,很容易就会出现问题,使得数据传输失败。出现这类问题,我们首先要查清是否是我们的程序问题,确认无误后,就要考虑调用的底层服务程序是否能够完全满足我们的功能需求,是否有什么我们不知道的限制,并充分利用网络资源获得一些分析工具,对出现问题的服务程序进行严格测试,找到出现的问题所在,然后予以解决。

对开发人员来说,这类问题是很隐蔽的,如果不了解操作系统关于TCP/IP方面的知识,这个问题就很难予以解决。因此,开发人员需要不断地学习业务知识,并及时总结工作中遇到的问题,积累经验,从而提高自己分析问题、解决问题的能力。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值