P2P網絡概念的背景和基礎認識

P2P網絡概念的背景和基礎認知

前言:

“2011年2月3日,IANA對外宣佈IPv4地址空間最後5個地址塊已經被分配給下屬的5個地區委員會。”

“2011年4月15日,亞太區委員會APNIC對外宣佈,除了個別保留地址外,本區域所有的IPv4地址基本耗盡。”

現2017已經過去大半年,離2011已有6年多,雖然IPv4的地址已經耗盡,但也並未影響我們一直沿用IPv4直到現在。
IPv6推出至今,也並未受到廣泛應用,這是受制於NAT(Network Address Translation),我們還能繼續使用IPv4也得益於NAT。
知乎中的某條評論<吳建平反思國內IPv6發展:爲何“起了個大早,趕了個晚集”>
爲什麼說是受制於NAT又得益於NAT?

0x01 NAT的起源

NAT英文全名爲Network Address Translation,顧名思義,網絡地址轉換,早在上世紀就已提出了NAT的概念。NAT作爲解決IPv4地址不夠用的主要方式,還得了解IPv4的發展歷程。

IPv4採用32位的整數來表示一個IP地址,誕生初期,按理論計算,可以分配的IP地址達42億之多。這樣的IP數量級在當時的網絡環境下,是不可能一下子使用完的,所以,IANA當時對企業、組織、教育機構的IP分配也並沒有得到真正的利用,導致IP地址浪費嚴重,不過這也不能怪IANA,現在對結果進行分析都是馬後炮。歷史給了我們驚喜,互聯網的發展呈指數性的爆炸增長。除了過早的浪費很多地址,爲了路由和方便管理,地址還分爲了ABC類和保留地址,但這樣的分配也並非不合理。

A類地址 :0******* -------- -------- --------    126個網絡,每個網絡可以有16,777,214個主機

B類地址 :10****** -------- -------- --------    16,384個網絡,每個網絡可以有65,534個主機

C類地址 :110***** -------- -------- --------    2,097,152個網絡,每個網絡可以有254個主機。

保留地址:1110**** -------- -------- --------    當計算機獲取IP失敗時,默認使用的地址

在80年代初IPv4被詳細定下來,到90年代初NAT的出現也只經歷了10多年的時間,在90年代初,爲了替代新的IPv4,96年提出了IPv6,但是要普及IPv6需要更換許多沿用IPv4的設備,包括教育、軍工等設施,這些都是極其龐大的工程,並不是簡單的協議替換而已,並沒有一個平滑的過度方式可以讓互聯網用戶在無感知的情況下將IPv4取代,上面我們不是說了還有保留地址嗎,對,NAT就催生了。

因爲有了保留地址,所以大型企業中,會採用與廣域網相隔離的局域網中使用保留的IPv4地址進行局域網通信,在局域網中只需要一臺設備與互聯網相連,那其它設備就可以通過這一臺設備作爲入/出口(網關),而廣域網中的設備只有廣域網的IP地址才能進行通信,所以,這臺作爲在局域網內的所有設備,在出口的時候,源地址都會被改寫爲網關所被分配的廣域網IP地址,這就是NAT(Network Address Translation)– 網絡地址轉換。在同一個局域網中,與廣域網的通信過程都共用一個廣域網IP地址。

同時,NAT還能保護局域網內的主機不被發現,即安全,又解決了IPv4地址不夠用的問題,所以一直沿用至今,甚至讓我們忘了IPv4地址池已經用光的這樣一個事實。換過來再說,對IPv4、NAT依賴越多,如果沒有一個很平滑的過渡,IPv6也就越難以普及。

0x02 NAT轉換到P2P通信

上面提到了,通過NAT網絡地址轉換過後,我們通過局域網訪問外網的時候,別人是看不到我們的局域網IP地址的,他們只能看到我們局域網共用的出口那個IP地址。

假如現在有這麼一條通信隧道:

/** host1 -->> host2 **/    

host1:port  =  192.168.1.101:1111                           // 主機1的地址,在局域網中
getway:port =  192.168.1.1:60001 / 88.88.88.88:60001        // 網關地址

host2:port  =  99.99.99.99:2222                             // 主機2的地址,在廣域網中

常規TCP通信中,host2主機開啓監聽2222端口,那麼廣域網中就能直接找到IP地址爲99.99.99.99的主機,並且可以往這臺主機的2222號端口塞數據進去。
在上述的例子中,host1與host2建立通信,首先由host1發起通信請求,請求訪問host2主機的2222端口的流程,先找到本局域網的公網IP共用的主機192.168.1.1,即網關,把要發送的數據發給他,網關對數據包進行拆解,讀到目的地址是99.99.99.99,需要將數據塞到目的地址的2222號端口,OK了,這樣就完成了一次單向通信。在網關拆解數據包的時候,還會對數據包進行改寫,會把源地址改寫成自己的IP地址,並且開放一個新的端口號60001,告訴遠端主機,“如果你要回復,那就往88.88.88.88這個地址的60001號端口給我塞回來。”這樣就通過NAT建立了一個局域網與廣域網之間的雙向通信隧道。

這就存在了一些問題,在我和別人沒有建立通信,別人需要主動訪問我的時候,是無法訪問的。
就是說,如果host1主機沒有主動向host2主機發送數據,那麼88.88.88.88網關就不會開放一個新的端口號,用於對應給host1主機的1111端口轉發外部傳遞進來的數據。99.99.99.99也不知道該向目標的哪一個入口(端口)發送數據纔會傳遞到host1主機,因爲根本沒有建立這個隧道。

既然可以從內部向外部建立通信隧道,我們又爲什麼非得需要從外部向裏面建立呢?

舉個例子,在實際應用中,假如我想搭建一個FTP服務共享我自己的文件訪問,但是我又不想租服務器,而且同時我自己沒有公網IP,或者我有公網IP,但不希望我自己的主機暴露在公網中,那麼這個時候就需要別人通過外部向內部訪問才能訪問到我的FTP服務。這只是一個簡單的例子,生活中有更多且比這個例子更需要用到地方。

在上面例子裏,從外部向內部訪問的主機,可能也是處於另一個局域網中,而不論它是否處於局域網中,它與我搭建在局域網內的FTP主機進行通信都可以稱之爲是P2P(peer-to-peer)通信,即對等網絡通信。

0x03 小結

本來想寫三個小結,來介紹P2P,分別介紹一下背景知識、NAT和P2P,感覺第二點好像也簡單的把p2p和nat都一起講了,整理了一個簡單的大綱,計劃之後還要至少再寫兩篇介紹並實現一個自己的P2P程序,此篇開篇都是理論,之後的可能更偏技術一些。懶人,懶更。

大綱:

《2、NAT工作原理以及P2P實現機制》

0x01 TCP/IP通信過程

0x02 NAT的原理

0x03 什麼是NAT打洞

0x04 P2P的實現機制

0x05 P2P中可實現的可能性分析

0x06 小結

《3、NAT打洞的C/C++程序實現》

0x01 建立常規網絡通信

0x02 打一個洞

0x03 通過“洞”建立通信隧道

0x04 小結


歡迎關注我的公衆號

iamwangsansan

如果你懶得掃,其實,我…完全不在意


活着不是爲了滿足自己的虛榮心

世上還存在很多有趣的東西

如果你已不能夠支撐你自己去挖掘你的興趣

希望你也不會被現實打敗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章