您的位置:首页 > 理论基础

计算机网络学习随笔记(文件传输协议)

2020-07-07 10:44 67 查看

文件传输

最简单的方式就是通过HTTP进行下载。通过浏览器下载的时候,只要文件稍微大点,下载的速度就奇慢无比。

还有一种下载方式就FTP,也就是文件传输协议,FTP采用两个TCP连接来传输一个文件。

  • 控制连接:服务器以被动的方式打开用于FTP的端口21,客户端主动发起连接。这个连接将命令从客户端传送到服务器端,并将服务器的应答返回。常用的命令:list-获取文件目录;reter-取一个文件;store-存一个文件。
  • 数据连接:每当一个文件在客户端与服务器之间进行传输时,就会建立一个数据连接。

FTP的两种工作模式(主动模式、被动模式):

  • 主动模式下,客户端随机打开一个大于1024的端口N,向服务器的命令端口21发起连接,同时开发N+1端口监听,并向服务器端发送“port N + 1”命令,由服务器从自己的数据端口20,主动连接到客户端指定的N+1端口。
  • 被动模式下,当开启一个FTP连接的时候,客户端打开两个任意的本地端口 N(大于1024)和 N+1 。第一个端口连接服务器的21端口,提交PASV命令。然后服务器会开启一个任意的端口 P(大于1024),返回“227 entering passive mode” 消息,里面有FTP服务器开放的用来进行数据的端口。客户端收到信息取得端口号之后,会通过 N + 1 号端口连接服务器的端口 P ,然后再两个端口之间进行数据传输。

P2P

P2P就是peer-to-peer。资源开始并不集中地存储在某 些设备上,而是分散地存储在多台设备上。这些设备我们姑且称为 peer。

想要下载一个文件的时候,你只要得到哪些已经存在的文件的peer,并和这些peer建立点对点的连接。而不用到中心服务器上就可以下载文件。一旦你下载成功了,你就会变成peer种的一员,你旁边的机器就有可能会从你这里下载文件。只要用户足够多,下载的速度就越快。

种子(.torrent)文件:

当你想下载文件的时候,怎么知道哪些peer有这个文件?这时候种子就标识了peer信息。种子文件主要是由两部分组成的:announce(tracker URL)和文件信息。

文件信息包含:

  • info区:这里指定的是该种子有几个文件、文件有多长、目录结构,以及目录和文件的名字。
  • Name字段:指定顶层目录的名字。
  • 每个段的大小:BitTorrent(简称 BT)协议把一个文件分成很多个小段,然后分段下载。
  • 段哈希值:将整个种子中,每个段的 SHA-1 哈希值拼在一起。

下载时,BT 客户端首先解析.torrent 文件,得到 tracker 地址,然后连接 tracker 服务器。

tracker 服务器回应下载者的请求,将其他下载者(包括发布者)的 IP 提供给下载者。下载者再连接其他下载者,根据.torrent 文件,两者分别对方告知自己已经有的块,然后交换对方没有的数据。此时不需要其他服务器参与,并分散了单个线路上的数据流量,因此减轻了服务器的负担。

下载者每得到一个块,需要算出下载块的 Hash 验证码,并与.torrent 文件中的对比。如果一样,则说 明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容的准确性问题。

这种工作方式有一个弊端,一旦 tracker 服务器出现故障或者线路遭到屏蔽,BT 工具就无法正常 工作了。

去中心化网络(DHT)

DHT(Distributed Hash Table)去中心化网络,每个加入这个 DHT 网络 的人,都要负责存储这个网络里的资源信息和其他成员的联系信息,相当于所有人一起构成了一个庞大的分布式存储数据库。

有一种著名的 DHT 协议,叫Kademlia 协议。这个和区块链的概念一样,很抽象。

任何一个 BitTorrent 启动之后,它都有两个角色。一个是peer,监听一个 TCP 端口,用来上传和下载 文件,这个角色表明,我这里有某个文件。另一个角色DHT node,监听一个 UDP 的端口,通过这个角色,这个节点加入了一个 DHT 的网络。

在 DHT 网络里面,每一个 DHT node 都有一个 ID。这个 ID 是一个很长的串。每个 DHT node 都有责 任掌握一些知识,也就是文件索引,也即它应该知道某些文件是保存在哪些节点上。它只需要有这些知 识就可以了,而它自己本身不一定就是保存这个文件的节点。

每个 DHT node 不会有全局的知识,也即不知道所有的文件保存在哪里,它只需要知道一部分。那应该知道哪一部分呢?这就需要用哈希算法计算出来。每个文件可以计算出一个哈希值,而DHT node 的 ID 是和哈希值相同长度的串。 DHT 算法是这样规定的:如果一个文件计算出一个哈希值,则和这个哈希值一样的那个 DHT node,就有责任知道从哪里下载这个文件,即便它自己没保存这个文件。

当然不一定这么巧,总能找到和哈希值一模一样的,有可能一模一样的 DHT node 也下线了,所以DHT 算法还规定:除了一模一样的那个 DHT node 应该知道,ID 和这个哈希值非常接近的 N 个 DHT node 也应该知道。

什么叫和哈希值接近呢?例如只修改了最后一位,就很接近;修改了倒数 2 位,也不远;修改了倒数 3位,也可以接受。总之,凑齐了规定的 N 这个数就行。

刚才那个图里,文件 1 通过哈希运算,得到匹配 ID 的 DHT node 为 node C,当然还会有其他的,这里没有画出来。所以,node C 有责任知道文件 1 的存放地址,虽然 node C 本身没有存放文件 1。

同理,文件 2 通过哈希运算,得到匹配 ID 的 DHT node 为 node E,但是 node D 和 E 的 ID 值很近,所以 node D 也知道。当然,文件 2 本身没有必要一定在 node D 和 E 里,但是碰巧这里就在 E 那有一 份。接下来一个新的节点 node new 上线了。如果想下载文件 1,它首先要加入 DHT 网络。

在这种模式下,种子.torrent 文件里面就不再是 tracker 的地址了,而是一个 list 的 node 的地址,而所有这些 node 都是已经在 DHT 网络里面的。当然随着时间的推移,很可能有退出的,有下线的,但是我们假设,不会所有的都联系不上,总有一个能联系上。node new 只要在种子里面找到一个 DHT node,就加入了网络。

node new 会计算文件 1 的哈希值,并根据这个哈希值了解到,和这个哈希值匹配,或者很接近的node 上知道如何下载这个文件,例如计算出来的哈希值就是 node C。 但是 node new 不知道怎么联系上 node C,因为种子里面的 node 列表里面很可能没有 node C,但是可以问,DHT 网络特别像一个社交网络,node new 只有去它能联系上的 node 问,你们知道不知道 node C 的联系方式呀?

在 DHT 网络中,每个 node 都保存了一定的联系方式,但是肯定没有 node 的所有联系方式。DHT 网络中,节点之间通过互相通信,也会交流联系方式,也会删除联系方式。和人们的方式一样,你有你的朋友圈,你的朋友有它的朋友圈,你们互相加微信,就互相认识了,过一段时间不联系,就删除朋友关系。

有个理论是,社交网络中,任何两个人直接的距离不超过六度,也即你想联系比尔盖茨,也就六个人就能够联系到了。所以,node new 想联系 node C,就去万能的朋友圈去问,并且求转发,朋友再问朋友,很快就能找到。如果找不到 C,也能找到和 C 的 ID 很像的节点,它们也知道如何下载文件 1。

在 node C 上,告诉 node new,下载文件 1,要去 B、D、 F,于是 node new 选择和 node B 进行 peer 连接,开始下载,它一旦开始下载,自己本地也有文件 1 了,于是 node new 告诉 node C 以及和 node C 的 ID 很像的那些节点,我也有文件 1 了,可以加入那个文件拥有者列表了。但是你会发现 node new 上没有文件索引,但是根据哈希算法,一定会有某些文件的哈希值是和 node new 的 ID 匹配上的。在 DHT 网络中,会有节点告诉它,你既然加入了咱们这个网络,你也有责任知道。某些文件的下载地址。

好了,一切都分布式了。

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: