本
文
摘
要
昨天一个用户问我,为什么他测试XFile服务器的ftp传输FileZilla下载只能达到30M/秒,然后我觉得不可思议啊,1000M网络,虽然win10有Qos限制带宽的毛病,但是至少也能保证800Mbps,去掉磁盘io影响,正常速度应该在70M这样,FileZilla几乎是开源FTP客户端的老大,正常不应该有问题,难道我的服务器软件FTP部分出bug了?可我不记得我这几个版本修改过ftp传输部分啊,先让他报了他的服务器硬件配置,并尝试冷关机重启【防止网络过热导致的丢包影响】,速度始终是这个数字,发了配置,看了下也基本没有大问题,头大。
然后今天,我尝试在自己的win10上使用File zilla从我自己家的服务器[Linux 18.04],并且来了个更精确的,在设置里限制并发连接为1,强制明文传输模式,下载大文件,大跌眼镜啊, 看来用户说的30MB/秒还是基于多链接的,我这里测试速度单链接始终在9.5MB-10.6MB之间跳动,如下图:
也就是莫名的被限制在100Mbps一样的,急忙查看网络连接,如下,确实是1Gbps啊,
会不会是交换机端口之间出现握手降级,服务器输出只有100Mbps了呢?我于是调用了XFile客户端的网络测速功能,如下:
结果发现,使用http流传输协议基本可以跑满【因为win10 需要默认保留20%的带宽给所谓的高级应用,只能用80%,所以减去网络线路损耗,这个速度是正常的】,也就是服务器和win10电脑之间的物理速度确实是1gbps,但是为什么FileZilla传输就是只有10MB?难道真的是出bug了?会不会是我强制使用明文ftp,所以win10认为不安全给 *** 了呢?那么启用ssl会如何?
事实证明和是否加密并没有大的关系,指令通道加密下,照样被限速。
在我调出源代码debug前,我还是想用其他系统测试看看,毕竟win10的bug10大名不是说说的,好,现在我使用一台发布前测试用的win7的笔记本电脑,同样是FileZilla当客户端,尝试从同一台服务器【XFile for linux 18.04】上下载大文件,同样是单线程,不过用ssd当本地硬盘减少io影响,测试速度如下:
奇怪,速度正常了?服务器是sas硬盘加ssd,基本达到了满速,因此基本排除服务器软件本身的问题,但是光一个测试还不够,然后我用找了台联想笔记本,ubuntu 20.04lts linux桌面系统,安装FileZilla ,同样设置为明文,单连接被动,sas->ssd,测试如下:
也是正常的. 这就奇怪了,难道是linux系统的服务器和win10 最新版出了兼容问题?不应该啊,毕竟这只是个网络协议,win10怎么知道服务器跑的是鬼系统,不过本着探寻根源的态度,我用一台老的工作站 win7 pro系统做服务器,设置和linux系统的xfile相同,然后再用win10 + FileZilla进行测试,速度如下:
排除掉速度微小变动,还是非常稳的给我压制在单链接100Mbps内了,基本可以判断win10 Qos策略对FTP软件或者FTP协议优先级和带宽做了限制,那么会不会是根据端口21进行的限制呢?因为走http流没有被限制,因此我尝试将服务器的ftp端口改到https默认的443端口,把ftp伪装成https,看看能不能骗过win10,结果失败,如下:
win10就像吃了枪药一样,死死盯住了FileZilla,一种是基于软件名的网络带宽分配策略,还有一种就是win10在监视ip包,是根据ip包进行的带宽和优先级分配,最后的那种根据入站出站进行限制我暂时还没有想到。然后不死心的我,把老古董LeapFtp也给用上测试,结果结局和FileZilla一样,同样被限速。
但是我还是不死心,难道win10自带的软件也会被限速?于是我用win10 powershell打开了命令行,尝试用命令行进行下载测试?
用win10自带的命令行工具,它居然没有被限制,跑到了95MB/s左右,而FileZilla和其他ftp客户端竟然都给限速了,这是什么神仙操作?但是我注意到了一个非常微小的区别,服务器提示用的是主动连接模式,win10自带的ftp命令行默认只支持port主动模式,而FileZilla和LeapFtp包括我自己的XFile默认都是pasv被动模式,那么会不会是win10的策略就是对ftp等主动连接到外部服务器的行为进行速度限制,而对连入的不进行速度限制呢?这很简单,我们做个简单的测试就知道了,把FileZilla设置里的强制port主动连接给打开 【我们强烈建议你别怎么做,port模式因为存在安全风险,事实上也就是windows 命令行ftp这样的老古董还在使用,目前默认和主流都是pasv】,
然后我们再来测试,ssd->ssd
可以达到全速运行状态,到这里,问题原因基本确定?解决办法也找到了? 不不不, 我们现在重新启动电脑,我们将见证奇迹的出现,重新启动win10系统的电脑,然后重新运行FileZilla,同样设置主动连接模式,单一链接,但是不执行win10 自带的ftp 命令行下载,然后奇迹出现了,见下图:
我了个去,速度又被限制在100Mbps了,http测速正常, 说明刚才的测试,是win10自带的命令行ftp,内部应该有个qos通知机制,让操作系统解除了ftp网络速度限制,推测是个qos特定包,但是目前几乎绝大部分第三方软件,都没有这个机制,包括大名鼎鼎的FileZilla。那么变通的办法就是,你在使用FileZilla等第三方客户端做ftp下载前,用个批处理调用win10自带的ftp cmd链接到同一个服务器,下载个小文件,利用win10 ftp命令行程序发送个解除协议带宽限制,然后一段时间就可以跑满全速了。
最后的终结:win10对ftp被动传输模式的数据传输实行了非常变态或者脑子进水的速度或者带宽限制,它可能是根据连接的模式进行的限制,但是win10自带的网络程序能主动解除带宽限制,也许可能八成背不住是受下图的策略影响
但是bug10一直在瞎折腾,鬼才知道今天有效明天是否就无效了,这里,我只能给你个结论和变通解决办法,那就是暂时抛弃安全问题,在使用第三方ftp客户端前,先用win10 ftp命令行程序去执行个小文件下载,然后ftp带宽限制在一定时间内就被解除了,至于建立服务器,如果win7 win server也可以,还是别麻烦win10了,最好的办法还是切换到Linux. 由于XFile播放视频等都是走的http流,因此不受这个影响的(但是受qos 80%带宽限制),但是如果你在win10下远程备份,列表等基于ftp的操作,才会受到这该死的带宽限制影响。
最后补充,FileZilla 新版本已经集成了windows Qos设置,但是它的这个功能默认下存在bug,解决办法很简单,参考:解除FileZilla速度限制方法
其他关联文章:
danscort:10分钟快速搭建Windows平台NAS家庭影院
danscort:10分钟快速搭建Windows平台NAS家庭影院之提高篇