控制通道:控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的。
数据通道:数据通道是和FTP服务器进行文件传输或者列表的通道。
大家可能会问,为什么FTP协议需要两个通道呢? 我举一个简单的例子,当我们用FTP客户端比如FTPRush下载FTP上的文件的时候,通常会加入好几个目录和文件到队列窗口,那么当下载开始的时候,队列里面的第二个文件怎么知道该被传输呢?这就是控制通道的用处了,当下载文件的时候,FTP客户端会 等待FTP服务器返回指令,这个指令就是通过控制通道来完成的,当数据通道的传输完成以后,FTP客户端就会接收到来自控制通道的指令,这样FTP客户端就可以知道这个文件已经传输完成或者失败,进行下一个传输了。
PASV: 大家使用FTP客户端的时候,经常会发现FTP服务器的属性带有 PASV 或者PORT,中文的方式叫做 被动模式和主动模式。这两个模式是为FTP的数据通道服务的,被动模式就是FTP客户端发送一个PASV的指令,FTP服务器端返回一个已经打开的端口让FTP客户端连接上开始数据传输。FTP服务器端返回的指令一般就是 "227 Entering Passive Mode (200,10,211,111,13,113)" 这样的格式,大家可能会问,"(200,10,211,111,13,113)" 是什么意思呢,其实这个格式包含了FTP服务器当前打开等待FTP客户端连接的地址和端口,"202,10,211,111" 其实就是FTP服务器的地址,只要把 "," 替换成 ".",那么就是一个标准的IP地址了,"13,113" 就是FTP服务器打开的端口,但是这个端口是经过变换了的,我们可以很简单的反算出来真实的端口,那就是 13乘以256然后加上113。有的时候,大家会发现,可以连接上一个FTP但是用PASV方式并不能列表,明明PASV返回的指令是 "227 Entering Passive Mode (200,10,211,111,13,113)" 啊,是公网地址啊,为什么不能列表呢? 这可能就是因为FTP服务器返回的是公网的地址没错,但是呢,这个公网的地址根本就不是FTP服务器所侦听连接的IP地址,因此FTP客户端永远也不可能连接上的,那怎么办啊,那个FTP上面据说有电影下载啊,别哭啊。。FTPRush的站台属性对话框的 首页的"FTP服务器"的框框里面,有一个"服务器使用 内网/不可路由/Masq 类型的IP地址",选择上这个就可以列表了,当这个选项被选择的时候,在发送PASV指令到FTP服务器并得到FTP服务器返回的地址和端口时候,FTPRush会自动用FTP服务器的地址替换掉这个PASV指令返回的IP地址而保留端口,这样就可以正确连接并列表了。在 FTPRush的 “选项”对话框 的 “连接”树节点的页面里面的“数据连接”框框,我们还可以看到一个 “智能处理位于NAT后面的FTP服务器”的选项,这是干什么的呢?当一个FTP在NAT映射功能下对外网开放的时候,PASV会返回 “(10,xx,xx,xx,xx,xx)”这样的内网地址,如果FTP客户端使用这个内网地址去连接FTP服务器打开的端口,很显然是连接不上的,FTPRush能智能识别FTP服务器PASV返回的地址是否是一个内网地址,如果是,就比较FTP服务器 的地址是否也是内网地址,如果不是,嘿嘿,FTP服务器是NAT后面的服务器啦,这样FTPRush就把这个内网地址替换掉,使用FTP服务器的地址去连接..............哇.............这个FTP服务器终于列表出来了 .........@#$%@........ 谁说这个FTP上有电影下载的!!拖出去扁死.
PORT: PORT模式就是FTP客户端发送一个PORT xxx,xxx,xxx,xxx,xx,xx 类型的指令到FTP服务器,告诉FTP服务器连接到这个地址,同时FTP客户端打开这个数据连接端口等待FTP服务器来连接。大家应该经常遇到FTP客户端发送PORT指令去列表,当时半天列表不出来的情况,这是为什么呢,很大的原因就是因为 FTP服务器不能连接上FTP客户端发送给它的地址和端口,一般有两种情况,一个是你的机器是内网的地址,那么FTP服务器是没有办法连接进来的,还有就是你的机器或者你的网络使用的防火墙并拒绝来自外部的连接。对于内网地址使用FTP客户端连接只提供P ORT方式的NAT用户,如果使用FTPRush,在FTPRush的选项对话框中,点击“连接”那个树节点,出来的页面里面的“数据连接”内容就是为了这个功能服务的,你可以输入你的公网IP地址或者一个域名到 "绑定套接字"后面的那个编辑框,那么当FTPRush发送PORT指令的时候,就会使用这个地址而不是你的内网地址。那FTPRush里面那个“限制本地端口使用范围”是干什么的呢?当我们设置了本地端口的选择范围,那么PORT指令里面包含的那个端口信息就会在这个 范围之内了。同时FTPRush的这个本地端口的选择范围是支持多个子范围的,比如你可以输入 21,300-300 ,这样大家可能又会问,为什么要这样呢?直接 21-300不就行了? 这是因为,有的ISP,在提供给你internet连接的时候,在某个范围的端口,传输速度是最好的,比如瑞典的一些ISP,当数据传输在 21 或者 80 的时候,速度最快,比其他端口的传输快很多,当然用户希望PORT的时候就在21或者80端口啦,这个时候如果简单使用 21-80,那么可能FTPRush就让FTP服务器连接你的60端口了,速度慢好几倍。。。不知道国内是不是有这样BT的ISP了。
STOR: 当我们已经要求FTP服务器打开了数据传输通道的时候,发送一个STOR的指令就是告诉FTP服务器:“我现在开始传输文件xxxxxxx,接收吧”,这样FTP服务器才开始正式接收,这个过程呢,我们叫做。。。。。。。。。。。。上传
RETR: 当我们已经要求FTP服务器打开了数据传输通道的时候,发送一个RETR的指令就是告诉FTP服务器:“我已经准备好了,请把文件xxxxx开始传送给我”,这样FTP服务器才正式开始把文件传给你哦。这个过程了,我们叫做。。。。。。。。。。。。。下载?
那么大家可能感兴趣的就是FXP了,FXP到底是怎么回事呢?不要通过我的本地机器就可以直接控制两个服务器传输文件,太神奇了。
其实FXP就是FTP协议的上传下载的一个后门,为什么这样说呢,让我们回忆一下刚才的文件上传下载的机制,PASV的指令能够让我们获得一个FTP服务器的端口进行文件传输,PORT指令能够在我们的机器上打开一个端口等待FTP服务器来连接,然后呢, 就有聪明人想到,如果把PORT指令也应用到FTP服务器端呢?。。。。。。。。。。。。
FTPRush是支持FXP的,当我们FXP的时候,我们会发现FTPRush的指令顺序,下面就是一个标准的指令顺序
[1] PASV
[1] 227 Entering Passive Mode (200,10,211,111,13,113)
[2] PORT 200,10,211,111,13,113
[2] 200 PORT command ok
[2] STOR xxxxx.jpg?
[2] 150 opening BINARY data connection for xxxxx.jpg
[1] RETR xxxxx.jpg
[1] 150 opening BINARY data connection for xxxxx.jpg
这样就可以FXP了,为什么呢??
为了实现FXP,FTP客户端先给FTP1发送一个PASV的指令,请FTP1打开一个数据连接端口等待连接,很好,FTP1返回了这个数据连接地址给我们,这样,我们把这个数据连接地址,用PORT指令发给FTP2,告诉它:“你去连接这个地址”,上帝 保佑,FTP2告诉我们说没有问题,我准备连接这个地址了。 到了这个步骤,FTP1和FTP2之间的联系通道已经打开了。好了,我们该把xxxx.jpg从FTP1传到FTP2了,那怎么传呢?对于FTP2来说,我们是把xxxx.jpg 上传给它,对于FTP1来说,我们是把xxxxx.jpg 下载回来,回忆一下刚才谈到的上传下载的指令。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。想到什么没有?
STOR是上传,RETR是下载
ok,这样我们的FTP客户端就发送一个STOR指令给FTP2:"准备好,我开始上传xxxx.jpg了",然后赶快也发送一个RETR指令给FTP1:"准备好,我要下载xxxx.jpg 了",好了,这样FTP1和FTP2就开始亲密接触上演出。。。。
不过有的时候,FTP服务器并不是那么容易撮合的,我们在使用FTPRush进行FXP的时候,有的时候会看到 "开始 反向FXP",这是为什么呢?
在上面的FXP原理的描述中我们可以看出来,为了FXP的成功,我们必须成功建立两个FTP服务器之间的数据传输通道,通过PASV指令让一个服务器打开端口等候连接,通过PORT指令让另外一个FTP服务器去连接这个打开的端口。之前的FXP指令顺序的 描述,是让要下载文件的FTP服务器打开端口等候连接,但是很不幸,有的FTP服务器根本不支持PASV方式的连接,那怎么办呢?那我们就把FXP的指令颠倒一下,让这个不支持PASV的FTP服务器只使用PORT指令,而在另外一个本来是接收PORT指 令的FTP服务器使用PASV指令,这样我们就把男追女改成了女追男了 所以呢,FXP是需要至少一个FTP支持PASV指令的才能实现的。