本文将讲述在FTP协议中的主动模式和被动模式。
关于FTP协议,可以看我的另一篇文章 FTP协议学习心得
这里就不对FTP协议做详细的介绍了。
首先,我们知道FTP协议是服务器和客户端的一种应用层连接协议,是用来传输数据的。所以先澄清一波,这个主动和被动是针对谁来说的,是针对服务器来说的。因为模式选择是根据客户端在命令连接control_socket中的传值PORT命令和PASV命令来决定的。所以服务器端接受到命令后,决定自己的模式,是主动还是被动。
那么这个主动和被动是什么呢?看图,图1是被动模式PASV,图2是主动模式PORT,两种模式连接结束后,效果都是图3。数据连接是有方向的,数据传输是没方向的。(连接是个动作,传输的是依仗连接的桥梁)
其实主动和被动就是说连接的时候,是服务器去连接客户端传过来的接口,还是说自己开放接口,返回此接口给客户端,然后监听客户端的连接请求。
主动模式:客户端发送"PORT <h1,h2,h3,h4,p1,p2>"到服务器端。服务器接受到后,解析<h1,h2,h3,h4,p1,p2>成IP地址和端口号。然后创建socket,连接刚刚解析的IP地址。
被动模式:客户端发送"PASV"到服务器端。服务器接收到后,开放一个随机端口,并返回给客户端一个<h1,h2,h3,h4,p1,p2>信息。客户端这个时候会创建一个socket,来连接收到的IP地址。
这时候可能大家要问了,这个<h1,h2,h3,h4,p1,p2>是怎么解析的?
其实h1,h2,h3,h4就是IP地址,类似本地IP (127.0.0.1) 这种格式。而p1,p2是端口号,计算公式为 port = p1 x 256 + p2 。
大家可能还有疑问,说你这怎么和别人不一样,人家创建了两个socket呢,你这咋就建了一个?
确实是建了两个。socket编程,两边都得有一个socket,因为socket不会像忍者一样一会在客户端,一会又跳到服务器上。建立好连接后,我们可以理解两个socket的内容就变成一样的了,你可以想象成科幻片里的传送门,建好连接后,两张传送门其实就是一张门。不过如果对socket不是很了解的,将会看的很蒙圈。这里还是将不同的套接字(socket)在不同的地方将来说会比较清晰。也就是说在提供IP地址和端口的一方,也会创建一个socket,这个socket会通过 bind() 方法绑定上提供的IP和PORT等信息,然后再通过 listen() 方法激活接听。
具体的socket的绑定和监听等函数参数还请看一下这片文章 Socket详解
讲的非常的好,非常的详细。如果说我的比喻方法对你的理解起到了帮助,那么这个文章你将看的更加舒畅。
以上就是我对主动模式和被动模式的理解,如果有什么地方不全面或者不正确的地方,希望大家可以指出。一同学习,一同进步!
stay hungry! stay foolish!