记一次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 ...
随机推荐
- HTML DOM 对象简单介绍
文档对象模型(Document Object Model,DOM)是DHTML的基础. 常用对象:1)window对象:表示对象浏览器窗口(选项卡)对象.2)document对象:代表整个网页,是客户 ...
- vim使用命令
* 向前搜索当前单词 # 向后搜索当前单词 n 和 shift n(N) 向后向前跳到所匹配的单词处 C-f page down; C-b page up C-o 回到上次位置 C-i &qu ...
- calc常用
Mod:求模(整数相除求余数), And:按位与 Or:按位或 Xor:按位异或 Lsh:按位左移 Not:按位取反 Int:取整数部分
- String 与 StringBuffer的区别
String="a" 的方式每相加一次就创建一个新的常量,原常量不消失,比较占内存:StringBuffer是放在堆里面,append直接在原地址相加,不占内存
- 史航416第11次作业&总结
作业1:冒泡排序 #include <stdio.h> ],int n); int main() { ],n,i; printf("输入一个整数n:"); scanf( ...
- 全面的Seo面试题
一.选择题(每题2分,2分×10=20分) 1.白帽SEO诞生日是: A .1997年9月15日 :B .2004年12月13日:C.2005年3月26日:D.2009年6月1日 2.一个做女性服 ...
- eclipse- Web-app verson=2.5 调整将Dynamic Web Module3.0降为2.5
如果提示cannot change version of project facet Dynamic Web Module to 2.5 1.把Dynamic Web Module复选框,勾选去掉,点 ...
- IIS内存溢出-设置IIS的应用程序池
在ASP.NET Web服务器上,ASP.NET所能够用到的内存,通常不会等同于所有的内存数量.在machine.config(C:/WINDOWS/Microsoft.NET/Framework/v ...
- greendao对SQLite数据库的增删改查操作
利用greendao操作数据库时,都是以对象或者对象的list来进行增删改查的操作,操作的结果都是用一个list来接收的!!! 1.增加一条记录 Stu stu01=new Stu();stu01.s ...
- Java内存分配及变量存储位置实例讲解
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...