kimmking 的讲座【TCPIP】


菜鸟大kimmking()  13:02:32

ftp是传输文件最高效的方式之一。

为毛呢

1、基于tcp

2、足够简单

3、功能强大

先说第一点,直接基于tcp,省去了很多不必要的开销。

菜鸟大kimmking()  13:03:48

足够简单,大概只有20几个命令。

和几十个状态嘛

这两点结合起来,就是高性能的基础

菜鸟大kimmking()  13:04:48

一个ftp传输的过程,

先是clientserver握手

client发出helo命令,server响应220成功或331之类的需要登录

然后client传递用户名密码,过去

菜鸟大kimmking()  13:06:05

如果验证通过,client就可以发命令对server进行操作了。

常见的操作,list put get mput mget 之类的

天之痕丶()  13:06:44

ftp是最低层的传输协议么?

菜鸟大kimmking()  13:06:55

说过了。

还有delete

这几个都是ftp的数据操作命令。

这里要引入一个ftp非常nb的设计。

命令与数据传输的分离。

菜鸟大kimmking()  13:08:12

clientserver端建立一个socket连接后,

老男孩²º¹²()  13:08:26

ftp基于tcp, 这是应用层的协议

菜鸟大kimmking()  13:08:33

这个连接,仅仅负责传输client发出的命令,

以及返回server端的响应状态。

天之痕丶()  13:10:18

ftpsocket的区别在哪啊

菜鸟大kimmking()  13:11:19

ftp基于tcptcp基于socket

list put get mput mget 之类的命令

都是要上传和下载数据的。

有个细节可能大家不知道。

list 返回服务器端当前路径下的所有文件信息

菜鸟大kimmking()  13:12:21

就是 windows下的 dir

linux下的ls

但是这些信息,不是通过命令的这个tcp连接发过来的

跟文件传输一样

走额外的socket通道。

菜鸟大kimmking()  13:13:27

这里,ftp又引入几个新概念

主动模式和被动模式。

老男孩²º¹²()  13:13:50

ftp是协议, socket是端口句柄, 是对tcp的封装应用, 两者不是一类东西

天之痕丶()  13:14:04

可以理解ftp集成很多socket吗?

飞走了()  13:14:19

socket不是推送吗

菜鸟大kimmking()  13:14:20

所有的网络通信,基本上都是socket

老男孩²º¹²()  13:14:23

不能

菜鸟大kimmking()  13:14:27

comet是推送

 

飞走了()  13:14:48

 

老男孩²º¹²(283137706)  13:14:50

socket是种使用ftp/tcp之类网络协议的方式, 不能和协议来比较

菜鸟大kimmking()  13:15:24

例如,当一个机器在防火墙内被保护

飞走了(77606365)  13:15:27

我们最近好像要做一个东西,用socket推送东西

菜鸟大kimmking()  13:15:40

他可能不能创建一个监听的端口

老男孩²º¹²(283137706)  13:15:48

好比, ftp就像规定了一种电线的规格, socket就是插头,有了插头才能用电线

菜鸟大kimmking()  13:15:55

只能主动的去连接别人

这几句,能听得懂吧

小怪兽()  13:16:24

哈哈

说得好

我喜欢插头插座

菜鸟大kimmking()  13:16:53

tcp连接,总是一个先listenning,另外一个来connecting

小怪兽(997585659)  13:16:54

*,,,太有感觉了

菜鸟大kimmking()  13:17:18

拿上面的比喻就是,

小怪兽(997585659)  13:17:26

应该说tcp一直在端口监听

菜鸟大kimmking()  13:17:35

得先有一个插座,

client就是插头

小怪兽()  13:17:43

也对

菜鸟大kimmking()  13:17:58

哪个插头都能来插

client-server模式

ftp的主被动模式就是

由谁来创建一个listenning的端口

让对方来connecting

菜鸟大kimmking()  13:20:10

对于没有防火墙的情况,这两个模式差别不大。

其实 tcp连接一旦建立,通话双方基本是对等的。

菜鸟大kimmking()  13:21:34

ftp通过主连接传输命令和响应,通过额外的连接来传输数据。

就像是坐飞机,

人就是命令。

数据是托运的行李。

菜鸟大kimmking()  13:22:56

另外,引入了几个常见文件模式

asciibinary

二进制模式下,文件的内容被直接发送到对方

不会做任何处理。

菜鸟大kimmking()  13:23:58

ascii的文本模式下,一般按行读取,可能会有编码问题。

好了,这些文件传输的基本功能ok了。

如果ftp只有这些基本功能,不会应用的这么广泛。

菜鸟大kimmking()  13:25:11

ftp用来处理大文件,还有一个巨大的优势是支持断点续传

这包括上传和下载的断点续传

飞走了()  13:25:27

ssh传文件,敲指令用的是这个吗

菜鸟大kimmking()  13:25:38

ps http只支持下载的续传

老男孩²º¹²(283137706)  13:25:43

ssh是另外一个协议

菜鸟大kimmking()  13:25:46

ssh传文件的方式有好多种

老男孩²º¹²(283137706)  13:26:05

应该是个协议组 SSH

菜鸟大kimmking()  13:26:08

包括rz sftp

飞走了()  13:26:11

记得之前用SSH也能选二进制或者什么的

菜鸟大kimmking()  13:26:42

说实话,我觉得本群里知道http支持下载的断点续传的人,

应该不多

甚至,几乎没有

这是另外一个话题

飞走了()  13:27:06

我一直以为http不支持断点续传。。

菜鸟大kimmking()  13:27:18

回来ftp的上传下载断点续传上来。

老男孩²º¹²()  13:27:20

...这个还是很明显的吧, Chrome下载可以暂停...

飞走了()  13:27:34

但是ie不行啊

菜鸟大kimmking()  13:28:10

http协议头里有个range命令,可以告诉服务器,从文件的什么位置开始传输。

飞走了()  13:28:15

而且可能过一段时间chrome下载也会失败

菜鸟大kimmking()  13:28:38

如果服务器端的文件是动态生成的,什么端点续传功能都失效

飞走了()  13:28:49

哦哦

菜鸟大kimmking()  13:28:57

菜鸟大kimmking()  13:27:17

回来ftp的上传下载断点续传上来。

ftp创造了端点续传这个功能

大概的流程是,

菜鸟大kimmking()  13:30:37

1、先告诉server,你要从文件的哪个位置,第几个字节开始

2、请求此文件的数据

上传也大概一样。

很简单吧。

别小看这个简单的流程。

我们可以在自己实现的上传下载工具里改进一下。

菜鸟大kimmking()  13:31:42

1、主线程,拿到文件的大小。

老男孩²º¹²()  13:31:52

IE废柴不是一天两天了, 它的断点续传需要一些小技巧才能用

据说IE9开始有断点续传了, 没试过

菜鸟大kimmking()  13:32:16

2、把文件大小除以10,计算每一片的起始文字。

飞走了(77606365)  13:32:27

起始文字

菜鸟大kimmking()  13:32:55

3、起10个线程,每个线程从指定的位置请求此文件指定的数据量。

10个线程一起跑,拿到数据后,再合并成一个完整的文件。

这样,一个多线程的上传下载工具,就出来了。

飞走了(77606365)  13:33:47

你说的额这个好像flashget的样子

菜鸟大kimmking()  13:33:48

这才是ftpnb之处。

ftp工具,都支持这个功能。

飞走了()  13:34:04

快车会显示一个点阵图,好像

很形象

不过好像有的网站把这种功能屏蔽了

菜鸟大kimmking()  13:34:47

ftp是计算机古代,很简洁而优美的设计。

虽然现在也能设计出更多更好的文件操作协议。

菜鸟大kimmking()  13:35:52

但想再做到ftp的这种简介优美,以及被广泛支持,

都是不太可能了。

over

飞走了()  13:36:32

完了?

菜鸟大kimmking()  13:36:45

没啦

命令自己看去

rest retr stor

我为什么知道这些东西呢

因为,我大学的时候自己做过ftp传输工具

菜鸟大kimmking()  13:37:52

基于tcp,自己实现的ftp协议

刚毕业的时候,正好把它用到项目里。

基于c++,做成activex,嵌入ie

菜鸟大kimmking()  13:38:55

实现ftphttp的上传下载的端点续传

http的上传,在server端做了一些手脚

因为它本身不支持

飞走了()  13:39:26

server端做手脚

菜鸟大kimmking()  13:39:44

实现的效果是,http的上传,可以达到10M/s

菜鸟大kimmking()  13:41:15

我学ftp10年前的事儿了

我用到项目里,也是06-07年的事儿

所以说,真正掌握的知识,

是不会忘记的

如果忘记了,说明你根本没掌握

一千年以后<[email protected]>  13:41:55

server端坐手脚?

菜鸟大kimmking()  13:41:59

根本没想清楚,搞明白

工作QQ()  13:42:02

ftp

不是有专门的工具

菜鸟

菜鸟大kimmking()  13:42:15

http只支持下载的断点续传

工作QQ(827809326)  13:42:17

你咋做的

菜鸟大kimmking()  13:42:20

上传的话,

需要自己做个servlet

client端多线程发送一片片的文件

servlet拿到以后,

飞走了(77606365)  13:42:53

那其实就相当于反向的下载

菜鸟大kimmking()  13:42:58

合并成一个完整的文件。

yes

一千年以后<[email protected]>  13:43:24

这个有实际的用途吗

飞走了(77606365)  13:43:39

你如果有自己的主站就有用

一千年以后<[email protected]>  13:43:47

是使上传加速吗

飞走了()  13:43:53

上传资源文件,如果特别多特别大就很费劲了

工作QQ()  13:44:15

tcp

飞走了()  13:44:44

现在就记得好像是8个层了

八月()  13:45:58

K神,有开发的有什么框架吗?

老男孩²º¹²()  13:46:40

八层...

老男孩²º¹²()  13:48:16

OSI 7 , TCP/IP 4, 哪来的八层

五毒|小兵()  13:48:47

啥时候能讲讲

系统调优不

标准自己很难界定,

又不知道行业里面的通常标准是什么,

一个正常的系统里面压力测试是多少人, 并发是多少人, 吞吐量是多少, 响应时间多少算是合适的啊

猪猪狭--哎呀A<>  13:48:56

网络好像是7层协议?

OSI包括 TCP/IP 4?

我也很迷茫()  13:49:40

K神的讲座,有人在整理吗

老男孩²º¹²()  13:50:36

OSI TCP/IP 是两个不同的网络分层模型

猪猪狭--哎呀A<[email protected]>  13:51:14

我记得网络7层就包括TCP/IP的四层

猜你喜欢

转载自peter2009.iteye.com/blog/1843759