NTA打洞
只有一方處于NAT設備后
此種情況是所有P2P場景中最簡單的,它使用一種被稱為“反向鏈接技術”來解決這個問題。大致的原理如下所述。
如圖所示,客戶端A位于NAT之后,它通過TCP端口1234連接到服務器的TCP端口1235上,NAT設備為這個連接重新分配了TCP端口62000。客戶端B也通過TCP端口1234連接到服務器端口1235上。A和B從服務器處獲知的對方的外網地址二元組{IP地址:端口號}分別為{138.76.29.7:1234}和{155.99.25.11:62000},它們在各自的本地端口上進行偵聽。
由于B 擁有外網IP地址,所以A要發起與B的通信,可以直接通過TCP連接到B。但如果B嘗試通過TCP連接到A進行P2P通信,則會失敗,原因是A位于NAT設備后,雖然B發出的TCP SYN請求能夠到達NAT設備的端口62000,但NAT設備會拒絕這個連接請求。要想與Client A通信, B不是直接向A發起連接,而是通過服務器給A轉發一個連接請求,反過來請求A連接到B(即進行反向鏈接),A在收到從服務器轉發過來的請求以后,會主動向B發起一個TCP的連接請求,這樣在NAT設備上就會建立起關于這個連接的相關表項,使A和B之間能夠正常通信,從而建立起它們之間的TCP連接。
雙方都處于NAT后設備后
NAT設備部署情況
兩客戶端都處于NAT設備背后也有很多情況,如: 1,都處在同一NAT設備后. 2,隨直連的不是同一個NAT設備,中間有很多NAT轉接,但頂端接入公網ip的NAT(網絡服務商的路由)是同一個.
像第一種情況,就是在同一個以太網中,這種可以直接使用內網ip進行直連最優. 但是想第二種情況,因為嵌套在不同的內網中,都使用的保留ip地址,或許會存在與客戶端本身所在的內網地址重復的可能性,所以還是以外網ip+端口來進行打洞最為穩妥.
因為有Hairpin技術,它可以讓兩臺位于同一臺NAT網關后面的主機,通過對方的公網端口互相訪問.
ICE
ICE的全稱Interactive Connectivity Establishment(互動式連接建立),由IETF的MMUSIC工作組開發出來的,它所提供的是一種框架,使各種NAT穿透技術可以實現統一。ICE跟STUN和TURN不一樣,ICE不是一種協議,而是一個框架(Framework),它整合了STUN和TURN。
TURN
TURN(Traversal Using Relays around NAT)TURN與STUN的共同點都是通過修改應用層中的私網地址達到NAT穿透的效果,異同點是TURN是通過兩方通訊的“中間人”方式實現穿透
TURN服務器相比較STUN服務器,多了中繼的功能,對于無法端對端的服務器,可以進包轉發
STUN
STUN服務器(Simple Traversal of User Datagram Protocol Through Network Address Translators)是一個輕量級協議,是基于UDP的完整的穿透NAT的解決方案.在進行NAT穿透時我們需要STUN服務器.
STUN服務器主要做了兩件事:
1, 判斷客戶端的NAT類型(NAT分四種類型) 2, 接受客戶端的請求,返回其需要連接的外網地址 3, 協調客戶端間打洞
具體實現
是否處于NAT后(作為iOS肯定是在NAT后的,不用判斷的)
客戶端向STUN服務器發送UDP包,STUN將收到的包的IP包在UDP包中進行返回,客戶端收到包后和自己的IP做比較,不一樣則處在NAT后.
判斷NAT類型
當處在NAT后則要判斷NAT類型,為了判斷STUN服務器需要兩個ip,ip1和ip2.
客戶端當得知自己處在NAT設備后時,再向服務端ip1發送判斷請求.
1, FULL Cone NAT
服務器收到后從ip2向客戶端的公網ip發送包,若客戶端能收到,則為 完全雛形NAT.
2, 判斷是否為 對稱NAT
客戶端再從不同的port 想服務端發包,若客戶端收到的外網端口(此處的端口號是指NAT表中ip后對應的端口號,而不是主機為外網服務的端口號)不一致,則為對稱NAT,一致則不為對稱NAT
3, Restrict Cone NAT /Port Restrict NAT
服務端從ip1的不同端口向客戶端發包,若客戶端收到 則為Restrict Cone NAT,收不到則為 Port RestrictNAT.
協調打洞
1, Full Cone NAT
此時什么都不需要STUN做,只要知道對方公網ip+端口號 客戶端間可以直接通訊
2, Restrict Cone 或 Port Restrict
此時需要TURN服務器協調兩客戶端互相向對方公網ip發包, 因為在NAT設備看起來,互相發包都是在向公網發包,這時在NAT表上就會開啟對指定外網ip+端口號的通道.這樣就完成了打洞
3, 對稱NAT
對于對稱NAT是無法打洞的,因為客戶端向STUN服務器發包的外網ip+端口號 與向其他客戶端發包的外網ip+端口號是不一樣的.所以無法溝通,這時就需要TURN服務器,兩個客戶端都對其進行長連接,進行包的轉發.
參考鏈接
http://www.52im.net/thread-542-1-1.html http://www.52im.net/thread-557-1-1.html http://www.h3c.com.cn/MiniSite/Technology_Circle/Net_Reptile/The_Five/Home/Catalog/201206/747038_97665_0.htm
總結
- 上一篇: 快速排序算法QuickSort(二)
- 下一篇: 配置IP