題目與範圍
兩個瀏覽器需要建立音訊、視訊或資料連線。它們可能在同一區域網路、不同 NAT 後,或處於阻斷 UDP 的網路。請解釋建立路徑和失敗路徑,並區分透過信令交換描述的過程與發現、檢查網路路徑的 ICE。
Credmark 的公開 WebRTC 面試指南明確要求解釋 ICE 以及 STUN、TURN 的作用。RFC 8445 定義 ICE 候選、檢查清單和連通性檢查;WebRTC.org 說明點對點連線如何使用 STUN 或 TURN 收集候選。
面試官考察什麼
- 是否區分信令、候選收集、連通性檢查和媒體加密。
- 是否能解釋主機、伺服器反射和中繼候選,而不聲稱 STUN 會「打開連接埠」。
- 是否能權衡直連路徑的延遲與 TURN 的頻寬、隱私和營運成本。
核心訊號是因果時間線:描述和候選經過信令傳遞,候選對執行檢查,選定路徑後才承載加密媒體或資料。
作答前澄清
- 信令是否已存在? ICE 不定義你的 WebSocket、HTTP 或訊息信令傳輸。
- 瀏覽器直連還是經過 SFU? SFU 會改變媒體拓撲,但仍需分別與每個瀏覽器建立連線。
- UDP 和 TCP 443 是否允許? 防火牆策略決定主機、反射或中繼候選能否成功。
- 成本目標是什麼? 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 成功證明可達,不證明容量和媒體品質足夠。