完整的 P2P 應用需要包含哪些功能

  • 2019 年 10 月 3 日
  • 筆記

本文告訴大家一個 P2P 傳輸的應用程式需要有哪些核心的功能,特別是作為一個下載器需要包含的功能

核心的 P2P 的功能包含了發現設備、連接設備進行通訊的功能

  • 核心功能
  • 發現設備
  • 連接和通訊
  • 基礎功能
  • 文件管理
  • 上傳
  • 下載

發現設備

在 P2P 裡面最核心也是最有技術含量的就是發現設備機制,這個機製做的好不好就影響到程式在發現過程的速度

發現機制裡面有帶中央伺服器的發現和不帶中央伺服器的發現

  • 中央發現伺服器
  • 本地區域網發現
  • 廣域網發現

中央發現伺服器

  • 上報設備資訊
  • 獲取其他設備
  • 評估最優返回值
  • 優先區域網

所有的 P2P 設備都和中央伺服器連接,然後上報自己設備的資訊,同時從中央伺服器拿到其他的設備的資訊,這樣就可以做到快速發現其他設備

中央伺服器的優點是讓 P2P 設備第一次接入的時候的發現其他設備的速度非常快,解決了第一次接入的問題

缺點是中央伺服器將會被大量的 P2P 設備連接,需要保存大量 P2P 設備的資訊。同時在設備請求其他設備資訊的時候,中央伺服器應該返回的是哪些設備。因為中央伺服器必須保證在返回的設備裡面,可以讓請求的設備儘可能的連接,這就包括了去掉那些不活躍的設備以及區域網設備優先

本地區域網發現

  • 組播
  • 掃描網段

在 P2P 的應用裡面,區域網是應用的最多的,可以通過掃描網段以及使用組播的方式快速發現區域網內的其他設備

關係維護

  • 介紹
  • 心跳

無論是中央伺服器發現本地區域網發現都需要在發現之後做關係維護,例如使用中央伺服器的發現,在連接上中央伺服器之後,需要定時和中央伺服器通訊,這樣中央伺服器才能確定這個設備是活躍的,才會將這個設備介紹給其他設備

在設備之間無論是本地區域網還是廣域網發現之後,也需要設備之間做心跳這樣才可以給後續的網路連接評估應該優先拿哪些設備進行連接

關係維護還包括介紹功能,如果將中央伺服器當做廣域網的一個 P2P 設備,那麼也就是第一次接入 P2P 網路的時候可以有一個設備可以連接,在連接到一台設備的時候,可以詢問這台設備有哪些朋友設備。當連接上的設備介紹了他的連接上的設備的時候,也就是本地設備就多發現了其他的設備

很難做到在沒有中央伺服器的前提下進行廣域網發現,因為假設沒有一台在廣域網固定的設備,也就是 P2P 設備在第一次運行的時候不知道可以從哪裡找到其他的設備,這就是P2P裡面最難的一部分了。而如果有一台廣域網固定的設備,那麼這台設備就相當於中央發現伺服器

網路連接

  • 穿透
  • 透傳

因為 P2P 是每個設備都是作為伺服器,而現在很多運營商都不允許個人設備對外提供服務,如果是做廣域網的 P2P 應用,那麼網路連接將會是極大的難題

穿透

  • 打洞

從一個區域網連接到另一個區域網

透傳

  • 中間伺服器透傳
  • 中間設備透傳
  • 負載平衡
  • 最短路徑
  • 鏈路發現

透傳這個功能是假設我有三個設備,其中 A 和 B 可以相互連接,而 B 和 C 可以相互連接,但是 A 無法連接上 C 此時需要 A 和 C 通訊,就需要經過讓 A 經過 B 和 C 通訊。這個過程就是透傳

在 BTSync 這個工具裡面就通過中間伺服器作為透傳,如果全部的透傳都經過中間伺服器,那麼就是和 花生殼 差不多的原理。使用中間伺服器的優點是因為中間伺服器具有對外服務,也就是能訪問外網的設備就可以連接中間伺服器,所以可靠性好。但是缺點是有大量數據會經過中間伺服器,將會給中間伺服器帶來流量和負載的坑

而如果是選定用戶設備作為透傳的中間設備,此時可以做到內部傳輸,不需要做中間伺服器,但是存在的問題是如果某個設備被作為多個其他設備的中間設備,那麼將會讓這個設備的資源被一直佔用。此時需要有一個負載平衡的演算法

有時候的透傳不只需要一台設備,此時就需要做到最短路徑的評估了

基礎功能

本文的基礎功能指的是一個文件傳輸的 P2P 需要的基礎功能,而不包含一個 P2P 通訊軟體的基礎功能

  • 上傳
  • 下載
  • 資源管理

上傳

  • 資源查找
  • 分塊文件
  • 文件夾上傳
  • 文件夾標識
  • 內部文件作為相對文件下載
  • 以壓縮文件下載
  • 性能評估演算法
  • 上傳限速
  • 保留資源方法

在接受到其他設備請求資源的時候,需要先從資源管理裡面查找本地是否存在此資源,如果存在資源則執行上傳資源

上傳資源時其實就是提供文件給到其他設備下載,上傳功能將需要和下載功能一起做,原因是很多下載的技術都需要用到文件分塊,此時需要上傳模組支援文件分塊下載

而有些下載模組需要下載文件夾,此時就需要有文件夾資源管理的方法同時還有文件夾下載的方式,文件夾下載的方式有很多不同的方式,例如文件夾內部不做校驗,如 BTSync 的演算法,這個演算法將需要做文件衝突處理,參見堅果雲的衝突處理。文件夾內部文件作為相對文件下載方法,如 Chrome 的二進位更新演算法。文件夾內部每個文件作為獨立資源方式,例如迅雷的下載方式。以壓縮文件表示的文件夾上傳方式,如 Git 的演算法,這裡說的不是總的 Git 上傳演算法,或者 FTPServer 和堅果雲的文件夾下載演算法

而上傳過程中,可能存在多個客戶端都請求資源下載,如果每次都響應,那麼將會影響本機的性能,此時需要有性能評估演算法,在本機忙碌的時候拒絕客戶端的請求。同時這部分也需要下載模組的配合,如果發現這個資源只有此設備存在,那麼在忙碌的時候只能通過限制下載性能的方式提供資源

如何讓客戶端發現資源僅在本機存在就需要用到保留資源方法,在 UTorrent 的說法是做種,也就是本機下載了一個資源那麼就聲明本機存在這個資源。至於本機有資源給不給下載就是另一回事了,假如本機很忙,那麼只是回應本機存在此資源,但是本機很忙現在不提供下載功能

下載

  • 下載清單
  • 文件夾下載
  • 文件校驗
  • 下載鏈技術
  • 多端下載
  • 遠程設備性能評估演算法
  • 文件管理細節
  • 預先磁碟分配
  • 訪問許可權
  • 文件重複

下載的時候需要提交下載清單,下載清單就是下載什麼樣的文件,應該下載到哪等。例如 UTorrent 工具的種子就是下載清單

下載的過程需要經過設備發現找到對應的存在資源的設備進行下載

在下載的時候對單一文件如果有支援多個設備同時下載的性能將會高很多,也就是對一個文件支援從多個設備下載。這個技術是下載鏈技術,在發現第一個設備的時候就進行下載文件的第一段,在發現第二個設備的時候,就從文件裡面還沒下載完成的範圍進行下載,這樣才能做到最大的下載性能

在下載中下載鏈技術是關鍵的技術,同時難度比較大,單這個點能投入很多資源開發。現在對下載鏈技術處理比較好的有 UTorrent 和比特彗星

因為下載的資源是其他設備傳輸的,可能存在逗比設備,所以在下載完成之後需要進行校驗。如果使用下載鏈技術那麼需要對文件分塊進行校驗

下載的時候如果連接上了一個下載性能很慢的機器,應該將這個機器去掉,這就是遠程設備性能評估演算法了。此演算法一般都會和下載鏈技術一起使用

在現代的軟體裡面下載的過程還需要讓用戶看到下載進度和下載速度,這部分就不是 P2P 的核心了,但是開發投入將會很大,特別是在加上下載鏈技術的時候

和普通的下載程式一樣,在 P2P 下載模組裡面也會遇到磁碟空間不足、下載文件已經存在等細節問題,這部分也是需要有大量投入資源才能解決

資源管理

  • 單文件管理
  • 文件夾管理
  • 文件校驗
  • 文件變更管理
  • 資源尋找
  • 安全性

資源管理部分主要是上傳模組的支援,管理本機包含的資源,也就是在客戶端請求的時候可以回應哪些資源是本機存在的

在支援文件夾上傳裡面還需要有文件夾的管理

對於文件的管理最大的問題在於如何識別本地文件的變更,如果用戶只是刪除還好,重要的是用戶可能對文件進行修改,此時的資源就進行了變動,如果此時對文件進行校驗,那麼性能將會很差,這部分就需要有很多開發投入優化

通常下載的內容都是其他設備給的,這部分下載內容以及提供上傳的內容都涉及安裝性,好在下載部分可以讓第三方安全軟體掃描,也就是需要有接入第三方的安全軟體。而上傳功能則是不能提供用戶關鍵資訊給上傳,我見過學校的 P2P 軟體用來管理教室的軟體就可以做到上傳任意的文件,這樣做是不安全的

本文主要提供給大家如果需要開發一個 P2P 下載程式的時候可以參考的點,可以用來評估開發的時間。如果做一個完整的 P2P 程式,想要做的很好用需要的投入將會十分可怕,參見迅雷或比特彗星或 BT 團隊的開發。但是如果只是做一個簡單版本的,那麼只做核心功能,同時不對細節進行優化,那麼開發的速度還是能做到很快的