FTP协议以前我用得挺少的,网络课上刘孜文老师曰FTP协议过时也就跳过了。不过现在FTP用得还是挺多的,所以决定围观下FTP。
刘孜文老师的经典名言是:我所学到的东西都不是从课堂上得来的。这点我挺赞同的。
刘孜文老师超强悍,中科院的博士,2个月看完了Linux内核的代码。
记得第一节课他说可以不用去上课,只要自己学就好了,于是偶深入贯彻刘老师的话,所以就一学期也没去上网络课了。
课下的时间都花在Scar上,网络也没仔细研究过,悲剧了,现在开始要好好补下才行了。
以下的内容是关于FTP协议的。
HTTP和FTP都是文件传输协议,他们都运行在TCP之上.
最显著的区别在于FTP使用两个并行的TCP连接,一个是控制连接(control connection),一个是数据连接(data connection).通常控制连接使用21端口.
因为FTP协议使用一个分离的控制连接,所以我们也称FTP的控制信息是带外(out-of-band)传送的。而HTTP协议在TCP连接中发送请求和响应首部行来控制,所以HTTP也可以说是带内(in-band)发送控制信息。
FTP服务器必须在整个会话中保存用户的状态信息,也就是说要保存用户的权限信息,远程目录树的当前位置。而HTTP协议则是无状态的,要通过cookie来保存用户状态。
FTP协议的控制连接和数据连接如下图。
FTP协议的定义:http://www.w3.org/Protocols/rfc959/
两种模式
FTP协议的数据传输存在两种模式:主动模式( Active mode ) 和被动模式( Passive mode ) 。这两种模式发起连接的方向截然相反,主动模式是从服务器端向客户端发起;被动模式是客户端向服务器端发起连接。
如果采用被动模式,由于FTP服务器完全随机的选择一个端口,并告知客户,然后客户进行主动连接,这就意味着在服务器上,你要让所有的端口都允许动态入站连接才行,这样肯定不行,因为太危险了,等于打开了所有的端口连接。
如果采用主动模式(PORT Mode),FTP服务器选择好端口后,主动与客户进行连接,这时候不需要像PASV模式那样打开所有的动态入站连接,而且正好相反,我们需要打开所有的动态出站连接即可,安全性增加很多。联机模式
主动模式 ( Active mode )
FTP Client 跟 FTP Server 联机后,会主动利用 PORT 指令提出 DATA Channel 联机的要求,如下:
指令: PORT 10,18,53,171,17,114
回应: 200 Port command successful.
这里的 PORT 指令是由 FTP Client 送出的,当需要建立 DATA Channel 时,FTP Server 会主动利用 Server 主机的 Port 20 发出联机到 FTP Client 的主机,而 PORT 指令后的参数说明如下:
前四个数字是 FTP Client 的 IP 地址:10.18.53.171
后两个数字是 FTP Client 接受联机的 Port 埠号,埠号的计算方式是 (第五个数字 * 256 + 第六个数字),以此范例来说,FTP Client 接受的联机埠号是 17 * 256 + 114 = 4,466
由此可知,如果 FTP Client 处于 NAT 的环境下的话,FTP Server 几乎无法正常的联机到 FTP Client 的主机,所以现在大部分的联机模式几乎都建议用户使用被动模式(Passive mode)。
被动模式 ( Passive mode )
FTP Client 跟 FTP Server 联机后,会主动利用 PASV 指令提出 DATA Channel 联机的要求,如下:
指令: PASV
回应: 227 Entering Passive Mode (59,37,124,43,158,251)
你可以看到由 FTP Client 送出的 PASV 指令并没有送出其他的参数,而是在 FTP Server 响应的时候出现了 (59,37,124,43,158,251) 字符串,当需要建立 DATA Channel 时,这时就会由 FTP Client 主动连接至 FTP Server 动态开放的 Port 供 FTP Client 连接,其中 (59,37,124,43,158,251) 的说明如下:
前四个数字是 FTP Server 的 IP 地址:59.37.124.43
后两个数字是 FTP Server 接受联机的 Port 端口号,端口号的计算方式是 (第五个数字 * 256 + 第六个数字),以此范例来说,FTP Server 可接受的联机端口号是 158 * 256 + 251 = 40,699
由此可知,使用被动模式(Passive mode)对 FTP Server 的系统管理员来说,可掌控的部分是比较多的,因为 FTP Server 无法决定用户是否可使用主动模式联机,但若改使用被动模式联机的话,就几乎能让所有人正常的使用 FTP 服务。
其他
FTP协议的命令和应答:http://www.w3.org/Protocols/rfc959/4_FileTransfer.html
FTP COMMANDS [FTP命令]
1 | **USER** <SP> <username> <CRLF> |
Reply Code By Function Groups [返回码]
1 | **110** Restart marker reply. |
文法
The syntax of the above argument fields (using BNF notation where applicable) is:
1 |
|
各种命令的各种返回码
1 |
|
参考文章:
- http://www.w3.org/Protocols/rfc959/
- http://vod.sjtu.edu.cn/help/Article_Show.asp?ArticleID=137
- http://blog.miniasp.com/post/2008/06/29/FTP-Protocol-Definitive-Explanation.aspx
- Images come from Computer Networking: A Top Down Approach, 4th edition. Jim Kurose, Keith Ross Addison-Wesley, July 2007.