FTP协议在1971年就出现了,而我们学习过互联网的历史,Arpanet
在1969年才出现,他是互联网的前身。仅仅两年,这个协议就横空出世,到现在还在使用,可想而知这个协议的厉害之处,它的过人之处在于以简单的是方式实现了文件的传输,这里的简单指的是使用简单,我们只要输入ip、用户名和密码即可。他是我们平时最容易碰到的协议,让我们继续发车,了解下吧!
一、定义和概述
FTP
:File Transfer Protocol
,即文件传输协议,属于应用层,是用于在网络上进行文件传输的一套标准协议。使用C/S
架构,即客户/服务器架构。
我们都知道FTP
工作在21端口,但是实际上21端口只是一个传输控制端口,用于连接的建立、登录。而数据的传输是通过其他的端口来实现的,这个时候还会再发起新的握手,继而进行数据的传输。所以第一个知识点是要明确:FTP不只用了21端口,还有其他的数据端口,具体是什么后面会说。
提到数据传输,就不得不提FTP中使用的两种模式:主动模式和被动模式。
主动模式:服务器数据端口,会使用 tcp20 端口去连接实时协商的客户端随机端口 (随机端口每次传输都不一样)
被动模式:客户端主动去连接服务器端,客户端口与服务端口都是随机的,是在传输数据时实时协商的;每次传输数据,端口都是会变的
从定义来看,我们大概知道了,主动模式就是服务端定为20端口,而客户端随机。看起来要简单点,让我们先来分析下这个模式是如何工作的。首先FileZilla
要确认连接的模式是主动模式。
二、主动模式
OK,下面我进行连接,并且用wireshark
进行抓包。先看下登录的流程,首先前三个包是客户端发起三次握手建立控制连接。
138号包:(服务端说)我已经准备好了,顺便告诉你我的使用的是vsftpd 3.0.2 的版本。
139号包:(客户端说)用 sopftpuser
这个用户名登录。
141号包:(服务端说)可以,你告诉我密码。
142号包:(客户端说)我的密码是著名的123456。
144号包:(服务端说)密码正确,恭喜 sopftpuser
登录成功。
我们需要注意,客户端是跟服务端的21端口进行的交互,且是明文传输,密码123456展示得清清楚楚。如果是安全要求比较高的情况下,这种方式显然是不行的。我们先往下看,下载一个文件试试。
62号包:(客户端说)我想从IP=192.168.101.2上端口为54*256+224=14048连接你的数据端口。
这里说下:报文中有个PROT命令,比如是(h1,h2,h3,h4,p1,p2),前面四个数是IP地址,后面两个是用于表示端口,固定的是p1*256+p2来计算,也就是说256是个固定的常数。
63号包:(服务端说)200表示好的,我同意。
64号包:(客户端说)RETR表示下载文件,上传文件指令是STOR。表示我要下载network22-1.png这个图片。确实,我就是要下载这张图片。
这三个包是协商了客户端的数据端口。服务端的数据端口固定是20,因此两边的数据端口都已经确定,下面就是再次握手和数据真正的传输了。让我们继续往下看吧。
65、66、67号包:(服务端说):三次握手,不同的是,这次是服务端发起的。服务端用的是20端口,向客户端协商好的14048端接口发起连接。
下面就是开始传输这张图片。
可以看到,在主动模式下,客户端连接FTP服务器的21端口仅仅是为了传输控制信息,称为“控制连接”。
当需要进行数据传输时,就会先协商好客户端一个数据端口,服务端用的是20端口,重新三次握手建立TCP连接,继而进行数据传输。文件下载结束,连接自动关闭。
此外需要注意的是,不光是操作文件如此,哪怕执行一个ls
命令也是需要新建数据连接,不是一个高效的方式。以上的过程整理为:
简化理解就是:
我们也可以看到,服务端固定用的是20端口进行数据传输,而客户端自己随机选择端口。主动模式实际上用的很少,因为数据连接的三次握手是服务端发起的,因此称为主动模式,不过客户端所在的主机如果防火墙阻挡了连接请求,传输就失败了。
这个时候可以试下被动模式。
三、被动模式
为了解决服务器发起到客户的连接问题,有了另一种 FTP 连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。
首先我调整FileZilla
客户端传输模式为被动模式。并进行抓包。
由于登录的过程跟上面是一样的,因此不再赘述,直接看下下载图片的过程。
26号包:(客户端说)PASV指令表示让服务器在数据端口监听,进入被动模式。
27号包:(服务端说)发起PORT指令,你可以连接到111.231.119.253这个ip上来,端口我给你的是117*256+48=30000。
28号包:(客户端说)RETR指令,我想下载这个图片。
34号包:(服务端说)开始给你传输这个图片。
上面是协商好服务端的数据端口,下面就是建立新的数据连接开始真正的数据传输了,我们可以看下下面这个图:
我们可以看到,这次是客户端发起数据连接的三次握手。客户端发起控制连接的时候随机端口用的是14457,下面进行数据连接的时候端口用的是14458,相差1。这里其实就是这个规律:
被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。
29、32、33号包:三个包是数据连接的三次握手,由客户端发起。下面进行数据传输。
以上的过程归纳为:
主动模式的简化模式为:
可以看到这个30000端口实际上是我上一篇配置的30000-30010中的一个端口。
下本文核心要讲的主动模式和被动模式: