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

背景:买了一个阿里云的云虚拟机用来搭建网站(起初不了解云虚拟主机和云服务器的区别,以为都是有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. Qt窗口的屏幕居中显示

    QDesktopWidget *pDesk = QApplication::desktop(); login->move((pDesk->width() - login->width ...

  2. git ssh端口号变更之后所需要的修改

    假设原本的repository地址为:git@gitlab.cjx.com:jinxin/project2.git 端口变更之后,需要调整为:ssh://git@gitlab.cjx.com:PORT ...

  3. oracle sql查询转义下划线

    1,看以下结果 select * from test where login like '%CF_%'; LOGIN------------------------------------------ ...

  4. json_decode返回null 和synax error原因及处理

    $checkLogin ='[{"gdsincode":"1103293","gdsname":"鲜美来带鱼段800g" ...

  5. UNIX:高级环境编程 - 第十五章 IPC:进程间通信

    IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信. 1.管道 1.1管道特点: (1)半双工的(即数据只能在一个方 ...

  6. PostrgreSQL 表名大小些问题(public."tablename")

    问题: 今天做表查询的时候,发现用以前的代码查询出现问题,提示说表名不存在. 现象: 通过PostrgreSQL客户端查询,发现出问题的表的查询语句如下: SELECT * FROM public.& ...

  7. java中的 FileWriter类 和 FileReader类的一些基本用法

    1,FileWriter类(字符输出流类) |--用来写入字符文件的便捷类.此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的.要自己指定这些值,可以先在 FileOutputStream ...

  8. 游戏中的人工智能——初探AI

    一.游戏中的人工智能 让游戏具有挑战性: 让游戏好玩的关键因素是为之找到合适的难度等级: 人工智能在游戏中的作用是通过提供富有挑战性的竞争对象来让游戏更好玩,而在游戏中行动逼真的非玩家角色(NPC), ...

  9. [转]反向ajax项目

      ASP.NET WebSocket & Comet Ajax Library (Reverse Ajax - Server Push) 项目链接:http://pokein.codeple ...

  10. 获取本机内存使用信息、DataTable占用内存空间

    相当于windows系统中的任务管理器,功能是通过系统的API实现的本机的监视,代码如下 using System;using System.Collections.Generic;using Sys ...