具代表性的面試主題

通用面試:ICE、STUN 和 TURN 如何建立 WebRTC 連線?

通用困難
Offer.cc 編輯團隊發佈 更新

題幹

兩個瀏覽器需要在未知網路之間建立 WebRTC 連線。請解釋信令、ICE、STUN、TURN 如何協作,如何選擇候選對,以及如何診斷 ICE 失敗。

題目與範圍

兩個瀏覽器需要建立音訊、視訊或資料連線。它們可能在同一區域網路、不同 NAT 後,或處於阻斷 UDP 的網路。請解釋建立路徑和失敗路徑,並區分透過信令交換描述的過程與發現、檢查網路路徑的 ICE。

Credmark 的公開 WebRTC 面試指南明確要求解釋 ICE 以及 STUN、TURN 的作用。RFC 8445 定義 ICE 候選、檢查清單和連通性檢查;WebRTC.org 說明點對點連線如何使用 STUN 或 TURN 收集候選。

面試官考察什麼

  • 是否區分信令、候選收集、連通性檢查和媒體加密。
  • 是否能解釋主機、伺服器反射和中繼候選,而不聲稱 STUN 會「打開連接埠」。
  • 是否能權衡直連路徑的延遲與 TURN 的頻寬、隱私和營運成本。

核心訊號是因果時間線:描述和候選經過信令傳遞,候選對執行檢查,選定路徑後才承載加密媒體或資料。

作答前澄清

  1. 信令是否已存在? ICE 不定義你的 WebSocket、HTTP 或訊息信令傳輸。
  2. 瀏覽器直連還是經過 SFU? SFU 會改變媒體拓撲,但仍需分別與每個瀏覽器建立連線。
  3. UDP 和 TCP 443 是否允許? 防火牆策略決定主機、反射或中繼候選能否成功。
  4. 成本目標是什麼? TURN 會承載流量,因此視訊碼率和中繼比例決定支出。

30 秒回答

「信令交換 SDP offer、answer,以及 ICE 候選;信令是應用程式自訂的。每個端點收集主機候選,向 STUN 要求伺服器反射地址,在直連可能失敗時取得 TURN 中繼候選。ICE 組成候選對,使用驗證過的連通性檢查並提名可用候選對。接著 DTLS 驗證對端並派生媒體或資料金鑰。STUN 協助發現映射地址;TURN 轉送位元組。對稱 NAT、阻斷 UDP 或嚴格防火牆可能迫使使用 TURN,因此我會按網路類型衡量候選對成功率、連線時間、中繼比例和失敗率。」

分步深答

第一步:透過信令交換描述。

呼叫方建立包含媒體段和 ICE 憑證的 offer,透過應用程式信令服務傳送。被呼叫方回傳 answer。信令也傳遞 trickle 候選和候選結束標記。信令伺服器轉送 SDP,並不因此承載媒體。

第二步:收集候選類型。

主機候選代表本機介面。STUN binding 請求讓端點得知 STUN 伺服器觀察到的公開映射地址和連接埠,形成伺服器反射候選。TURN allocation 建立中繼候選,TURN 伺服器成為流量端點。候選優先級和 foundation 幫助 ICE 比較路徑,但較高優先級不保證檢查通過。

第三步:組成並檢查候選對。

雙方組合本地和遠端候選。ICE 將候選對放入檢查清單,使用 ICE 憑證傳送 STUN 連通性檢查並記錄回應。檢查成功只證明當時能穿過該對,並不保證未來持續可用。控制端提名有效候選對,雙方收斂到同一路徑。

第四步:保護選定路徑。

ICE 連通後,DTLS 驗證對端並派生金鑰。SRTP 保護音視訊,DTLS 上的 SCTP 承載資料通道。ICE 選擇可達路徑,不負責加密應用程式載荷。瀏覽器暴露連線狀態和候選統計,這些資料對診斷很重要。

第五步:解釋常見 NAT 結果。

同一區域網路的主機候選通常可用。相容的 NAT 可能允許伺服器反射候選。對稱 NAT 映射、端點相關過濾或阻斷 UDP 會使直連失敗。TURN 可透過 UDP、TCP 或 443 連接埠上的 TLS 中繼,但會增加延遲、頻寬成本和信任面。

第六步:用證據診斷失敗。

記錄信令狀態、ICE 收集狀態、ICE 連線狀態、候選類型、候選對檢查、選定候選對、RTT、同意保活和網路家族。用區域網路、行動網路、對稱 NAT、VPN 和 UDP 被阻斷網路組成測試矩陣。若收集成功但檢查失敗,檢查防火牆和 NAT;若只有中繼成功,先衡量中繼成本和通話品質,再調整直連策略。

高品質示範回答

「我會畫出四個邊界。應用程式信令服務交換 SDP、ICE 憑證、候選和結束標記,它不是媒體路徑。主機候選描述本地介面,STUN 產生伺服器反射映射,TURN 分配中繼。ICE 組合本地和遠端候選,使用驗證過的 STUN 訊息檢查並提名路徑。之後 DTLS 派生金鑰,SRTP 承載音視訊,SCTP 承載資料通道。

直連主機或反射路徑成本較低,通常延遲也較低,但對稱 NAT 和阻斷 UDP 會要求 TURN。我會按網路類別監控候選收集、檢查錯誤、連線時間、選定候選類型、中繼比例、RTT 和同意遺失,從而區分信令缺失、NAT 穿透失敗和已連線但媒體路徑品質不足。」

常見錯誤

  • 把 STUN 當中繼 → STUN 回傳映射地址但不承載工作階段 → 只有 TURN 才有中繼語義。
  • 說信令建立媒體 → 信令只傳輸描述和候選 → 繼續追蹤 ICE 檢查和選定候選對。
  • 認為 STUN 成功就代表連線成功 → 遠端仍可能因過濾無法傳送 → 檢查完整候選對。
  • 所有通話都使用 TURN → 中繼頻寬和延遲會推高成本並損害品質 → 偏好直連並監控中繼比例。
  • 把 ICE 當加密 → ICE 只檢查可達性 → 分別解釋 DTLS、SRTP 和 SCTP。

追問與回答

追問 1:為什麼 STUN 可用但點對點連線仍失敗?

STUN 只說明伺服器觀察到一側的映射。遠端可能因 NAT 使用端點相關映射或過濾,或者防火牆阻斷協定,無法傳送到這個映射。ICE 必須檢查完整候選對;STUN 請求成功不是路徑保證。

追問 2:什麼時候應該強制使用 TURN?

當策略禁止暴露對端地址、直連檢查反覆失敗,或已知網路類別阻斷 UDP 時,可以強制或優先 TURN。使用短期憑證、區域中繼、限流和容量告警。全域強制會掩蓋直連回歸並增加頻寬成本,因此要把它作為有度量依據的明確策略。

追問 3:通話已連線但視訊品質差,檢查什麼?

讀取選定候選對、是否為中繼、RTT、丟包、抖動、同意保活、碼率自適應,並比較直連和中繼路徑。檢查 CPU、編碼佇列,以及 SFU 或 TURN 區域是否距離過遠。ICE 成功證明可達,不證明容量和媒體品質足夠。

公開來源

同類題目