aldy120 / High-Performance-Browser-Networking

A reading note from <High Performance Browser Networking by Ilya Grigorik>.
0 stars 0 forks source link

Building Blocks of UDP #3

Open aldy120 opened 5 years ago

aldy120 commented 5 years ago

Invented in 1980 by Jon Postel

Null Protocol

User Datagram Protocol(UDP) 有時被叫做 null protocol 。原因是他只有在原本的 IP 層加上了四個欄位。

IP

image

UDP

image

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 惹的禍。

aldy120 commented 5 years ago

NAT Traversal

如果今天要用 UDP 來做一個 P2P 的應用的話,在從外面的 request 要穿越 NAT device 到內部的時候,同樣會有問題。內部的人不知道他的 public IP ,因此通常會傳自己的 private IP 出去給外面的人。這時候外面得人如果對這個 private IP 發送請求,裡面的人根本就收不到。因此裡面的人必須要想辦法拿到自己的 public IP:port 。這邊講的裡面跟外面,分別指的是 NAT 的裡面跟外面,跟 NAT 在同一個 private network 的機器稱為裡面。簡單來說,從裡面出去不是問題,問題出在外面的人怎麼進來。

STUN, TURN, and ICE

你可以在 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 。

aldy120 commented 5 years ago

webRTC 在瀏覽器上真正用到了 UDP ,如果不算 DNS 查詢不算的話。