日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

穿透NAT类型以及STUN、TURN简单介绍

發(fā)布時間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 穿透NAT类型以及STUN、TURN简单介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

穿透NAT類型以及STUN、TURN簡單介紹

      • 概述
      • NAT的副作用以及解決方案
      • NAT有4種不同的類型
      • 錐形和對稱形NAT的區(qū)別
      • STUN和TURN的簡單介紹
        • STUN
            • 基本思想
          • STUN Server主要做了兩件事:
        • TURN Server
          • TURN Server也主要做了兩件事:
      • 三種轉(zhuǎn)發(fā)情形
      • 各種網(wǎng)絡(luò)環(huán)境下的P2P通信解決方法:

概述

NAT英文全稱是“Network Address Translation”,中文意思是“網(wǎng)絡(luò)地址轉(zhuǎn)換”,它是一個IETF(Internet Engineering Task Force, Internet工程任務(wù)組)標準,允許一個整體機構(gòu)以一個公用IP(Internet Protocol)地址出現(xiàn)在Internet上。顧名思義,它是一種把內(nèi)部私有網(wǎng)絡(luò)地址(IP地址)翻譯成合法網(wǎng)絡(luò)IP地址的技術(shù)。NAT 可以讓那些使用私有地址的內(nèi)部網(wǎng)絡(luò)連接到Internet或其它IP網(wǎng)絡(luò)上,這個過程對用戶來說是透明的。NAT路由器在將內(nèi)部網(wǎng)絡(luò)的數(shù)據(jù)包發(fā)送到公用網(wǎng)絡(luò)時,在IP包的報頭把私有地址轉(zhuǎn)換成合法的IP地址。因此我們可以認為,NAT在一定程度上能夠有效的解決公網(wǎng)地址不足的問題。

NAT的副作用以及解決方案

國內(nèi)移動無線網(wǎng)絡(luò)運營商在鏈路上一段時間內(nèi)沒有數(shù)據(jù)通訊后, 會淘汰NAT表中的對應(yīng)項, 造成鏈路中斷。

這是NAT帶來的第一個副作用——NAT超時:

而國內(nèi)的運營商一般NAT超時的時間為5分鐘,所以通常我們TCP長連接的心跳設(shè)置的時間間隔為3-5分鐘。

而第二個副作用就是——NAT墻。

NAT會有一個機制,所有外界對內(nèi)網(wǎng)的請求,到達NAT的時候,都會被NAT所丟棄,這樣如果我們處于一個NAT設(shè)備后面,我們將無法得到任何外界的數(shù)據(jù)。

但是這種機制有一個解決方案:就是如果我們A主動往B發(fā)送一條信息,這樣A就在自己的NAT上打了一個通往B的洞。這樣A的這條消息到達B的NAT的時候,雖然被丟掉了,但是如果B這個時候在給A發(fā)信息,到達A的NAT的時候,就可以從A之前打的那個洞中,發(fā)送給到A手上了。

NAT有4種不同的類型

  • 完全透明NAT(Full Cone NAT)

這種NAT內(nèi)部的機器A連接過外網(wǎng)機器C后,NAT會打開一個端口.然后外網(wǎng)的任何發(fā)到這個打開的端口的UDP數(shù)據(jù)報都可以到達A,不管是不是C發(fā)過來的(很少是這種類型)。
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88
A(192.168.8.100:5000) —— > NAT(202.100.100.100:8000) —— > C(292.88.88.88:2000)
任何發(fā)送到 NAT(202.100.100.100:8000)的數(shù)據(jù)都可以到達A(192.168.8.100:5000)

  • 受限NAT(Restricted Cone)

這種NAT內(nèi)部的機器A連接過外網(wǎng)的機器C后,NAT打開一個端口.然后C可以用任何端口和A通信.其他的外網(wǎng)機器不行。
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88

A(192.168.8.100:5000)—— >NAT(202.100.100.100 : 8000) —— > C(292.88.88.88:2000)
任何從C發(fā)送到 NAT(202.100.100.100:8000)的數(shù)據(jù)都可以到達A(192.168.8.100:5000)

  • 端口受限NAT(Port Restricted Cone)

這種NAT內(nèi)部的機器A連接過外網(wǎng)的機器C后,NAT打開一個端口.然后C可以用原來的端口和A通信.其他的外網(wǎng)機器不行。
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88

A(192.168.8.100:5000) —— > NAT(202.100.100.100 : 8000)—— > C(292.88.88.88:2000)
C(202.88.88.88:2000)發(fā)送到 NAT(202.100.100.100:8000)的數(shù)據(jù)都可以到達A(192.168.8.100:5000)

以上三種NAT通稱Cone NAT(圓錐形NAT),所謂錐形NAT 是指:只要是從同一個內(nèi)部地址和端口出來的包,無論目的地址是否相同,NAT 都將它轉(zhuǎn)換成同一個外部地址和端口?!巴粋€外部地址和端口”與“無論目的地址是否相同”形成了一個類似錐形的網(wǎng)絡(luò)結(jié)構(gòu),也是這一名稱的由來。反過來,不滿足這一條件的即為對稱NAT 。

我們只能用這種NAT進行UDP打洞。

  • Symmetric(對稱形)

對于這種NAT。連接不同的外部Server,NAT打開的端口會變化。也就是內(nèi)部機器A連接外網(wǎng)機器B時,NAT會打開一個端口,連接外網(wǎng)機器C時又會打開另外一個端口。

Symmetric NAT會遵循兩個原則:

  • 盡量不去修改源端口,也就是說,ip 偽裝后的源端口盡可能保持不變。
  • 更為重要的是,ip 偽裝后必須 保證偽裝后的源地址/ 端口與目標地址/ 端口(即所謂的socket )唯一。
    假設(shè)如下的情況( 內(nèi)網(wǎng)有主機 A 和 D ,公網(wǎng)有主機 B 和 C ):
  • 先后建立如下三條連接:

    A ( 1000 ) —— > NAT ( 1000 )—— > B ( 2000 )
    D ( 1000 ) —— > NAT ( 1000 )—— > C ( 2000 )
    A ( 1000 ) —— > NAT ( 1001 )—— > C ( 2000 )

    可以看到,前兩條連接遵循了原則 1 ,并且不違背原則 2,而第三條連接為了避免與第二條產(chǎn)生相同的 socket 而改變了源端口。比較第一和第三條連接,同樣來自 A(1000) 的數(shù)據(jù)包在經(jīng)過 NAT 后源端口分別變?yōu)榱?1000 和1001 。說明 Linux 的 NAT 是對稱 NAT 。

    錐形和對稱形NAT的區(qū)別

    • 如果是錐形 NAT :

    那么成功連接后,狀態(tài)必然如下:

    A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )

    A ( 1000 ) —— > NAT ( 5001 )—— > C ( 3000 )

    也就是說,只要是從 A 主機的 1000 端口發(fā)出的包,經(jīng)過地址轉(zhuǎn)換后的源端口一定相同。

    • 如果是對稱形 NAT :

    連接后,狀態(tài)有可能(注意是可能,不是一定)如下:

    A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )

    A ( 1000 ) —— > NAT ( 5002 )—— > C ( 3000 )

    兩者的區(qū)別顯而易見。

    STUN和TURN的簡單介紹

    STUN

    STUN(Simple Traversal of UDP over NATs,NAT 的UDP簡單穿越)是一種網(wǎng)絡(luò)協(xié)議,它允許位于NAT(或多重NAT)后的客戶端找出自己的公網(wǎng)地址,查出自己位于哪種類型的NAT之后以及NAT為某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處于NAT 路由器之后的主機之間建立UDP通信。該協(xié)議由RFC 3489定義。

    STUN,是為了實現(xiàn)透明的穿透NAT,而定義的一套協(xié)議。它使本地的內(nèi)網(wǎng)的機器,具有取得,能夠得知它的NAT網(wǎng)關(guān)的IP,NAT類型的能力。

    基本思想

    在私網(wǎng)內(nèi)部安裝一個STUN client,在公網(wǎng)上安裝一個STUN Server,STUN協(xié)議定義了一些消息格式,大體上分成Request/Response,client向server發(fā)送 request,server發(fā)送response給client。如何檢測STUN client是否在NAT后面呢?原理很簡單,Server在收到client的UDP包以后,Server將接收到該包的地址和端口利用udp傳回來給 client,client把這些地址和端口與本機的ip地址和端口進行比較,如果不同,說明在NAT后面,否則就位于NAT前面。為了檢測不同類型的 NAT,STUN協(xié)議定義了一些消息屬性,要求Server有不同的動作,比如發(fā)送響應(yīng)的時候使用不同的IP地址和端口,或者改變端口等等。STUN協(xié)議 對NAT可能有效,但是對防火墻就無能為力了,因為防火墻可能不會打開UDP端口。

    STUN Server主要做了兩件事:
    • 接受客戶端的請求,并且把客戶端的公網(wǎng)IP、Port封裝到ICE Candidate中。
    • 通過一個復(fù)雜的機制,得到客戶端的NAT類型。

    TURN Server

    TURN(Traversal Using Relay NAT),TURN是STUN協(xié)議的擴展,在實際應(yīng)用中他也可以充當(dāng)STUN的角色;如果一個位于NAT后面的設(shè)備想要和另外一個位于NAT后面的設(shè)備建立通信,當(dāng)采用UDP打洞技術(shù)不能改實現(xiàn)的時候就必須要一臺中間服務(wù)器扮演數(shù)據(jù)包轉(zhuǎn)發(fā)的角色,這臺TURN服務(wù)器需要擁有公網(wǎng)的IP地址

    TURN Server也主要做了兩件事:
    • 為NAT打洞:
      如果A和B要互相通信,那么TURN Server,會命令A(yù)和B互相發(fā)一條信息,這樣各自的NAT就留下了對方的洞,下次他們就可以之間進行通信了。

    • 為對稱NAT提供消息轉(zhuǎn)發(fā):
      當(dāng)A或者B其中一方是對稱NAT時,那么給這一方發(fā)信息,就只能通過TURN Server來轉(zhuǎn)發(fā)了。

    三種轉(zhuǎn)發(fā)情形

    STUN Server判斷出客戶端處于什么類型的NAT下,然后去做后續(xù)的處理,STUN Server會返回給客戶端它的公網(wǎng)IP、Port和NAT類型,除此之外:

    • 如果A處于公網(wǎng)或者Full Cone Nat下,STUN不做其他的了,因為其他客戶端可以直接和A進行通信。

    • 如果A處于Restrict Cone或者Port Restrict NAT下,STUN還會協(xié)調(diào)TURN進行NAT打洞。

    • 如果A處于對稱NAT下,那么點對點連接下,NAT是無法進行打洞的。所以為了通信,只能采取最后的手段了,就是轉(zhuǎn)成C/S架構(gòu)了,STUN會協(xié)調(diào)TURN進行消息轉(zhuǎn)發(fā)。

    各種網(wǎng)絡(luò)環(huán)境下的P2P通信解決方法:

  • 如果通信雙方在同一個局域網(wǎng)內(nèi),這種情況下可以不借助任何外力直接通過內(nèi)網(wǎng)地址通信即可;

  • 如果通信雙方都在有獨立的公網(wǎng)地址,這種情況下當(dāng)然可以不借助任何外力直接通信即可;

  • 如果通信雙方一方擁有獨立的公網(wǎng)地址另一方在NAT后面,那么可以由位于NAT后面的一方主動發(fā)起通信請求;

  • 如果通信雙方都位于NAT后面,且雙方的NAT類型都是cone NAT,那么可以通過一個STUN服務(wù)器發(fā)現(xiàn)自己的NAT類型以及內(nèi)網(wǎng)和外網(wǎng)傳輸?shù)刂酚成湫畔?#xff0c;然后通過Signaling(信令服務(wù)器,實現(xiàn)了SIP協(xié)議的主機)交換彼此的NAT類型及內(nèi)網(wǎng)和外網(wǎng)傳輸?shù)刂酚成湫畔?#xff0c;然后通過UDP打洞的方式建立通信連接;

  • 如果通信雙方有一方的NAT類型是Symmetric NAT,則無法直接建立P2P連接,這個時候就需要借助TURN(Traversal Using Relay NAT)即轉(zhuǎn)發(fā)服務(wù)器來實現(xiàn)間接通信。

  • 總結(jié)

    以上是生活随笔為你收集整理的穿透NAT类型以及STUN、TURN简单介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。