p2sp設計需要考慮的幾點問題整理(續)

2021-06-07 19:26:51 字數 1784 閱讀 8766

p2p容易造成網路擁堵

單論傳輸過程,bt或者其他p2p軟體已經處理得很好了,但是在協同處理上仍需要改進。比如bt在要求別的節點傳輸內容塊時,需要向它們查詢是否擁有該內容塊,然後建立連線,這種的缺點是實時性差,難以排程各個節點的資源,容易造成網路擁堵。

認識nat

我們要實現udp穿透,就需要看看客戶端網路環境是否支援,前文介紹的udp穿透過程中就需要nat裝置的幫助。

nat(網路位址轉換)按照實現方式分為:full cone nat,restricted cone nat, port restricted cone nat以及symmetric nat四種

前面三種nat型別都是可以進行穿透的(好在國內大部分網路環境都是前三者,尤其是第三種nat型別)

如何檢測nat型別

當然我們可以利用公共的stun伺服器實現檢測功能,可以參照我的另一篇介紹——《stun協議檢測網路環境流程》

大致工作原理如下,首先有乙個公網的server並且繫結了兩個公網ip(ip-1,ip-2)。這個server做udp監聽(ip-1,port-1),(ip-2,port-2)並根據客戶端的要求進行應答。

第一步:檢測客戶端是否有能力進行udp通訊以及客戶端是否位於nat後? 

客戶端建立udp socket向伺服器(ip-1,port-1)傳送資料報並等待返回,如果超時,則可能是防火牆或nat阻止udp通訊,這樣的客戶端不能p2p(當然需要多次嘗試)

如果伺服器返回客戶端ip,port與自身localip,localport相同,則說明出於公網,並不在nat後,否則進行第二步判斷。

第二步:檢測客戶端nat是否是full cone nat? 

客戶端建立udp socket然後用這個socket向伺服器的(ip-1,port-1)傳送資料報,伺服器用另一對(ip-2,port-2)響應客戶端發乙個資料報,客戶端傳送請求後立即開始接受資料報,記著設定超時. 如果得到響應,則是full cone(判斷停止),否則進行下一步判斷。

第三步:檢測客戶端nat是否是symmetric nat? 

客戶端建立udp socket然後用這個socket向伺服器的(ip-1,port-1)傳送資料報,重複這個過程直到收到回應(一定能夠收到,因為第一步保證了這個客戶端可以進行udp通訊)。用同樣的方法用乙個socket向伺服器的(ip-2,port-2)傳送資料報要求伺服器返回客戶端的ip和port。 

比較上面兩個過程從伺服器返回的客戶端(ip,port),如果兩個過程返回的(ip,port)有一對不同則說明客戶端為symmetric nat,這樣的客戶端無法進行udp-p2p通訊(檢測停止)。否則是restricted cone nat,是否為port restricted cone nat有待下一步檢測。

第四步:檢測客戶端nat是restricted cone nat還是port restricted cone nat? 

客戶端建立udp socket然後用這個socket向伺服器的(ip-1,port-1)傳送資料報要求伺服器用ip-1和乙個不同於port-1的埠傳送乙個udp資料報響應客戶端, 如果每次都無法接受到伺服器的回應,則說明客戶端是乙個port restricted cone nat,如果能夠收到伺服器的響應則說明客戶端是乙個restricted cone nat。以上兩種nat都可以進行udp-p2p通訊。

p2p應用程式一些開發難題

需要開發用於訊息交換的p2p私有協議

必須查詢並連線隱藏在nat(網路位址轉換)或防火牆背後的p2p應用程式例項

需要支援在廣域網中定位各個p2p應用程式所需要的系統架構(網路拓撲資料結構及路由表)

p2p的激勵機制,防止某些吸血使用者導致整個系統低效率

快取設計需要考慮的問題

前言 沒有一種快取方案可以解決一切的業務場景或資料型別,我們需要根據自身的特殊場景和背景,選擇最適合的快取方案 一.是否需要使用快取 需要使用快取的業務場景 比如前台頁面展示,購物車 二.快取物件的粒度 一種資料乙個物件,簡單,讀取寫入都快,但是種類一多,快取的管理成本就會很高 多種資料放在乙個集合...

設計快取架構時需要考慮的因素總結

在設計架構快取的時候,首先要選定快取元件,比如要用local cache,還是redis memcached pika等開源快取元件。如果業務快取需求比較特殊,還要考慮是直接定製開發乙個新的快取元件,還是對開源快取進行二次開發,來滿足業務需要。確定好快取元件後,要根據業務訪問的特點,進行快取資料結構...

設計一款DLL殼需要考慮的問題

先說前一點,在內存中不確定的位置意味著重定位表是必須的。第二點,程式入口點,如你所知,程式入口點在pe結構中optional addressofentrypoint表示是乙個rva位址,即相對虛擬位址 relative virtual address 詳見pe結構介紹文章。entrypoint 入口...