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(i−1) 个节点,与node的距离范围为
[
2
(
i
−
1
)
,
2
i
)
[2^{(i-1)}, 2^i)
[2(i−1),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 不同,则删除旧节点,加入新节点。