具体来说,FTP使用两个TCP连接来通信,一条控制连接(control connection)用来提交命令和接受回复;一条数据连接(data connection)来处理实际的文件传输。在文件传输过程中,控制连接是很容易进入空闲状态的,TCP标准也没有规定一个连接的最大空闲时间。但是路由器和防火墙经常会把空闲的连接给关闭掉,并且不通知双方,就造成了传输100%但最后还是超时的现象。后面的评论就是解决问题的关键了:TCP传输过程中有最大的包上限MTU(Maximum Transmission Unit,不超过1500),超过这个大小的传输就要拆成多个包(packet)。所以比较“小”的文件不用拆包,一次就传输完了;“大”的文件需要拆包,分多次发送,就出现超时的问题。
好了既然找出始作俑者了,那么如何修改呢?
windows下
- 查看MTU
netsh interface ipv4 show subinterfaces
- 修改MTU
netsh interface ipv4 set subinterface "本地连接" mtu=1492 store=persistent
注意可能需要将本地连接替换你当前你使用的网卡的中文名称比如以太网
Linux/Mac下
- 查看MTU
ifconfig | grep mtu
- 修改MTU
sudo ifconfig en0 mtu 1492
通过上面的设置修改,发现果然ftp上传没问题了。
抱着好奇的态度,我又去看了下另外一个同事的电脑发现,他的 MTU也是默认的1500,为什么他可以???
后来又查询资料发现,原来MTU和ISP有关系,后来我又对比了下他们电脑上的dns,发现果真不一样。好吧,又学习到了不少知识。