记一次FTP上传文件总是超时的解决过程
好久没写博,还是重拾记录一下吧。
背景:买了一个阿里云的云虚拟机用来搭建网站(起初不了解云虚拟主机和云服务器的区别,以为都是有SSH功能的,后来发现不是这样样子啊,云虚拟机就是FTP上传网页+MySQL存储数据,对于只做网站来说还行,但是想做一些扩展或高级功能就不行了,强烈建议还是买云服务器ECS)。
使用的时候遇到一个非常奇怪的现象。在家里的网络环境下(使用DLink做路由器),连接FTP服务器和下载文件都没有问题,但是上传文件总是到100%然后卡住很久,然后出现Timeout,服务器上的文件被覆盖,但字节为0。一开始以为是FileZilla设置的问题,于是在主动被动模式,字符集这些调了半天,还是不行;后面更换了Transmit,Mac终端的ftp,Windows虚拟机里面的Explorer,CuteFtp,FlashFXP这些进行测试,发现还是一样的结果。但是后面我在公司网络环境下使用任何一个客户端进行上传都没有出现问题。
我怀疑是阿里云的云虚拟机FTP有限制,我在阿里云工单系统提交了一个工单要求解决两个问题:
发送超时问题:
ftp> put ~/common.css /htdocs/common.css
Entering Extended Passive Mode (||||).
Ok to send data.
% |***********************************| 21.08 MiB/s : ETA
Failure reading network stream.
bytes sent in : (0.28 KiB/s)
登录失败问题:
421 There are too many connections from your internet address.
但通过讨论发现第二个问题应该是我在上传超时时多次断开和连接造成的,容易解决。问题在于上传超时问题,售后认为可能是IP遭到屏蔽,但查询后并没有。没有更好的思路解决问题,只好在家里各种测试,多次测试后发现只要是一个比较"小"的文件(小于1KB),上传成功;但是“大”一点的文件(比如2KB以上),就总是上传失败。跟文件的类型无关。反馈给售后后认为是我本地的网络环境不稳定导致的,但是我用的是以太网,使用的过程中HTTP下载、QQ微信登录都没有问题,玩DOTA2也没有出现掉线情况,应该不会“不稳定”到2KB的文件都上传不上去。最终我测试得出文件<=1432B都能上传,>1432B就上传不了了,更排出了“不稳定”的问题,因为不稳定的话上传失败不可能一直处于1433B这个临界值。
在Google上搜索相关中文网页,但很少有相关的信息,不过有一些引导我向防火墙、路由器这些方面思考,反馈给售后那边却表示没有更多办法帮忙了。Mac的防火墙我都是关闭的;路由器防火墙管理方面只能自己动手把功能都试一下。但是DMZ,防火墙规则,端口转发这些设置弄了遍也没有解决问题。
还是回到Google,在更换了多次英文关键词后,终于找到了一些跟我同病相怜的人。其中最为有用的是https://trac.filezilla-project.org/ticket/5533#no1,通读了一遍终于找到了问题所在。大意就是FTP使用两个TCP连接来通信,一条控制连接(control connection)用来提交命令和接受回复;一条数据连接(data connection)来处理实际的文件传输。在文件传输过程中,控制连接是很容易进入空闲状态的,TCP标准也没有规定一个连接的最大空闲时间。但是路由器和防火墙经常会把空闲的连接给关闭掉,并且不通知双方,就造成了传输100%但最后还是超时的现象。后面的评论就是解决问题的关键了:TCP传输过程中有最大的包上限MTU(Maximum Transmission Unit,不超过1500),超过这个大小的传输就要拆成多个包(packet)。所以比较“小”的文件不用拆包,一次就传输完了;“大”的文件需要拆包,分多次发送,就出现超时的问题。对于不同的ISP提供商来说,不同的MTU存在最优值。于是在路由器管理页面找到MTU设置,发现原来是1492,随手用网上找的值1472填进去,重启路由器,It works!!

记一次FTP上传文件总是超时的解决过程的更多相关文章
- PHP利用FTP上传文件连接超时之开启被动模式解决方法
初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...
- .net FTP上传文件
FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...
- 通过cmd完成FTP上传文件操作
一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
- 再看ftp上传文件
前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...
- FTP上传文件提示550错误原因分析。
今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...
- FTP 上传文件
有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...
- Java ftp 上传文件和下载文件
今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...
- C# FTP上传文件至服务器代码
C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...
随机推荐
- java -cp
java -cp /home/hdp/log4jTest/log4j-1.2.17.jar:/home/hdp/log4jTest/testLog.jar:/home/hdp/log4jTest/co ...
- Patching Array
引用原文:http://blog.csdn.net/murmured/article/details/50596403 但感觉原作者的解释中存在一些错误,这里加了一些自己的理解 Given a sor ...
- 关于js调用外部部署的web api
没想到多年之后我还得继续写这些东西.... 瀑布汗~ 最近不得不开始研究用web api MVC的项目中,在js文件里,实现点击一个按钮调用外部发布好的api,再从api把值回传给js页面,跳转. 经 ...
- 4.struts2中的文件上传,下载
Struts2中文件的上传下载,是借用commons里面的包实现文件的上传,需要导入两个jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar 实现 ...
- delphi安装 Tclientsocket, Tserversocket控件
菜单component->Install Packets按Add按钮,选择delphi目录里的bin目录下的dclsockets70.bpl(delphi2010是 dclsockets140. ...
- C语言学习笔记(一)_hello world程序中涉及的c语言元素
#include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...
- python中的时间转换
Python中的时间相关库有: datetime 和time. 主要形式有: datetime timestamp 相互转换: timestamp->datetime: dt = datetim ...
- [原创]Matlab之复选框使用
本文简单记录在Matlab的GUI设计中,复选框的一些使用,比较简单. 简单到直接上代码,就是可能比较容易忘记,使用的时候再翻回来好了. 1 2 3 4 5 6 7 % 复选框,选中后为1,未选中则为 ...
- oracle分页查询sql
select * from( select shopid,rownum rn from p_shopinfo where is_hot=1 and rownum <=6 order by sho ...
- js- this
this对象是基于函数在执行的环境绑定的. (一) this 在闭包环境中指向的对象. <Js高级程序设计>中提到: 每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和 ...