P2P技術簡介
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的特點
- 網絡被分為私網和公網兩個部分,NAT網關設置在私網到公網的路由出口位置,雙向流量必須都要經過NAT網關;
- 網絡訪問只能先由私網側發起,公網側無法主動訪問私網主機
- NAT網關在兩個訪問方向上完成兩次地址的轉換或翻譯,出方向做源地址替換,入方向做目的地址替換;
- NAT網關的存在對通信雙方是保持透明的;
- 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發送數據,穿越者才能通過被穿越者的公網地址實現穿越
- 對稱型
目前沒有較好的辦法實現穿越,但是可以通過中繼的方式實現數據中轉
一招就夠了
- 雙方同時向對方的公網地址發送試探數據
- 如果對方是受限型或者端口受限型NAT,此試探數據丟失
- 雙發再次向對方的公網地址發送試探數據,
- 如果排除網絡丟包,此時三種錐型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技術簡介