iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

網路通訊隨意聊系列 第 11

NAT(五),其他穿越機制,STUN 及打洞策略

  • 分享至 

  • xImage
  •  

前面聊過一些 NAT 穿越的機制,例如 Port Forwarding。而在大致理解了各種 NAT 的類型之後,我們來看看針對不同種類的 NAT 有何穿越機制。

STUN

STUN 的全名為 Session Traversal Utilities for NAT,中文翻譯成 NAT 對談穿透用程式,是 NAT 穿越中較為簡單的做法之一。其命名中的「對談(Session)」一般是指兩個裝置間的連線, 而 STUN 主要做的事情就是透過找到裝置的 External IP Address + Port,來幫助裝置間建立連線。

假設我們要和朋友建立 P2P 的連線,我們自己 Router 的設定是錐形 NAT,就算是限制最多的「埠受限錐形 NAT」,也能透過 STUN 來幫助建立直接的連線。

埠受限錐形 NAT 下的 P2P 連線建立
*埠受限錐形 NAT 下的 P2P 連線建立

首先這個服務會需要架設一個 STUN Server,便能透過以下步驟來幫助我們建立 P2P 連線

  1. 我們的 P2P 服務 Client 端和 STUN Server 詢問公開的位置

  2. STUN Server 回覆我們,得到 1.2.3.4:9200

  3. 將我們的公開位置傳送給朋友,朋友便能透過 1.2.3.4:9200 傳訊息給我們了

如此一來,我們雙方就能透過和 STUN 獲取的公開位置來建立連線了。

但是,先等等!

這個情境是當我們在 NAT 的後面,而我們朋友卻是假定其裝置是擁有公開 IP 位置的,假如他的裝置也在 NAT 後面,會發生什麼情形?

P2P 在(埠)受限錐形 NAT 下的策略:打洞

雖然我們雙方都可以透過 STUN Server 拿到各自的公開位置,但如果雙方的 Router 設定都是完全錐形 NAT 的話,傳送的訊息會被對方的 Router 給丟掉,因為對方並沒有傳送訊息給我們 1.2.3.4:9200 過。

無法傳送訊息給對方
*無法傳送訊息給對方

同理可證,如果朋友想先傳訊息給我們,也會被我們的 Router 所擋掉!那麼,豈不是一個類似 Deadlock 的狀況,我們誰都沒辦法成功送出第一筆訊息?

不怕,我們可以同時傳,多傳幾筆!且看下方例子。

雙方同時傳送訊息給對方
*雙方同時傳送訊息給對方

  1. 在時間 T1 的地方,我們先送訊息給對方,但此時對方的 NAT 表中還沒有記錄我們的 IP 位置,所以會被擋住。

  2. 但沒關係,我們的 NAT 表中已經記錄對方的 IP 位置了,因此在晚一點的時間 T2 上,對方送的封包不會被我們的路由器給擋掉。

  3. 而在 T3 時間上,對方已經將我們的位置新增在自己的 NAT 表上了,所以此時我們也能夠成功送出訊息,達成雙方都建立連線

這種同時傳、多傳幾次的策略就稱之為 Hole Punching(打洞),又分為 UDP 打洞及 TCP 打洞,兩者實施的邏輯類似,但細節上 TCP 的又更為複雜。

然而,要實施 Hole Punching 還會需要一個中繼的 Server,否則 P2P 的兩端不知道什麼時候要「同時」向對方傳送封包。

並且呢,這僅在雙方的 Router 設定是錐形 NAT 的情境底下成功機率較高,在 Router 設定是對稱 NAT 時,會因為對不同目標的連接都會產生新的連接埠映射,所以從 STUN Server 拿到 External IP 位置組合,只有 STUN Server 傳的訊息才被允許而已。

至於對稱 NAT 的問題要怎麼解決,我們下一講繼續聊。

參考資料

  1. Wiki - STUN

  2. Wiki - UDP 打洞


上一篇
NAT(四),受限錐形、對稱 NAT
下一篇
NAT(六),更複雜的穿越機制,STUN, TURN 及 ICE 怎麼處理 P2P 連線
系列文
網路通訊隨意聊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言