趣谈网络协议---P2P协议:我下小电影,99%急死你

FTP两种工作模式
FTP采用两个TCP连接传输一个文件:控制连接、数据连接。

从FTP服务器角度,FTP有两种工作模式。

  • 主动模式(PORT):客户端打开端口N、N+1,用N端口向服务器的命令端口21发起连接,用N+1端口监听并向服务器发出“port N+1"命令,服务器从数据端口20主动连向客户端指定的端口N+1
  • 被动模式(PASV):客户端打开端口N、N+1,用N端口向服务器的命令端口21发起连接,提交PASV命令,服务器开启任意端口被动接受客户端来自N+1端口的连接

P2P是什么?
peer-to-peer。资源分成存储在多台设备,这些设备称为peer。

下载文件时,需得到下载文件的peer,与之建立点对点连接,就近下载文件。下载文件后,自己成为peer的一员。

种子(.torrent)文件
通过种子,即.torrent文件,知道哪些peer有什么文件。

.torrent文件组成:announce(tracker URL)、文件信息。

文件信息:

  • info区:该种子拥有的文件数、文件长度、目录结构、目录和文件名。
  • Name字段:顶层目录名
  • 每个段的大小:BitTorrent(BT)协议把一个文件分成多个小段,然后分段下载。
  • 段哈希值:整个种子中的每个段的SHA-1哈希值拼在一起。

下载过程:
BT客户端解析.torrent文件–>得到tracker地址–>连接tracker服务器–>tracker服务器回应下载请求,提供其他下载者(包括发布者)的IP–>下载者连接其他下载者–>根据.torrent文件,双方均告知对方自己已有的块–>交换对方没有的数据

下载者每得到一个块,需算出下载块的Hash验证码,与.torrent文件中的对比,不一样时重新下载。

tracker服务器登记有哪些应用请求哪些资源,一旦出现故障,BT工具无法工作。

去中心化网络(Distributed Hash Table,DHT)
每个加入DHT网络的人,都负责存储网络里的资源信息和其他成员的联系信息。

Kademlia协议。任何一个BitTorrent启动后,肩负两个角色。peer,监听一个TCP端口,上传、下载文件。DHT node,监听一个UDP端口,加入一个DHT网络。

每个DHT node拥有文件索引,即知道哪些文件在哪些节点上。
在这里插入图片描述
哈希值

DHT node 上应该有哪些文件的位置信息?每个文件可以计算出一个哈希值,长度为160bits(20字节),DHT node的ID的长度与之相同,是一个随机选择的160bits空间。

一个文件计算出哈希值后,和这个哈希值距离相近的DHT node知道在哪里下载这个文件。距离通过异或计算。

一个新的节点node new想下载文件1,如何加入DHT网络?种子.torrent中保存的不再是tracker的地址,而是一个node地址的list(去中心化),只要与其中一个联系上便加入了网络。

node new计算文件1的哈希值,发现node C知道在哪里下载文件1,但是如何联系node C?没有node C的联系方式,node new只能联系与node C的ID异或距离很近的节点node C’,node C’继续联系下去。

node new 下载了文件后,会告知node C和node C’,自己有文件1了,可加入文件拥有者列表了。

DHT 网络中的朋友圈是怎么维护的?
按距离分层。对于某个基础节点node,将与之从倒数第 i 位开始不同的节点放入“k-bucket i”,k-bucket i 内只有 2 ( i − 1 ) 2^{(i-1)} 2(i1) 个节点,与node的距离范围为 [ 2 ( i − 1 ) , 2 i ) [2^{(i-1)}, 2^i) [2(i1),2i)

DHT 网络是如何查找朋友的?
node A 要找 node B,两者异或距离为10110,范围在 [ 2 4 , 2 5 ) [2^4, 2^5) [24,25), 所以 node B 可能在 node A 的 ”k-bucket 5“中,两者从第5位开始不同。

A 发现自己的 k-bucket 5 中没有 B,于是在 k-bucket 5 中随便找了一个,假如是C,既然 C 与 A 的第5位不同,那么肯定与 B 的第5位相同,即 C 与 B 的距离 < 2 4 2^4 24,距离缩短了一半以上。C 再继续查找即可,时间复杂度位 log(n)。

在 DHT 网络中,朋友之间怎么沟通呢?

Kademlia 算法中,每个节点只有 4 个指令。

  • PING
  • STORE:要求节点存储一份数据。
  • FIND_NODE
  • FIND_VALUE

DHT 网络中,朋友圈如何更新呢?

  • 每个 bucket 里的节点,都按最后一次接触的时间倒序排列。
  • 每次执行4个指令中的任意一个都会触发更新。
  • 当一个新节点与自己接触时,如果在 k-bucket 中,则置顶;不在,若通讯录满,最旧的节点能 PING 通,则丢弃新节点;PING 不同,则删除旧节点,加入新节点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值