说明:本文仅供学习交流,转载请标明出处,欢迎转载!
FTP协议(文件传输协议)建立在TCP协议的基础之上,用来从一个主机把文件复制到另外一个主机。在FTP客户机与服务器之间,采用来了两条TCP连接,这两条连接分别是控制连接和数据连接。在控制连接过程中,FTP服务器使用的端口号为21,在数据连接过程中,FTP服务使用的端口号为20,而客户机在整个过程中使用的端口号都是临时端口号,这两个临时端口号可以相同,也可以不同,当然在绝大多数情况下,这两个临时端口号都是不同的。在整个从连接的发起到数据传输的整个过程中,控制连接一直都打开着,而数据连接则在数据开始传送时打开,数据传送完毕后关闭。
控制连接
控制连接的打开与关闭过程如下:
1.服务器在熟知端口21发出被动打开命令,等待客户;
2.客户使用临时端口发出主动打开;
3.当客户不再使用该控制连接时,主动关闭该控制连接。
所以整个控制连接过程中,客户始终是控制连接的发起者和终止者。
要实现以上控制连接上的通信,客户需要向FTP服务器发送命令,而FTP服务器向客户发送对这些命令的响应来共同完成。在发送命令的过程中,由于客户机与FTP服务器的系统可能不同,为了解决这一可能存在的问题,客户机在向服务器发送命令的过程中,使用NVT ASCII字符发送(相当于一个编码的过程),而在服务器的接收程序则将NVT ASCII字符转换为服务器主机系统所能识别的格式(相当于一个解码的过程)。在以上通信过程中,每一条命令或响应都是一个短行,每一行的行结束标志为CR(回车)+LF(换行),即\r\n。现在我们已经知道命令是从客户向服务器发送的,而响应则是从服务器向客户机发送。下面我们介绍下命令的种类和响应的种类:
命令的种类。总体而言,客户向服务器发送的命令包括:登录命令、文件管理命令、数据类型命令、数据结构命令、端口选择命令、数据读写命令等。这些命令可以告诉由客户机告诉FTP服务器:
(1)登录命令。登录的用户名和密码。
(2)文件管理命令。如何管理远程计算机的文件系统,如显示远程目录和文件,重命名远程目录和文件以及新建和删除目录或文件,这个跟linux系统中的文件相关的命令相似,如对应linux系统中cd,rm,rmdir, touch,mkdir, pwd等。
(3)数据类型命令。让客户自定义文件传送的文件类型(如ASCII码文件类型,EBCDIC文件类型、二进制文件类型)、格式控制(仅对ASCII格式和EBCDIC有效,包括非打印、远程登录格式控制)、传输方式(字节流方式、块方式、压缩方式)。
(4)数据结构命令。告诉服务器应该采用的是那种数据结构:字节流文件、记录式文件、页式文件。
(4)端口选择命令。客户通过该命令,告诉FTP服务器,你下次传送数据给我的时候,应该把数据发送到我的哪个端口上。
(5)文件读写命令。告诉服务器现在是读文件还是写文件。
响应。客户发送的每一个命令至少对于一个响应,FTP服务器发出的响应由两个部分主持:数字(3位)+说明文本。其中说明文本用于解释数字的含义(这样,客户端就不用实际这些数字的含义了,因为有后面的文本帮忙嘛!)。
数据连接
数据连接主要有三个目的:
(1)客户向服务器发送一个文件。(叫作写文件或存储文件)
(2)服务器向客户发送一个文件。(叫作读文件)
(3)服务器向客户发送文件或目录列表。(列出文件名)
数据连接的打开与关闭一般过程如下:
1.客户在控制连接的过程中,通过发送port命令,将客户的IP地址和将在数据连接阶段使用的客户端的临时端口号发送给服务器的控制端口号21后,客户端的数据连接临时端口号处于被动打开的状态。
2.服务器通过数据连接端口号20,利用客户端给出的临时端口号向客户端主动打开命令,于是便打开了此数据连接,与客户端进行数据交换。
3.当服务器不再与客户机进行数据交换后,服务器便主动关闭同客户端的数据连接。
从以上可以看出,在整个数据连接的过程中,服务器端是数据连接的发起者和终止者,毕竟只有他自己才知道还有没有数据要发送给客户端嘛。
通常情况下,上面的控制连接和数据连接如下图所示:
特殊情况1:客户为并没有用port命令将其数据连接的端口号发送给FTP服务器端,此时如果想要实现客户与服务器之间的数据连接,由于该端口已经被客户用于控制连接,要是再使用该端口,客户必须确定SO_REUSEADDR选项,如下图所示:
特殊情况2:服务器对数据连接做主动关闭后处于2MSL等待状态,若此时客户在之前的控制连接上发送另外一个命令数据请求,并分配一个新的客户端的临时端口号做被动打开,由于此时服务器正好处于2MSL等待状态,端口号20还不能真正使用,此时,服务器必须确定SO_REUSEADDR选项,如下图所示:
匿名FTP
通常情况下,要使用FTP,用户就需要在远程服务器上有账号和密码,但是有些网站有很多可供公用的文件,如果要访问这些文件,用户就不需要有账号和密码。匿名FTP的账号为anonymous,密码可以是设置为自己的邮箱地址或者guest之类的。
总结
1.FTP协议对应的运输层协议为TCP。
2.FTP协议的数据连接和控制连接是分开的,而Telenet协议的数据连接和控制连接公用一条连接。
3.控制连接主动的发起者和终止者都是FTP客户端,而数据连接的主动发起者和终止这都是FTP服务器端。
4.数据连接和控制连接对应的IP数据报中的Tos(服务类型)字段不一样。控制连接为ox10,表示采用“最小时延”,而数据连接为ox08,表示采用“最大吞吐量”。
参考资料
[1]《TCP/IP详解 卷1:协议》
[2]《TCP/IP 协议族 第4版》
FTP协议总结