问题: 在生产环境中遇到的一个FTP问题:数据库
1 ftp: connect: No route to ho2008-11-11 10:42 2 【讨论】ftp: connect: No route to host 3 230 Login successful. 4 Remote system type is UNIX. 5 Using binary mode to transfer files. 6 ftp> ls 7 227 Entering Passive Mode (172,16,1,20,91,29) 8 ftp: connect: No route to host 9 ftp>
登陆的时候提示成功,但ls或者有数据传输的时候就报错:No route to host,如何着手排查故障?服务器
暂且先把故障放一边,从FTP的原理开始:网络
FTP的工做原理和模型并发
FTP的工做模型是双链接的方式,即控制链接和数据链接。控制链接保持始终在线,数据链接按需建立。(为何要用这种模型)spa
其中控制链接采用server端21端口,数据链接根据传输模式的不一样多是20或随机端口。设计
传输模式:主动与被动unix
对于控制链接,都是由CLI去连server端的21端口。code
区别在于数据链接,主动与被动是以server端为对象而言的,因此主动模式就是server端的20端口主动去连CLI端的随机端口,CLI的随机端口监听;而被动模式就是反过来,server
server端的随机端口被CLI端连,server端的随机端口监听被链接。对象
FZ上被动模式是被推荐使用的,可能的缘由是主动模式有一个弊端,server端去连CLI端的随机端口,若是CLI上有防火墙须要预先对随机端口进行放行,并且CLI端
还须要一个外部IP让server端去链接。这对CLI端是很麻烦的一件事情,从设计原理上来说,应该把麻烦的事情让server本身解决掉,因此推荐用被动模式。那被动模式,
CLI端去连server端的20端口,server端一样要放行一些随机端口,server端如何知道开放哪些高位随机端口呢?暂且不表。
FTP链接的并发性:
FTP是支持并发的,被动模式下端口的链接只是负责创建,若是所有由这个20端口来收发数据将会不堪重负。因此创建之后会生成子进程采用随机端口来收发数据。
FTP客户端与服务端的链接也是基于TCP/IP的套接字,因此链接须要知道IP和端口才能创建端到端的链接。
咱们来看一下Oracle数据库的链接时怎么作的。Oracle链接有两种,专用服务器模式和共享服务器模式。专用服务器经过一个会话建立一个服务器进程来处理会话提交的SQL,
这个弊端是很明显的,若是有成千上万个会话将会建立成千上万个服务器进程,因此有另外一种共享服务器模式。其原理在于,经过调度程序把客户端请求放入SGA的请求队列,
而服务器进程是共享,哪一个空了就接收请求并响应。
Oracle的链接基于TCP/IP,经过客户端的TNSNAME文件告诉客户端要链接的主机名,监听端口,服务名等来创建端到端的链接。
FTP客户端与服务端的链接,好比FTP 176.128.7.1,有IP,server端的随机端口监听会发送给客户端来创建数据链接,这样就打开了一个到服务端的套接字链接。 而解决链接
并发的问题,也是经过建立多个子进程来实现的。这个和Oracle的专用服务器模式相似。在FZ客户端上并发链接的设置是1-10,仍是可控的。
Oracle的链接要更为复杂些,有专门的监听器用来创建链接,监听器用本身的配置文件检查这个链接请求,若是须要则fork()一个服务器进程来创建客户端到服务器的链接。
或者监听程序将链接转给调度程序,由调度进程来把请求放到SGA队列中。
FTP文件传输格式:
支持二进制和ASCII,二进制文件不能经过文本文件传输,不然传到对端后会被破坏。
问题的解决:
再回来看前面的问题,能够看到控制链接已经创建,对端是unix系统,默认使用二进制传输,默认使用被动模式。
由前面的原理咱们能够知道,被动模式的数据链接也是由客户端发起的随机端口到服务端的随机端口的链接,若是链接有问题,有多是防火墙没有开放高位随机端口。
后来这个缘由被排除了。那会是什么缘由呢?FTP客户端到服务端的TCP/IP链接仍是比较简单的,只要IP,端口应该就能创建链接啊。
这里牵扯到另外一个问题,客户端去连公网的服务端的时候,实际上连的是服务端的公网地址,而要作数据传输须要作NAT,因此被动模式须要安装ip_nat_ftp,ip_conntrack
几个模块,这几个模块没有编译进内核,须要使用modprobe 载入。
ip_conntrack不清楚具体功能是什么,有多是对被动模式服务端须要开放的高位随机端口作跟踪的。
扩展:
1.因而可知,一个故障的解决,是综合性知识的体现,最终归结为网络问题,解决方法是内核模块的加载。
2.对于一个知识点,能够从不一样的角度去理解,但整体上能够区分为设计者的角度和使用者的角度。
好比FTP协议,知道主动和被动模式原理,能够帮助分析为何数据链接创建不了的缘由。这是帮助解决平常使用上的问题。
咱们去弄明白FTP链接的并发性原理,并不能直接的去解决平常的使用问题,一般咱们只在客户端设置1-10个并发便可,不须要知道原理。但为何咱们要去弄懂原理?
我想这是从设计者的角度去思考问题了,即设计者是如何解决链接的并发性问题的?从和Oracle链接的原理比较来看,有些思路是共通的,即经过多进程的方式来解决并发链接
的问题,同时从原理咱们也知道了FTP的链接1-10管理上不会有问题,可是若是是数据库,会话有成千上万的就要引发更加复杂的链接管理机制了,好比监听器,共享服务进程,请求
队列等等。设计者角度思考问题,会提高咱们思考问题的高度,并且有些原理在不一样的场合上是思路相近的,能够互相借鉴。