`

FTP 协议讲座

阅读更多
菜菜() 16:06:51
FTP是一个古老的文件传输协议
菜菜() 16:07:11
file transfer protocol
菜菜() 16:07:40
设计目的就四个字,简单高效
菜菜() 16:19:00
再跑个题,金融系统里,FTP是个非常常见的词
菜菜() 16:19:16
资产转移定价的缩写
菜菜() 16:21:52
有的部门吸收资金进来,
菜菜() 16:21:58
有的部门把钱放出去,
菜菜() 16:22:06
怎么算大家的绩效呢
菜菜() 16:22:09
就靠FTP,
菜菜() 16:22:21
这个是内部的价格。
菜菜() 16:22:29
比如6.1%,
菜菜() 16:23:09
那么吸收资产进来的人,如果都是按每年给4%的成本(利息或理财收益)拿到的,
菜菜() 16:23:25
那么他的绩效就是6.1-4=2.1%
菜菜() 16:24:19
放贷的人,8.1%的利息放出去的,那么他的绩效就是8.1-6.1=2%
菜菜() 16:28:46
FTP的目标就是简单高效。
菜菜() 16:28:54
跟SMTP协议类型,
菜菜() 16:29:14
后来的一种消息协议,也跟他们类似,这就是STOMP协议。
菜菜() 16:29:16
有兴趣的可以看看。
菜菜() 16:29:46
简单文本对象消息协议。
菜菜() 16:30:00
FTP一共就30来个命令
菜菜() 16:30:16
真正常用的,干活的,也就10来个命令。
菜菜() 16:30:18
非常简单
菜菜() 16:31:07
注意,这里说的命令,不仅仅是指我们通过ftp命令行连接到ftp server,然后敲入的命令。
菜菜() 16:31:29
而是发给ftp server的指令。
菜菜() 16:31:41
这是可以直接自己编程实现的。
菜菜() 16:32:15
我们一会儿再讲命令,先说基础,FTP的通讯机制比较有意思
菜菜() 16:32:28
FTP基于TCP协议。
菜菜() 16:33:18
client通过tcp连接上server以后,一般先要验证身份,
菜菜() 16:33:29
这时候发送的是两行文本作为命令,
菜菜() 16:33:37
先发USER kimmking
菜菜() 16:34:03
表示用户kimmking要登陆
菜菜() 16:34:14
再发PASS 123456
菜菜() 16:34:21
那不就结了
菜菜() 16:34:49
你在代码封装的js里写什么汉子,都会被自动转unicode的
菜菜() 16:35:09
表示用密码123456登陆,
铁锚(551996458) 16:35:26
源码 --> 编译程序 --> 实际代码 -->  执行器
菜菜() 16:35:28
第一步一般返回331 状态吗(印象中好像是的,具体忘记了)
菜菜() 16:35:43
表示需要验证身份。
菜菜() 16:35:57
密码ok后,返回状态吗 220还是200
菜菜() 16:36:10
状态吗跟HTTP的基本一致。
菜菜() 16:36:19
2xx是成功
屁冬(307948631) 16:36:22
kk基本功好杂事
菜菜() 16:36:42
服务器返回的信息可以带上额外信息,
菜菜() 16:37:00
比如 331  please enter your password
菜菜() 16:37:01
这种。
菜菜() 16:37:47
有些ftp server,你连接上以后,返回一些欢迎信息,
菜菜() 16:37:51
就是用这个原理做的
菜菜() 16:38:06
状态吗后面可以带上额外的信息
菜菜() 16:38:19
好了,练上来以后,就可以操作了
菜菜() 16:38:38
所有的文件相关的管理系统,多会有的几个标准功能,
菜菜() 16:39:04
查看当前路径,进入某个子目录,返回上一级目录,等等
菜菜() 16:41:25
查看当前文件夹所有的子目录和文件
菜菜() 16:42:29
好了,看到文件了接着怎么办呢
菜菜() 16:42:39
上传下载呗
菜菜() 16:42:52
具体怎么上传下载呢
菜菜() 16:43:02
这里就有几个细节需要处理了
菜菜() 16:43:21
1、TYPE  二进制还是文本格式
菜菜() 16:43:48
注意,如果是二进制的文件,按文本(type i)的方式处理,一般会完蛋。
2、MODE,主动模式和被动模式
菜菜() 16:45:54
但是主动模式被动模式,是FTP协议的经典技巧之一
菜菜() 16:46:29
这里需要讲到FTP的一个漂亮设计,
菜菜() 16:46:41
命令通道与数据通道,完全分离。
菜菜() 16:47:15
即我们连接上FTPserver的这个tcp通道,只来回传输命令和命令的响应信息。
菜菜() 16:47:21
不传输数据。
菜菜() 16:47:26
文件的数据,
菜菜() 16:47:38
单独走tcp通道,来传输。
菜菜() 16:47:46
这个设计,太经典了。
菜菜() 16:48:38
数据一直在传输,也不会影响你给ftp server发命令。
菜菜() 16:48:45
相互之间木有影响。
菜菜() 16:49:16
每次需要传输数据的时候,另起一个socket来做数据传输的事儿。
菜菜() 17:24:23
每次传输的时候另起一个socket,
菜菜() 17:24:34
问题就来了。
菜菜() 17:24:49
这需要额外的端口啊
菜菜() 17:25:15
如果通讯的两端,有一端有防火墙不让开端口怎么办
菜菜() 17:25:32
FTP给出的解决办法就是主动或被动模式
菜菜() 17:27:28
主动模式就是服务器主动去连客户端,
菜菜() 17:27:56
client发送一个命令 PORT  10,0,0,5,999
菜菜() 17:28:32
server看到后,就会自己去连client 10.0.0.5的999端口
菜菜() 17:28:36
然后开始传输数据。
菜菜() 17:29:05
被动模式就是发个PASV命令,client哥哥这边开不了端口,
菜菜() 17:29:18
你server端妹妹开个端口,让哥哥我连把
菜菜() 17:30:48
server收到以后,自己回复个端口,让client来连
菜菜() 17:31:06
这样,命令链路和数据链路是分开的。
菜菜() 17:31:22
可以灵活选择谁来开端口,谁来连。
菜菜() 17:31:28
so easy
菜菜() 17:31:38
下一个问题,
菜菜() 17:31:45
断点续传的问题。
菜菜() 17:32:01
FTP传输的文件,如果是小文件没什么好说的,
菜菜() 17:32:04
如果是大文件,
菜菜() 17:32:11
传一半断了,怎么办
菜菜() 17:32:34
特别是下载这一块,如果支持从文件的某个位置开始下载,
菜菜() 17:32:45
那么就可以支持多线程下载了。
菜菜() 17:33:58
(PS:HTTP也支持,可以用header的range头制定本次要下载的字节范围,比如1025-2048,表示要下载这个从1025字节到2048的这一k的数据)
菜菜() 17:34:42
(BUT,HTTP的文件上传功能太2b,不支持断点,而且效率非常之差)
菜菜() 17:35:10
怎么支持断点呢
铁锚(551996458) 17:35:50
断点都必须是数据的接收端决定。
铁锚(551996458) 17:36:04
谁收数据谁决定断点
菜菜() 17:37:21
对的。
菜菜() 17:37:30
不管是上传还是下载,
菜菜() 17:38:49
我们可以先说明我从说明地方开始传输文件。
菜菜() 17:38:57
REST一个位置,
菜菜() 17:39:11
然后retr和stor命令下载和上传文件。
菜菜() 17:40:32
前者server从rest指定的位置开始传输数据到client
大漠穷秋<zhaiwei668hp@163.com> 17:40:58
我们可以先说明我从说明地方开始传输文件。是啥意思
菜菜() 17:41:24
就是先告诉服务器,我们就是要从指定的位置续传
菜菜() 17:41:04
后者server将client传上来的数据,从指定的位置开始写入server端的文件。
菜菜() 17:41:39
比如一个文件A.txt,我们已经下载1M了,
菜菜() 17:41:53
我们现在要开始从1M1字节的位置开始下载。
菜菜() 17:42:00
服务器不用给我前面1M的数据了。
菜菜() 17:42:42
这是FTP的第二个经典设计
菜菜() 17:42:52
私聊。
菜菜() 17:42:54
我这有。
菜菜() 17:44:50
前面讲错一点,Type i是二进制,type a是文本
菜菜() 17:45:10
另外两个常用命令,
菜菜() 17:45:25
ABOR 取消数据连接。
菜菜() 17:45:35
因为命令通道跟数据时独立的,
菜菜() 17:45:51
所以,,,如果我们传输数据的时候反悔了,可以取消掉。
菜菜() 17:46:16
还有一个就是如果我们用ftp客户端工具的时候,经常能见到的
菜菜() 17:46:18
NOOP,
菜菜() 17:46:32
最最原始的keep alive方式
菜菜() 17:46:50
为了防止 连接长期不活动被系统Kill掉。
菜菜() 17:47:01
client可以定时发送NOOP命令
菜菜() 17:47:08
server收到以后,什么都不干。
菜菜() 17:47:24
大家握个手。
菜菜() 17:47:31
say hi
菜菜() 17:47:39
最后一个命令, QUIT,
菜菜() 17:47:51
say bay
菜菜() 17:48:06
关闭命令链路。
菜菜() 17:48:56
补充下,查了下状态码,
菜菜() 17:49:13
1xx是操作说明
菜菜() 17:49:20
2xx是操作成功状态
菜菜() 17:49:27
3xxx是需要认证
菜菜() 17:49:41
4xx是客户端错误
菜菜() 17:49:46
5xx是服务器端错误
菜菜() 17:50:05
FTP有什么特点
铁锚(551996458) 17:50:10
redirect 的 HTTP返回码是多少?
菜菜() 17:50:18
301 302
菜菜() 17:50:26
分别对应内部转移和外部转移
菜菜() 17:52:15
查了下,也记错了
菜菜() 17:52:33
301永久重定向,302临时重定向
菜菜() 17:52:39
我们一般见到的应该是301
菜菜() 17:52:58
http的header里多出来一个location: 新的网址
菜菜() 17:53:17
浏览器根据这个header来跳转到新的网址
菜菜() 17:57:07
html里写 location = xx
菜菜() 17:57:16
这是完全的浏览器行为
菜菜() 17:57:21
跟server状态没关系
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics