1. 程式人生 > >P2P技術簡介

P2P技術簡介

image clas 中間 我們 bit ping ebr restrict 存在

P2P技術簡介

NAT( Network Address Translation)穿越(俗稱打洞)技術

前言:

p2p已經存在於我們生活的方方面面;我們通過下載在工具(比如迅雷,bitorent,各種網盤)下載,觀看live視頻(ppstream,pplive)都在使用p2p,有些im也是通過p2p來傳遞消息的;我們知道使用p2p技術的下載工具下載更快,使用p2p的live視頻更流暢,而且同時使用的人越多效果越好,因為他是可能從我們“鄰居”那裏獲取數據。

那麽p2p到底是個什麽樣的東西呢。暫且我麽可以這樣理解為:他是通過NAT穿越來建立的一種網絡鏈接,實現了私有網絡對私有網絡(peer to peer)的互通。既然p2p鏈接是通過NAT穿越來建立,那麽NAT穿越又是怎麽回事呢?且看下文分解。

一、NAT 簡介

  • 為了解決ipv4地址的緊缺(約為43億)問題而出現了NAT
  • NAT將網絡劃分為內部網絡和外部網絡
    • 內部網絡使用私有ip地址
    • 私有地址段包括以下三個:
    • 10.0.0.0-10.255.255.255; 172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255
    • 私有地址段,僅能在內部使用,不能作為全球路由地址
    • 內網所有主機共用一個外網地址
    • 內網中的主機通過將地址轉換為外網地址才可以訪問外網

二、NAT的特點

  1. 網絡被分為私網和公網兩個部分,NAT網關設置在私網到公網的路由出口位置,雙向流量必須都要經過NAT網關;
  2. 網絡訪問只能先由私網側發起,公網側無法主動訪問私網主機
  3. NAT網關在兩個訪問方向上完成兩次地址的轉換或翻譯,出方向做源地址替換,入方向做目的地址替換;
  4. NAT網關的存在對通信雙方是保持透明的;
  5. NAT網關為了實現雙向翻譯的功能,需要維護一張關聯表,把會話的信息保存下來。

在這裏第二條是重點,正是因為NAT規定了“網絡訪問只能先由私網側發起,公網側無法主動訪問私網主機”,才引出了我們的主題:NAT穿越,我們就是要通過NAT穿越來實現“公網側主動訪問私網主機”。

三、地址轉換表的建立與刪除

  • NAT中內外網地址轉換表的形式如下:

(內網)ip:port <----->(外網)ipw:portw
…… <-----> ……

  • 建立:內網的ip:port首次訪問外網時,建立映射關系

Udp:使用sendto發出第一個包時,建立映射關系
Tcp:發生在connect過程中(三次握手的第一個包(syn)發出時)

  • 刪除:

Udp鏈接長時間靜默時,刪除映射關系
Tcp鏈接還會通過監測其關閉事件(FIN)來刪除映射關系

四、NAT的類型
錐型:
地址轉換關系的建立條件:首次訪問外網的時候
錐型NAT按照地址轉換關系可被使用的條件可細分三種:
完全錐型(full cone)
地址轉換關系,可以被任意外網地址(ip:port)使用
受限錐型(restrict cone)
地址轉換關系,只可以被特定外網ip使用,(之前向此ip發送數據)
端口受限錐型(port restrict cone)
地址轉換關系,只可以被特定外網ip:port使用,(之前向此ip:port發送數據)
對稱型:
地址轉換關系的建立條件:首次訪問外網的時候, 或者再次訪問不同的外網地址(ip:port)時

下面,通過一張圖來再次分析一下各種NAT類型

技術分享

在這張圖中左側是內網 右側是外網,中間一個NAT,NAT中有一個地址轉換表,地址轉換表的左側是內網地址,右側是對應的外網地址

完全錐形的地址轉換關系,可以被任何的外網地址W(x,y)使用,這裏W(x,y)只要知道W(u,v),只有就可以通過這個地址內網的L(a,b)發送數據

受限錐形的地址轉換關系,增加了一個可以被使用的條件,就是特的ip,在這裏只有ip為1,還有ip為2的外網地址使用,可以通過W(u,v)向內網L(a,b)發送數據

端口受限錐形的地址轉換關系,可以被使用的條件更加嚴格,就是特定的ip:port,在這裏只有ip和port都滿足這個條件的外網W(1:1),W(2:2)才可以通過W(u:v)向內網L(a,b)發送數據

對稱型的地址轉換關系更加嚴格,它的地址轉換關系和目的外網地址一一對應,為訪問W(1:1)建立的轉換關系,只可以用來與外網W(1:1)通信,為訪問W(2:2)建立的地址轉換關系,只用來與外網W(2:2)通信,這就是為什麽對稱型NAT不能穿越的原因


五、如何穿越各種NAT

  • 完全錐型

穿越者僅需要知道被穿越者的公網地址(ip:port),就可以通過此公網地址實現穿越

  • 受限錐型

被穿越者必須向穿越者公網ip發送數據,穿越者才能通過被穿越者的公網地址實現穿越

  • 端口受限錐型

被穿越者必須向穿越者公網ip:port發送數據,穿越者才能通過被穿越者的公網地址實現穿越

  • 對稱型

目前沒有較好的辦法實現穿越,但是可以通過中繼的方式實現數據中轉

一招就夠了

  1. 雙方同時向對方的公網地址發送試探數據
  2. 如果對方是受限型或者端口受限型NAT,此試探數據丟失
  3. 雙發再次向對方的公網地址發送試探數據,
  4. 如果排除網絡丟包,此時三種錐型NAT均已穿越成功

打洞相關協議

STUN: Session Traversal Utilities for NAT (STUN)
https://tools.ietf.org/html/rfc5389

TURN: Traversal Using Relays around NAT (TURN)
https://tools.ietf.org/html/rfc5766

ICE: Interactive Connectivity Establishment (ICE)
https://tools.ietf.org/html/rfc5245


開源實現(client)

- libjingle 由google公司開發, 現在已經被合入了webrtc項目
- pjnath http://www.pjsip.org/pjnath/docs/html/
- libnice https://nice.freedesktop.org/wiki/ 被用於janus-gateway
- libre http://www.creytiv.com/re.html

開源實現(server)

rfc5766-turn-server webrtc推薦使用的
https://github.com/coturn/rfc5766-turn-server

Coturn rfc5766-turn-server 的新版本
https://github.com/coturn/coturn

P2P技術簡介