TP 采用兩個(gè) TCP 連接來(lái)傳輸一個(gè)文件。
- 控制連接:服務(wù)器以被動(dòng)的方式,打開(kāi)眾所周知用于 FTP 的端口 21,客戶(hù)端則主動(dòng)發(fā)起連接。該連接將命令從客戶(hù)端傳給服務(wù)器,并傳回服務(wù)器的應(yīng)答。常用的命令有:list——獲取文件目錄;reter——取一個(gè)文件;store——存一個(gè)文件。
- 數(shù)據(jù)連接:每當(dāng)一個(gè)文件在客戶(hù)端與服務(wù)器之間傳輸時(shí),就創(chuàng)建一個(gè)數(shù)據(jù)連接。FTP 的兩種工作模式。
每傳輸一個(gè)文件,都要建立一個(gè)全新的數(shù)據(jù)連接。FTP 有兩種工作模式,分別是主動(dòng)模式(PORT)和被動(dòng)模式(PASV),這些都是站在 FTP 服務(wù)器的角度來(lái)說(shuō)的。
主動(dòng)模式下,客戶(hù)端隨機(jī)打開(kāi)一個(gè)大于 1024 的端口 N,向服務(wù)器的命令端口 21 發(fā)起連接,同時(shí)開(kāi)放 N+1 端口監(jiān)聽(tīng),并向服務(wù)器發(fā)出 “port N+1” 命令,由服務(wù)器從自己的數(shù)據(jù)端口 20,主動(dòng)連接到客戶(hù)端指定的數(shù)據(jù)端口 N+1。
被動(dòng)模式下,當(dāng)開(kāi)啟一個(gè) FTP 連接時(shí),客戶(hù)端打開(kāi)兩個(gè)任意的本地端口 N(大于 1024)和 N+1。第一個(gè)端口連接服務(wù)器的 21 端口,提交 PASV 命令。然后,服務(wù)器會(huì)開(kāi)啟一個(gè)任意的端口 P(大于 1024),返回“227 entering passive mode”消息,里面有 FTP 服務(wù)器開(kāi)放的用來(lái)進(jìn)行數(shù)據(jù)傳輸?shù)亩丝???蛻?hù)端收到消息取得端口號(hào)之后,會(huì)通過(guò) N+1 號(hào)端口連接服務(wù)器的端口 P,然后在兩個(gè)端口之間進(jìn)行數(shù)據(jù)傳輸。
DHT(Distributed Hash Table)的去中心化網(wǎng)絡(luò)。每個(gè)加入這個(gè) DHT 網(wǎng)絡(luò)的人,都要負(fù)責(zé)存儲(chǔ)這個(gè)網(wǎng)絡(luò)里的資源信息和其他成員的聯(lián)系信息,相當(dāng)于所有人一起構(gòu)成了一個(gè)龐大的分布式存儲(chǔ)數(shù)據(jù)庫(kù)。
任何一個(gè) BitTorrent 啟動(dòng)之后,它都有兩個(gè)角色。一個(gè)是 peer,監(jiān)聽(tīng)一個(gè) TCP 端口,用來(lái)上傳和下載文件,這個(gè)角色表明,我這里有某個(gè)文件。另一個(gè)角色 DHT node,監(jiān)聽(tīng)一個(gè) UDP 的端口,通過(guò)這個(gè)角色,這個(gè)節(jié)點(diǎn)加入了一個(gè) DHT 的網(wǎng)絡(luò)。
在 DHT 網(wǎng)絡(luò)中,朋友之間怎么溝通呢?
Kademlia 算法中,每個(gè)節(jié)點(diǎn)只有 4 個(gè)指令。
- PING:測(cè)試一個(gè)節(jié)點(diǎn)是否在線,還活著沒(méi),相當(dāng)于打個(gè)電話,看還能打通不。
- STORE:要求一個(gè)節(jié)點(diǎn)存儲(chǔ)一份數(shù)據(jù),既然加入了組織,有義務(wù)保存一份數(shù)據(jù)。
- FIND_NODE:根據(jù)節(jié)點(diǎn) ID 查找一個(gè)節(jié)點(diǎn),就是給一個(gè) 160 位的 ID,通過(guò)上面朋友圈的方式找到那個(gè)節(jié)點(diǎn)。
- FIND_VALUE:根據(jù) KEY 查找一個(gè)數(shù)據(jù),實(shí)則上跟 FIND_NODE 非常類(lèi)似。KEY 就是文件對(duì)應(yīng)的 160 位的 ID,就是要找到保存了文件的節(jié)點(diǎn)。
DHT 網(wǎng)絡(luò)中,朋友圈如何更新呢?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-731966.html
- 每個(gè) bucket 里的節(jié)點(diǎn),都按最后一次接觸的時(shí)間倒序排列,這就相當(dāng)于,朋友圈里面最近聯(lián)系過(guò)的人往往是最熟的。
- 每次執(zhí)行四個(gè)指令中的任意一個(gè)都會(huì)觸發(fā)更新。
- 當(dāng)一個(gè)節(jié)點(diǎn)與自己接觸時(shí),檢查它是否已經(jīng)在 k-bucket 中,也就是說(shuō)是否已經(jīng)在朋友圈。如果在,那么將它挪到 k-bucket 列表的最底,也就是最新的位置,剛聯(lián)系過(guò),就置頂一下,方便以后多聯(lián)系;如果不在,新的聯(lián)系人要不要加到通訊錄里面呢?假設(shè)通訊錄已滿的情況,PING 一下列表最上面,也即最舊的一個(gè)節(jié)點(diǎn)。如果 PING 通了,將舊節(jié)點(diǎn)挪到列表最底,并丟棄新節(jié)點(diǎn),老朋友還是留一下;如果 PING 不通,刪除舊節(jié)點(diǎn),并將新節(jié)點(diǎn)加入列表,這人聯(lián)系不上了,刪了吧。
此文章為9月Day17學(xué)習(xí)筆記,內(nèi)容來(lái)源于極客時(shí)間《趣談網(wǎng)絡(luò)協(xié)議》,推薦該課程。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-731966.html
到了這里,關(guān)于P2P協(xié)議的傳輸藝術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!