Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Nov 6, 2019. It is now read-only.

Commit e74bf74

Browse files
committed
update article 0014 - FTP
1 parent 8a48ef3 commit e74bf74

File tree

4 files changed

+110
-0
lines changed

4 files changed

+110
-0
lines changed

link/0014.md

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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+
![FTP-3](https://github.com/SeaHub/BlogOfComputerNetwork/blob/master/res/FTP3.png?raw=true)
9+
10+
11+
## 文件传输协议 FTP(File Protocol Protocol)
12+
* 部分术语解释
13+
* FTP服务端端口21:标准命令TCP端口号,服务端控制端口,负责传输控制流
14+
* FTP服务端端口20:服务端数据端口,负责传输数据流
15+
* 高端端口:端口号大于1024
16+
17+
![FTP-1](https://github.com/SeaHub/BlogOfComputerNetwork/blob/master/res/FTP2.png?raw=true)
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+
![FTP-1](https://github.com/SeaHub/BlogOfComputerNetwork/blob/master/res/FTP1.png?raw=true)
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

res/FTP1.gif

11.2 KB
Loading

res/FTP2.png

23.5 KB
Loading

res/FTP3.jpg

115 KB
Loading

0 commit comments

Comments
 (0)