Open aldy120 opened 5 years ago
如果今天要用 UDP 來做一個 P2P 的應用的話,在從外面的 request 要穿越 NAT device 到內部的時候,同樣會有問題。內部的人不知道他的 public IP ,因此通常會傳自己的 private IP 出去給外面的人。這時候外面得人如果對這個 private IP 發送請求,裡面的人根本就收不到。因此裡面的人必須要想辦法拿到自己的 public IP:port 。這邊講的裡面跟外面,分別指的是 NAT 的裡面跟外面,跟 NAT 在同一個 private network 的機器稱為裡面。簡單來說,從裡面出去不是問題,問題出在外面的人怎麼進來。
你可以在 public network 放一台 STUN server ,一旦 private network 裡面的機器要發送訊息到外面,可以先向這台 STUN server 拿他的 Public IP:port ,在必要時把這組資訊放進去 application data 裡面。這樣外面的人就可以很清楚的知道要向哪個 IP:port 發送請求了。此外 STUN protocol 有 keep-alive 機制,讓 NAT table 不要 timeout 。
TURN server 負責當中間人,轉送訊息,也就是說任何一方發 UDP 的訊息的時候,都要發給 TURN server 來請他幫忙送。企業網路中,通常會將來路不明的 UDP ban 掉的問題,因此可以用一個受到信任的 TURN server 來解決這個問題。雖然說,一旦使用了 TURN server 來幫忙 Relay ,嚴格來講就不算是 P2P 了。而且 TURN server 接受雙方的請求,理論上來說會有比較大的 loading 。
一個方法是使用 TURN 來作為 STUN 的 failover ,一旦發現使用 STUN 不行,就轉而使用 TRUN 。這種作法稱作 ICE 。
webRTC 在瀏覽器上真正用到了 UDP ,如果不算 DNS 查詢不算的話。
Invented in 1980 by Jon Postel
Null Protocol
User Datagram Protocol(UDP) 有時被叫做 null protocol 。原因是他只有在原本的 IP 層加上了四個欄位。
IP
UDP
Network Address Translate(NAT)
NAT 裡面會需要紀錄 private ip:port 跟 public ip:port 的對應關係,好分清楚誰要換成誰。理想狀況下,應該要再連線結束後清掉這次的 ip:port 對應關係,但是 UDP 是 stateless ,完全不能知道連線斷了沒。TCP 至少還會有建立連線跟結束連線的訊號,可以讓 NAT 知道。
實際上這個 ip:port 的對應表何時會清掉,是看各家廠商的實作,通常是設定一個 timeout ,沒收到從來源傳的封包一定時間後就刪掉對應關係。就算你是 TCP ,有些廠商也不管你是不是 TCP ,一樣用 timeout 來清掉 ip:port 對應關係。因此通常會使用 keep-alive packets 的方式維持連線。如果你的 TCP 連線不明原因被斷掉,可能是 NAT 惹的禍。