好久没写博,还是重拾记录一下吧。

背景:买了一个阿里云的云虚拟机用来搭建网站(起初不了解云虚拟主机和云服务器的区别,以为都是有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上传文件总是超时的解决过程的更多相关文章

  1. PHP利用FTP上传文件连接超时之开启被动模式解决方法

    初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...

  2. .net FTP上传文件

    FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...

  3. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  4. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  5. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

  6. FTP上传文件提示550错误原因分析。

    今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...

  7. FTP 上传文件

    有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...

  8. Java ftp 上传文件和下载文件

    今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...

  9. C# FTP上传文件至服务器代码

    C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...

随机推荐

  1. 为控件Button设置快捷键(组合键)

    控件MenuStrip和ContextMenuStrip可通过ShortCcutKeys属性设置快捷键,而控件Button没有ShortcutKey属性,如何为控件Button设置快捷键呢(组合件键) ...

  2. 一个简单的零配置命令行HTTP服务器

    http-server 是一个简单的零配置命令行HTTP服务器, 基于 nodeJs. 如果你不想重复的写 nodeJs 的 web-server.js, 则可以使用这个. 安装 (全局安装加 -g) ...

  3. HTML DOM Event对象

    我们通常把HTML DOM Event对象叫做Event事件 事件驱动模型 事件源:(触发事件的元素)事件源对象是指event对象 其封装了与事件相关的详细信息. 当事件发生时,只能在事件函数内部访问 ...

  4. Perl爬取江西失信执行

    #! /usr/bin/perl use strict; use Encode qw(encode decode); binmode(STDIN,":encoding(utf8)" ...

  5. HTML5 canvas beginPath() 方法

    beginPath() 方法开始一条路径,或重置当前的路径.w3school上的解释! 路径是canvas里很重要的一个概念,刚开始学canvas的人对路径理解不是很深,他们在用canvas的时候会乱 ...

  6. 犀利点评:csdn某文<第一次创业还是失败了---分享失败的经验>

    今天上午在csdn看了一篇创业文,突然想无节操的做一下点评. 原文详细地址如下:http://blog.csdn.net/android_tutor/article/details/9815801 以 ...

  7. Office 365 系列五 -------- Imap邮箱迁移步骤

    当客户购买了我们的Office 365之后,第一个功能必然是会用我们的企业邮箱,如果企业之前是用 263.腾讯.网易等的邮件厂商的话,必然会涉及到邮件的迁移, 其实说到邮箱迁移,我们办法很多,如果人数 ...

  8. Struts2,Spring, Hibernate三大框架SSH的整合步骤

    整合步骤 创建web工程 引入相应的jar包 整合spring和hibernate框架 编写实体类pojo和hbm.xml文件 编写bean-base.xml文件 <!-- 1) 连接池实例 - ...

  9. java io流之字符流

    字符流 在程序中一个字符等于两个字节,那么java提供了Reader.Writer两个专门操作字符流的类. 字符输出流:Writer Writer本身是一个字符流的输出类,此类的定义如下: publi ...

  10. C. Shaass and Lights 组合数学

    http://codeforces.com/contest/294/problem/C 把那个数组n分段了,那么有两类. 1.开头和端点那些,就是只有一端在开始的,这个时候,要开完这些灯,只能循序渐进 ...