|
| 1 | +# 应用层之FTP |
| 2 | +* 阅读难度:低 |
| 3 | + |
| 4 | +## 聊一聊 - 有HTTP为什么还需要FTP? |
| 5 | +* 众所周知,HTTP可以在网络上传输各种各样的信息,这其中当然也包含一些文件信息。那么,既然HTTP已经这么强大了,我们还需要所谓的"FTP"吗?答案当然是需要的。通过FTP传输文件要比其他协议更加有效,主要原因有两个方面。其一:FTP只用于正确地传送文件,不会像HTTP那样翻译文件的内容。其二:一般而言,使用FTP进行通信的服务器一般是一台独立的FTP服务器。所以,FTP服务器会将他自己的所有资源都投入到处理FTP事务中。简而言之,“专注”让FTP更加高效,更加适合用于文件传输。 |
| 6 | +* 当然,现在因为有更优的协议出现,同时HTTP协议也可以在某些程度上进行文件处理,且HTTP相对不会使用FTP的用户而言,更加方便下载,所以FTP出现的频率也就大幅减少了。 |
| 7 | + |
| 8 | +  |
| 9 | + |
| 10 | + |
| 11 | +## 文件传输协议 FTP(File Protocol Protocol) |
| 12 | +* 部分术语解释 |
| 13 | + * FTP服务端端口21:标准命令TCP端口号,服务端控制端口,负责传输控制流 |
| 14 | + * FTP服务端端口20:服务端数据端口,负责传输数据流 |
| 15 | + * 高端端口:端口号大于1024 |
| 16 | + |
| 17 | +  |
| 18 | + |
| 19 | +--- |
| 20 | +## FTP两种传输方式 |
| 21 | +* ASCII传输模式 |
| 22 | + * 定义:假定用户正在处理的文件包含简单的ASCII码文本,进行拷贝处理。如果用户机器上运行的编码并非ASCII,则当文件传输时,FTP通常会自动地调整文件内容,以便于把文件解释成用户计算机存储文本文件的格式 |
| 23 | + * 可能出现的情况:上面提到,FTP有可能把文件内容转化成特定的文本文件格式。但是,万一我们处理的不是文本文件,而是程序呢?事实上,在处理任何非文本文件之前,我们需要用Binary命令告诉FTP逐字拷贝(即采用二进制传输模式),而非对这些文件运用ASCII传输模式。 |
| 24 | +* 二进制传输模式 |
| 25 | + * 定义:逐字拷贝,即在二进制传输中,保持文件的位序,以便原始位和拷贝的是逐位一一对应的。 |
| 26 | + |
| 27 | +--- |
| 28 | +## FTP两种运行模式 |
| 29 | +### FTP主动模式(Standard/PORT) |
| 30 | +* 主动模式:客户端和服务端同时打开并监听一个端口以创建连接。 |
| 31 | +* 步骤(两次TCP): |
| 32 | + 1. 客户端端口A和FTP服务端的21端口建立TCP连接 |
| 33 | + 2. 客户端端口A向FTP服务端的21端口发送PORT命令(PORT命令包括客户端用来接收数据的端口B) |
| 34 | + 3. FTP服务端收到命令后,打开FTP服务端的20号数据端口,与客户端端口B建立TCP连接 |
| 35 | + 4. FTP通过这个客户端端口B进行数据传输, 在此例子中 |
| 36 | + * 客户端端口A:本地控制端口,负责传输控制流 |
| 37 | + * 客户端端口B:本地数据端口,负责传输数据流 |
| 38 | + |
| 39 | +### FTP被动模式 (Passive/Pasv) |
| 40 | +* 被动模式:只要求服务端产生一个监听相应端口的进程 |
| 41 | +* 步骤(两次TCP): |
| 42 | + 1. 客户端端口A和FTP服务端的21端口建立TCP连接 |
| 43 | + 2. 客户端端口A向FTP服务端的21端口发送Pasv命令) |
| 44 | + 3. FTP服务端收到命令后,随机打开一个高端端口C,告知客户端在此端口上传输数据 |
| 45 | + 4. FTP服务端与连接至服务端高端端口,通过这个端口进行数据传输(一次TCP连接) |
| 46 | + |
| 47 | +  |
| 48 | +--- |
| 49 | +## 匿名FTP |
| 50 | +* 因为使用FTP时,必须登录。因此,出现了一种机制——匿名FTP,它可以让用户无需密码就可以连接到FTP服务器,并获得下载权限。 |
| 51 | + * 一般匿名FTP有如下特征,具体需要看系统管理员的设置 |
| 52 | + * FTP用户登录名为anonymous |
| 53 | + * FTP登录密码可为任意字符串,但习惯上,用户会使用自己的E-mail地址作为密码,以方便系统管理员记录下来,谁试用了匿名账户下载了这些文件 |
| 54 | + * 一般匿名账户仅提供下载权限,不提供上传权限 |
| 55 | + * 匿名账户可能只能看到部分向公众开放的目录,其余目录则处于隐藏状态 |
| 56 | + * 匿名FTP只适用于提供了这项服务的主机 |
| 57 | + |
| 58 | +--- |
| 59 | +## FTP账户分类 |
| 60 | +* Real账户:权限最大的账户,当这类账户登录到FTP服务端时,其默认的主目录为账户名称命名的目录。同时,这类账户也可以切换到其他目录中(包括系统的主目录)。 |
| 61 | +* Guest账户:只当这类账户登录到FTP服务端时,其默认的主目录为账户名称命名的目录。但这类用户不能切换到其他账户,只能访问自己的主目录。 |
| 62 | +* Anonymous账户:没有指定账户,但它仍然可以进行匿名访问某些公开的资源。 |
| 63 | + |
| 64 | +--- |
| 65 | +## FTP断点下载与续传 |
| 66 | +### 断点下载 |
| 67 | +1. 客户端向服务端发送“Rest + 本地文件长度”命令,告诉服务端,客户端要断点下载了。 |
| 68 | + * 这一步,服务端会返回是否支持断点续传 |
| 69 | + * 若支持,服务端返回成功代码,需要知道断点续传哪一个文件 |
| 70 | +2. 客户端向服务端发送“Retr + 文件名”命令,告诉服务端具体要断点下载哪个文件 |
| 71 | + * 服务端根据客户端的信息,开始服务端定位文件指针,并根据客户端发送的本地文件长度推出服务端要发送的文件长度 |
| 72 | + * 同时,客户端开始定位本地文件末尾 |
| 73 | +3. 当两端都做好准备工作后,客户端创建Socket,以主动/被动运行模式建立数据通道,循环调用Recv命令从远程服务端接受数据并追加入本地文件 |
| 74 | + |
| 75 | +### 断点上传 |
| 76 | +1. 客户端获取服务端上和本地要上传文件的同名文件大小 |
| 77 | +2. 客户端向服务端发送“Appe +文件名”,通知服务端,接下来传输的数据,要附加到这个文件末尾。 |
| 78 | +3. 客户端/服务端分别定位本地/远程文件指针 |
| 79 | +4. 从本地文件指针处读数据并写至远程文件指针处 |
| 80 | + |
| 81 | +--- |
| 82 | +## FTP常用提示处理代码 |
| 83 | +* 提示处理代码定义方面与HTTP协议类似,主要为: |
| 84 | + * 2XX: 成功 |
| 85 | + * 3XX: 权限问题 |
| 86 | + * 4XX: 文件问题 |
| 87 | + * 5xx: 服务器问题 |
| 88 | +* 常用提示处理代码 |
| 89 | + * 220:命令执行正常结束 |
| 90 | + * 227:进入被动模式 |
| 91 | + * 530:密码错误 |
| 92 | + * 550:目录/文件已经被删除 |
| 93 | + * 552:对请求文件的操作中止,因超出存储分配 |
| 94 | + |
| 95 | +--- |
| 96 | +## FTP的缺点 |
| 97 | +1. 密码和文件内容都使用明文传输,没有加密,因此容易被窃听 |
| 98 | +2. FTP在需要传输文件数量很多的小文件时,性能不好 |
| 99 | +3. 当数据通过数据流传输时,控制流处于空闲状态,而当控制流空闲很长时间后,客户端的防火墙会将会话判为超时。即在大文件传输时,传输时间超过一定阈值后,控制会话会被防火墙断开,导致传输会产生一些错误。 |
| 100 | +4. 当同时传输多个文件时,因多次握手,导致最终性能不如HTTP |
| 101 | + |
| 102 | +--- |
| 103 | +## 参考阅读 |
| 104 | +* [FTP命令详解](http://cs.ecust.edu.cn/snwei/studypc/oftencommand/ftp.htm) |
| 105 | +* [FTP协议和HTTP协议的12点比较(文件上传/下载)](https://www.oschina.net/news/28162/http-vs-ftp) |
| 106 | +* [Youtube - What`s FTP](https://www.youtube.com/watch?v=8IC8-WIkE2c) |
| 107 | + |
| 108 | +--- |
| 109 | +* 文章更新时间:2016.6.15 |
| 110 | +* 作者:Seahub |
0 commit comments