音視頻學(xué)習(xí)筆記 - WebRTC NAT穿越過程

音視頻學(xué)習(xí)筆記 - WebRTC NAT穿越過程

1. Candidate

它表示W(wǎng)ebRTC與遠端通信時使用的協(xié)議, IP地址和端口, 一般由以下字段組成:

  • 本地IP地址
  • 本地端口號
  • 候選者類型, host, srflx和relay
  • 優(yōu)先級
  • 傳輸協(xié)議
  • 訪問服務(wù)的用戶名
  • ......

如:

{
  IP: xxx.xxx.xxx.xxx,
  port: number,
  type: host/srflx/relay,
  priority: number,
  protocol: UDP/TCP,
  usernameFragment: string
  ...
}

其中, host表示本地主機候選者, srflx表示內(nèi)網(wǎng)主機映射的外網(wǎng)地址和端口號, relay表示中繼候選者.

WebRTC會按照上面描述的格式對候選者進行排序, 然后按優(yōu)先級從高到低的順序進行連通性測試, 當(dāng)連通性測試成功后, 通信雙方就建立起了連接.

2. STUN協(xié)議

通過STUN協(xié)議, 主機可以獲取到自己的外網(wǎng)IP地址和端口號.

目前比較流行的STUN服務(wù)器是CoTURN.

3. TURN協(xié)議

relay類型候選者也是通過STUN協(xié)議完成的, 只不過它使用的STUN消息類型與獲取srflx型候選者的STUN消息的類型不一樣. RFC5766的STUN協(xié)議描述了如何獲取relay服務(wù)器的Candidate過程.

4. NAT打洞 / P2P穿越

如果兩臺主機不在同一內(nèi)網(wǎng), WebRTC將嘗試NAT打洞. WebRTC將NAT分為完全錐型, IP限制型, 端口限制型, 對稱型.

假設(shè)內(nèi)網(wǎng)主機X的地址表示為xip:xport, NAT外網(wǎng)映射地址表示為nip:nport, 公網(wǎng)主機A,B,C的地址表示為aip:aport, bip:bport, cip:cport....

4.1 完全錐型NAT

8836f91edfcc9a2420e3fd11098f95af

對于輸出端, 即內(nèi)外主機X向外網(wǎng)主機發(fā)送的數(shù)據(jù), 它們的源地址xip:xport, 都會被映射為"洞"的地址nip:nport.

對于輸入端, 即外網(wǎng)主機A, B, C..., 向"洞" nip:nport發(fā)送的數(shù)據(jù)都會被轉(zhuǎn)發(fā)到主機X.

4.2 IP限制錐型NAT

6358816cf33831f22338cb26016d028a

對于輸出端, 同完全錐型NAT.

對于輸入端, 只有X向特定外部主機發(fā)送過數(shù)據(jù), 該特定外部主機從任意端口發(fā)送到 nip:nport的數(shù)據(jù), 都會被轉(zhuǎn)發(fā)到X, 如上圖, X向B發(fā)送過數(shù)據(jù), B主機的任意端口向nip:nport發(fā)送的數(shù)據(jù), 才會被轉(zhuǎn)發(fā)到X.

4.3 端口限制錐型

d6490bff17fdad51271266cef074920b

對于輸出端, 同完全錐型NAT.

對于輸入端, 在IP限制錐型的基礎(chǔ)上, 添加了端口限制; 即只有X向特定外部主機的特定端口發(fā)送過數(shù)據(jù), 該特定主機的特定端口向nip:nport發(fā)送的數(shù)據(jù), 才會被轉(zhuǎn)發(fā)到X.

4.4 對稱型NAT

a80a2b1c98b8becce0c99e979fa3ba7c

對于輸出端, X發(fā)出的每一條連接的數(shù)據(jù), 都會在NAT上產(chǎn)生一條映射關(guān)系, NAT網(wǎng)關(guān)會把內(nèi)部主機地址端口對(如:xip:xport)和外部主機地址端口對(如:aip:aport)完全相同的報文看做一個連接, 如主機X向主機A的a端口發(fā)數(shù)據(jù)時在NAT上產(chǎn)生的映射關(guān)系R1與向主機A的b端口發(fā)送的數(shù)據(jù), 產(chǎn)生的映射關(guān)系R2是不同的, 每個不同的四元組(源ip:port, 目的ip:port), 在NAT上都是一個新的"洞".

對于輸入端, 同端口限制錐型.

NAT的類型檢測

  1. 判斷是否有NAT防護

    1. 主機向服務(wù)器#1的某個IP和端口發(fā)送一個請求, 服務(wù)器#1收到請求后, 會通過同樣的IP和端口返回一個響應(yīng)消息.

    2. 如果主機收不到服務(wù)器#1返回的消息, 說明用戶的網(wǎng)絡(luò)限制了UDP協(xié)議, 直接退出.

    3. 如果能收到包, 則判斷返回的主機的外網(wǎng)IP地址是否與主機自身的IP地址一樣, 如果一樣, 說明主機是一臺擁有公網(wǎng)地址的主機, 如果不一樣, 跳到第六步.

    4. 如果主機擁有公網(wǎng)IP, 則還需要進一步判斷其防火墻類型, 所以它會再向服務(wù)器#1發(fā)一次請求, 此時, 服務(wù)器#1從另外一個網(wǎng)卡的IP和不同端口返回響應(yīng)消息.

    5. 如果主機能收到, 說明它是一臺沒有防護的公網(wǎng)主機; 如果收不到, 說明有對稱型的防火墻保護.

    6. 如果返回的外網(wǎng)IP地址與主機IP不一致, 說明主機處于NAT防護下, 此時需要對主機的NAT防護類型做進一步探測.

  2. 探測NAT環(huán)境

    1. 在NAT環(huán)境下, 主機向服務(wù)器#1發(fā)送請求, 服務(wù)器#1通過另外一個網(wǎng)卡的IP和不同端口給主機返回響應(yīng)消息.
    2. 如果此時主機可以收到響應(yīng)消息, 說明它是在完全錐型NAT下, 如果收不到消息, 需要做進一步判斷.
    3. 如果主機收不到消息, 它向服務(wù)器#2發(fā)請求, 服務(wù)器#2使用收到請求的IP地址和端口向主機返回消息.
    4. 主機收到消息后, 判斷從服務(wù)器#2獲取的外網(wǎng)IP和端口與之前從服務(wù)器#1獲取的外網(wǎng)IP和端口是否一致, 如果不一致, 說明該主機是在對稱型NAT下.
    5. 如果IP地址一樣, 則再次發(fā)送請求, 此時主機向服務(wù)器#1發(fā)請求, 服務(wù)器#1使用同樣的IP和不同的端口返回消息.
    6. 此時, 如果主機可以收到響應(yīng)消息, 說明是IP限制型NAT, 否則是端口限制型NAT.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容