p2p實現原理
什么是打洞,為什么要打洞
由于Internet的快速發展 IPV4地址不夠用,不能每個主機分到一個公網IP 所以使用NAT地址轉換。
下面是我在網上找到的一副圖
一般來說都是由私網內主機(例如上圖中“電腦A-01”)主動發起連接,數據包經過NAT地址轉換后送給公網上的服務器(例如上圖中的“Server”),連接建立以后可雙向傳送數據,NAT設備允許私網內主機主動向公網內主機發送數據,但卻禁止反方向的主動傳遞,但在一些特殊的場合需要不同私網內的主機進行互聯(例如P2P軟件、網絡會議、視頻傳輸等),TCP穿越NAT的問題必須解決。
下面是NAT的幾種類型
NAT設備的類型對于TCP穿越NAT,有著十分重要的影響,根據端口映射方式,NAT可分為如下4類,前3種NAT類型可統稱為cone類型。(1)全克隆( Full Clone) : NAT把所有來自相同內部IP地址和端口的請求映射到相同的外部IP地址和端口。任何一個外部主機均可通過該映射發送IP包到該內部主機。(2)限制性克隆(Restricted Clone) : NAT把所有來自相同內部IP地址和端口的請求映射到相同的外部IP地址和端口。但是,只有當內部主機先給IP地址為X的外部主機發送IP包,該外部主機才能向該內部主機發送IP包。(3)端口限制性克隆( Port Restricted Clone) :端口限制性克隆與限制性克隆類似,只是多了端口號的限制,即只有內部主機先向IP地址為X,端口號為P的外部主機發送1個IP包,該外部主機才能夠把源端口號為P的IP包發送給該內部主機。(4)對稱式NAT ( Symmetric NAT) :這種類型的NAT與上述3種類型的不同,在于當同一內部主機使用相同的端口與不同地址的外部主機進行通信時, NAT對該內部主機的映射會有所不同。對稱式NAT不保證所有會話中的私有地址和公開IP之間綁定的一致性。相反,它為每個新的會話分配一個新的端口號。
先假設:有一個服務器S在公網上有一個IP,兩個私網分別由NAT-A和NAT-B連接到公網,NAT-A后面有一臺客戶端A,NAT-B后面有一臺客戶端B,現在,我們需要借助S將A和B建立直接的TCP連接,即由B向A打一個洞,讓A可以沿這個洞直接連接到B主機,就好像NAT-B不存在一樣。
實現過程如下:1、 S啟動兩個網絡偵聽,一個叫【主連接】偵聽,一個叫【協助打洞】的偵聽。2、 A和B分別與S的【主連接】保持聯系。3、 當A需要和B建立直接的TCP連接時,首先連接S的【協助打洞】端口,并發送協助連接申請。同時在該端口號上啟動偵聽。注意由于要在相同的網絡終端上綁定到不同的套接字上,所以必須為這些套接字設置 SO_REUSEADDR 屬性(即允許重用),否則偵聽會失敗。4、 S的【協助打洞】連接收到A的申請后通過【主連接】通知B,并將A經過NAT-A轉換后的公網IP地址和端口等信息告訴B。5、 B收到S的連接通知后首先與S的【協助打洞】端口連接,隨便發送一些數據后立即斷開,這樣做的目的是讓S能知道B經過NAT-B轉換后的公網IP和端口號。6、 B嘗試與A的經過NAT-A轉換后的公網IP地址和端口進行connect,根據不同的路由器會有不同的結果,有些路由器在這個操作就能建立連接,大多數路由器對于不請自到的SYN請求包直接丟棄而導致connect失敗,但NAT-A會紀錄此次連接的源地址和端口號,為接下來真正的連接做好了準備,這就是所謂的打洞,即B向A打了一個洞,下次A就能直接連接到B剛才使用的端口號了。7、 客戶端B打洞的同時在相同的端口上啟動偵聽。B在一切準備就緒以后通過與S的【主連接】回復消息“我已經準備好”,S在收到以后將B經過NAT-B轉換后的公網IP和端口號告訴給A。8、 A收到S回復的B的公網IP和端口號等信息以后,開始連接到B公網IP和端口號,由于在步驟6中B曾經嘗試連接過A的公網IP地址和端口,NAT-A紀錄了此次連接的信息,所以當A主動連接B時,NAT-B會認為是合法的SYN數據,并允許通過,從而直接的TCP連接建立起來了。
-
P2P
+關注
關注
0文章
152瀏覽量
26792 -
NAT
+關注
關注
0文章
146瀏覽量
16278
原文標題:p2p實現原理及打洞技術介紹
文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論