四十七、应用层篇-古老的FTP协议

FTP协议早在1971年就出现了,而我们学习过互联网的历史,互联网前身Arpanet网在1969年才出现,仅仅两年,FTP协议就横空出世,到现在还在普遍使用,可想而知这个协议的厉害之处,它的过人之处在于以简单的方式实现了文件的传输,这里的简单指的是使用简单,我们只要输入ip、用户名和密码即可。他是我们平时最容易碰到的协议,也是我们作为开发人员必须了解的协议。

四十七、应用层篇-古老的FTP协议

一、FTP定义和概述

FTP:File Transfer Protocol,即文件传输协议,属于应用层协议,是用于在网络上进行文件传输的一套标准协议。使用C/S架构,即客户/服务器模式。

我们都知道FTP工作在21端口,但是实际上21端口只是一个传输控制端口,用于连接的建立、登录。而数据的传输是通过其他的端口来实现的,这个时候还会再发起新的握手,继而进行数据的传输。

提到数据传输,就不得不提FTP中使用的两种模式:主动模式和被动模式

主动模式:服务器数据端口,会使用 tcp20 端口主动去连接实时协商客户端的随机端口 (随机端口每次传输都不一样)

被动模式:客户端主动去连接服务器端,客户端数据端口与服务端数据端口都是随机的,是在传输数据时实时协商的;每次传输数据,端口都是会变的

从定义来看,我们大概知道了,主动模式就是服务端固定用20端口,而客户端随机。看起来要简单点,让我们先来分析下这个模式是如何工作的。首先FTP客户端软件FileZilla要确认连接的模式是主动模式。

FileZilla是一个强大的FTP客户端软件,可以远程连接并操控FTP服务端。我们将在番外篇中介绍此工具,并介绍FTP服务端的详细安装过程。这里我默认读者朋友们都了解此工具的使用,平时也经常使用FTP协议,可以顺利理解本文。

四十七、应用层篇-古老的FTP协议

二、主动模式

四十七、应用层篇-古老的FTP协议

OK,下面我进行连接,并且用wireshark进行抓包。先看下登录的流程。

四十七、应用层篇-古老的FTP协议

138号包:(服务端说)我已经准备好了,顺便告诉你我的使用的是vsftpd 3.0.2 的服务。

139号包:(客户端说)用 sopftpuser 这个用户名登录。

141号包:(服务端说)可以,你告诉我密码。

142号包:(客户端说)我的密码是著名的123456。

144号包:(服务端说)密码正确,恭喜 sopftpuser 登录成功。

第一,我们需要注意,客户端是与服务端的21端口进行的交互,且是明文传输,密码123456展示得清清楚楚。如果是安全要求比较高的情况下,这种方式显然是不行的。我们先往下看,下载一个文件试试。

四十七、应用层篇-古老的FTP协议

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,因此两边的数据端口都已经确定,下面就是再次握手和数据真正的传输了。让我们继续往下看吧。

四十七、应用层篇-古老的FTP协议

65、66、67号包:(服务端说):三次握手,不同的是,这次是服务端发起的。服务端用的是20端口,向客户端协商好的14048端接口发起连接

下面就是开始传输这张图片。

可以看到,在主动模式下,客户端连接FTP服务器的21端口仅仅是为了传输控制信息,称为“控制连接”

当需要进行数据传输时,就会先协商好客户端一个数据端口,服务端用的是20端口,重新三次握手建立TCP连接,继而进行数据传输。文件下载结束,连接自动关闭。

此外需要注意的是,不光是操作文件如此,哪怕执行一个ls命令也是需要新建数据连接,不是一个高效的方式。以上的过程整理为:

四十七、应用层篇-古老的FTP协议

简化理解就是:

四十七、应用层篇-古老的FTP协议

我们也可以看到,服务端固定用的是20端口进行数据传输,而客户端自己随机选择端口。这种模式实际上用的很少,因为数据连接的三次握手是服务端发起的,因此称为主动模式,不过客户端所在的主机如果防火墙阻挡了连接请求,传输就失败了。

这个时候可以试下被动模式。

四十七、应用层篇-古老的FTP协议

三、被动模式

为了解决服务器发起到客户的连接问题,有了另一种 FTP 连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。

首先我调整FileZilla客户端传输模式为被动模式。并进行抓包。

四十七、应用层篇-古老的FTP协议

由于登录的过程跟上面是一样的,因此不再赘述,直接看下下载图片的过程。

四十七、应用层篇-古老的FTP协议

26号包:(客户端说)PASV指令表示让服务器在数据端口监听,进入被动模式。

27号包:(服务端说)发起PORT指令,你可以连接到111.231.119.253这个ip上来,端口我给你的是117*256+48=30000。

28号包:(客户端说)RETR指令,我想下载这个图片。

34号包:(服务端说)开始给你传输这个图片。

上面是协商好服务端的数据端口,下面就是建立新的数据连接开始真正的数据传输了,我们可以看下下面这个图:

四十七、应用层篇-古老的FTP协议

我们可以看到,客户端发起控制连接的时候随机端口用的是14457,下面进行数据连接的时候端口用的是14458,相差1。这里其实就是这个规律:

被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。

29、32、33号包:三个包是数据连接的三次握手,由客户端发起。下面进行数据传输。

以上的过程归纳为:

四十七、应用层篇-古老的FTP协议

主动模式的简化模式为:

四十七、应用层篇-古老的FTP协议

可以看到这个30000端口实际上是我在FTP配置文件中配置的30000-30010中的一个端口。

四十七、应用层篇-古老的FTP协议

总结下本文核心要讲的主动模式和被动模式:

四十七、应用层篇-古老的FTP协议

所以在被动模式下(当然了,一般都会使用被动模式而不是主动模式),如果你是网络管理员,在申请端口白名单时,可不能仅仅放开21端口哦,被动端口也都要放开,否则无法正常连接FTP,比如我的云服务器上的安全组(可以理解为上层防火墙)的放开规则中,包含了21和这个被动端口范围:

四十七、应用层篇-古老的FTP协议

原文始发于微信公众号(幕后哈土奇):四十七、应用层篇-古老的FTP协议

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/113564.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!