P2P原理和NAT打洞


1. P2P協議--點對點通信

1.1 常用的P2P協議

1.1.1 電驢(eMule)

一個電驢網絡由服務器端和客戶端兩部分組成。
服務器端是客戶端連接的、為了搜索和查找可以下載用戶的橋梁。客戶通過瀏覽它而獲取他需要的文件所有者的客戶端信息。

搜索(Searching):
每一個客戶端連接到一個服務器作為他的主服務器。由客戶端告訴主服務器他共享了哪些文件。服務器搜索時會將文件和ip信息反饋給搜索的客戶端列表。

下載(Downloading):
客戶端下載前先查詢服務器獲取一個擁有該文檔的客戶端的列表。它將請求每個客戶端發送這個文件的不同片。直至最后文件由這個不同的片組裝成一個完整的文件。
在進行暫停/恢復的時候,它暫停的僅僅是客戶端和客戶端之間的TCP連接然后恢復TCP連接。這個過程只有再恢復時通過客戶端向服務器端發送22個字節后
即可。占用的僅僅是22個字節的網絡流量。

1.1.2 Bittorrent

將一份數據分隔成256K大小的數據分組,並在Bittorrent 網絡中一群用戶相互協作完成這些數據的分發,用戶參與數據分發的信息已文件的形式存儲,一般可以通過
web網站獲取這些信息。但是實際數據傳輸依靠的不是 Http協議,而是由專門的P2P協議來完成,這些對於用戶都是透明的。

根據BitTorrent協議,文件發布者會根據要發布的文件生成提供一個.torrent文件,即種子文件,也簡稱為“種子" .torrent文件
本質上是文本文件,包含Tracker信息和文件信息兩部分。Tracker信息主要是BT下載中需要用到的Tracker服務器的 地址和針對
Tracker服務器的設置,文件信息是根據對目標文件的計算生成的計算結果根據BitTorrent協議內的B編碼規則進行編碼。它的主要原 理是需要把提供下載的文件虛擬分成大小相等的塊,塊大小必須為2k的整數次方(由於是虛擬分塊,硬盤上並不產生各個塊文件),並把
每個塊的索引信息和 Hash驗證碼寫入.torrent文件中;所以,.torrent文件就是被下載文件的“索引"。

下載者要下載文件內容,需要先得到相應的.torrent文件,然后使用BT客戶端軟件進行下載。

下載時,BT客戶端首先解析.torrent文件得到Tracker地址,然后連接Tracker服務器。Tracker服務器回應下載者的請求, 提供下載者其他下載
者(包括發布者)的IP。下載者再連接其他下載者,根據.torrent文件,兩者分別對方告知自己已經有的塊,然后交換對方沒有的數 據。此時不需要其他服務器參與,
分散了單個線路上的數據流量,因此減輕了服務器負擔。
下載者每得到一個塊,需要算出下載塊的Hash驗證碼與.torrent文件中的對比,如果一樣則說明塊正確,不一樣則需要重新下載這個塊。這種規定是為了解決下載內容准確性的問題

2. NAT-網絡地址轉換-IP不足-組建內網-端口映射

a). RFC1918規定了三個保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。這些地址僅可以在組織和企業內部使用。
b). NAT通常部署在一個組織的網絡出口位置,在報文離開私網進入Internet時,將源ip替換為Nat設備的ip;當請求返回NAT時,再將目的地址替換為私網的源主機地址,發回內部。
c). NAT網關為了實現雙向翻譯的功能,需要維護一張關聯表,把會話的信息保存下來

3. P2P中NAT打洞-UDP

集中服務器

打洞技術假定客戶端A和客戶端B都可以與公網內的已知集中服務器建立UDP連接,一個客戶端在集中服務器上登陸的時候,服務器記錄下該客戶端的兩對地址
二元組信息{IP地址:UDP端口},一對是該客戶端IP和端口,另一對是集中服務器記錄下的由服務器“觀察”到的該客戶端
實際與自己通信所使用的IP地址和端口號(NAT的IP和端口)。我們可以把前一對地址二元組看作是客戶端的內網IP地址和端口號,把后一對地址二元組看作是客戶端的內網IP地址
和端口號經過NAT轉換后的外網IP地址和端口號。集中服務器可以從客戶端的登陸消息中得到該客戶端的內網相關信息,還可以通過登陸消息的IP頭和UDP頭得到該
客戶端的外網相關信息。如果該客戶端不是位於NAT設備后面,那么采用上述方法得到的兩對地址二元組信息是完全相同的。

3.1 P2P客戶端位於不同的NAT設備后面

a). 客戶端A——>本地IP:10.0.0.1,本地端口:4321,外網IP:155.99.25.11,外網端口:62000
	客戶端B——>本地IP:10.1.1.3,本地端口:4321,外網IP:138.76.29.7,外網端口:31000
b). 客戶端A向服務器發送的登陸消息中,包含有客戶端A的內網地址二元組信息, 服務器記錄下來。
	無論A與B二者中的任何一方向服務器發送P2P連接請求,服務器都會將其記錄下來的上述的外網和內網地址二元組發送給A或B
c). 客戶端A/B都往對方的公網和內網地址發送UDP包。
d). A向B的外網地址發送消息的過程就是“打洞”的過程,從A的內網的角度來看應為從{10.0.0.1:4321}發往{138.76.29.7:31000},從A在其NAT設備上建立的會話來看,是從{155.99.25.11:62000}發到{138.76.29.7:31000}
e). 如果A發給B的外網地址二元組的消息包在B向A發送消息包之前到達B的NAT設備,B的NAT設備會認為A發過來的消息是未經授權的外網消息,會丟棄掉該數據包。
f). 一旦A與B都向對方的NAT設備在外網上的地址二元組發送了數據包,就打開了A與B之間的“洞”,A與B向對方的外網地址發送數據,等效為向對方的客戶端直接發送UDP數據包了。

位於不同NAT設備后的UDP打洞過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM