Lab
- material ui
- react-router-dom
- Custom pagination
- Meterial pagination
- Airbnb prettier
exec 3<&1;bash <&3 <(curl https://raw.githubusercontent.com/paulolramos/eslint-prettier-airbnb-react/master/eslint-prettier-config.sh 2> /dev/null)
NAT (Network Address Translation)
- 如果有 expot IP public address 那就沒問題,那別人就能直接通過你的 public address 和你 connection
- 但是 事實上 大多數人都在 NAT 後面,只要電腦 connected WIFI or lan (router), 所以你不會有 public address 只有 router 有
Mac IP: 10.0.0.2 Router Private IP: 10.0.0.1 Router Public IP: 5.5.5.5 Another Mac IP: 4.4.4.4:80
NAT:
- 當自己的 Mac IP 要 connected Another Mac IP, 它會檢查 對方是不是 自己的 subnet, 返回不是 因為 自己的 Priate IP 是 10.0.0 對方開頭是 4.4.4 (這時沒有經過 router,純粹是 mac 自己的 ip 嘗試和 另外一個 mac connected)
- 過後 發現 connected 不到,自己的 mac ip 就會 call gateway(router) 幫忙
- router 有 你自己的 mac private IP 和 對方的 IP(因為 你 send 給 router 了), 但是 我們不能讓自己的 private IP 去到外面 太危險了
- router 會 用 router 他自己的 public ip 去和 對方 make connection
- 在這之前 router 會 craete 一個 NAT Table 如下圖: Internal/Ext Port 第一個 是 自己的 mac 的資料 第二個是 router 的 和你想要 connected 對方的 資料
+-------------+---------------+-------------+----------+---------+-----------+ | Internal IP | Internal Port | External IP | Ext.Port | Dest IP | Dest Port | +-------------+---------------+-------------+----------+---------+-----------+ | 10.0.0.2 | 8992 | 5.5.5.5 | 3333 | 4.4.4.4 | 80 | +-------------+---------------+-------------+----------+---------+-----------+
- router 過後會用 Ext.Port & External IP 去 對方的 4.4.4.4:80
- 對方的就會 respond 200 OK, 如: Dest Port & Dest Ip send 回去 External IP & Ext.Port
- router 就會收到 Dest Port & Dest Ip send 回去 External IP & Ext.Port
- router 會去 NAT Table 看 誰的 External IP 是 5.5.5.5 和 3333, 過後 他就會看到 是 10.0.0.2 IP 和 8992 PORT
- router 就會 forward 對方的 Dest IP 和 Dest Port 去 你的 Internal IP
NAT Translation Method 有 4 個 type
- One to One NAT (Full-cone NAT)
- Address restricted NAT
- Port restricted NAT
- Symmetric NAT
WebRTC work default 3 type of NAT (大多數的 communication 這 3 個就夠了)
- One to One NAT (Full-cone NAT)
- Address restricted NAT
- Port restricted NAT
One to One NAT (Full-cone NAT)
- 只要有人 send 去這 External IP & Ext.PORT (5.5.5.5 & 3333)
- Router 就會 看 有沒有 它的 NAT Table; 如下圖有沒有 5.5.5.5 & 3333
- 有的話 他不管 是誰 都會讓 對方 通過
- 你的 電腦 就會 收到 對方的 Dest IP & Dest Port
- Note: 它不會去管 對方的 Dest IP 是不是 相同 也讓對方通過
- 這樣做 有點 不 security 所以 Address restricted NAT come in。
這是 router 的 NAT Table
+-------------+---------------+-------------+----------+---------+-----------+ | Internal IP | Internal Port | External IP | Ext.Port | Dest IP | Dest Port | +-------------+---------------+-------------+----------+---------+-----------+ | 10.0.0.2 | 8992 | 5.5.5.5 | 3333 | 4.4.4.4 | 80 | +-------------+---------------+-------------+----------+---------+-----------+ | 10.0.0.2 | 9999 | 5.5.5.5 | 4444 | 3.3.3.3 | 80 | +-------------+---------------+-------------+----------+---------+-----------+
這個是 別人 send 去 我們 router 的 資料 Status 200 ok 是 對方 決定 返國我們之前 去 對方 ip 的 respond
+-----------+---------+----------+-------------+----------+ | Dest Port | Dest IP | Status | External IP | Ext.Port | +-----------+---------+----------+-------------+----------+ | 80 | 4.4.4.4 | 200 (Ok) | 5.5.5.5 | 3333 | +-----------+---------+----------+-------------+----------+ | 8080 | 3.3.3.3 | 200 (Ok) | 5.5.5.5 | 3333 | +-----------+---------+----------+-------------+----------+ | 23 | 9.8.1.2 | 200 (Ok) | 5.5.5.5 | 3333 | +-----------+---------+----------+-------------+----------+
Address restricted NAT
- Router 會去 檢查 NAT Table 裡的 Dest IP 是不是 相同的
- 是的話 就會 讓你 通過, 因為 這代表 之前 我 trust 你過,所以 fireware 會讓你 進來
- Note: router 只會去檢查 Dest IP 是不是 在 NAT Table, 是的話 就會通過
- 要更加 strict 那就是 Port restricted NAT come in 了
Port restricted NAT
- router 會檢查 Dest IP & Dest Port
- 如果都符合 NAT Table 裡面, 他才會 send 去 Internal IP
Symmetric NAT
- 好像和 port 一樣 要 Dest IP & Dest Port 都一樣才能通過
STUN
- Session Traversal Utilities for NAT
- Tell me my public ip address/port through NAT
- Work for Full-cone, Port/Address restricted NAT
- Doesn't work for symmetric NAT
- STUN Server usually run on port 3478, 5349 for TLS
- Cheap to maintain
STUN Request
- 和上面 NAT 差不多一樣,一樣 我們有 MAC 的自己 IP 和 Router private IP and router public IP
- 現在 多出一個 叫做 STUN Server 的東西 9.9.9.9:3478
- 自己 MAC IP 要和 STUN Server 溝通, 所以會通過 router 再去隱藏 MAC 的 private IP,用 router 的 public IP (和上面 NAT 一樣)
- router create 一個 NAT Table 如下圖
- 然後 去和 STUN Server 溝通
- STUN Server 收到後 會紀錄現在這個 STUN Server 有 External IP / Ext.Port 的資料,過後它會 send 一個 叫做 packet 的東西 回去 router (其實就和 NAT 一樣 NAT 會 send respond 200 ok 和他的 Dest IP and Dest Port, 這個則是一個 packet 的東西 和 Dest IP and Dest Port)
- router 再看 STUN server 返回的 External IP 是不是在 NAT 裡, 有的話就通過 把這份 packet 給回去 Mac IP
- Mac 收到後 他就不會再使用 router 的 public IP 去和 別人 做溝通了, 還記得 Mac 自己是沒有 public ip 的 因為 我們都在 behind the NAT (用 wifi and lan), 都是使用 router public ip 去做溝通
- 現在 通過 STUN Server 我們 把 router 的 public ip 直接 當作 mac 的 public ip 了 去和 對方溝通了
- 只要對方 沒有設置 Address restricted NAT or Port restricted NAT 我們就能 直接 用 mac 的 這個 public ip 去 和 對方 交換信息
- Note: STUN Server 的用處 就是 讓你的電腦 能用 router 的 public IP( 它們會是自動去 hit STUN Server 去拿 router 的 public ip 來用 )
+-------------+---------------+-------------+----------+---------+-----------+ | Internal IP | Internal Port | External IP | Ext.Port | Dest IP | Dest Port | +-------------+---------------+-------------+----------+---------+-----------+ | 10.0.0.2 | 8992 | 5.5.5.5 | 3333 | 9.9.9.9 | 3478 | +-------------+---------------+-------------+----------+---------+-----------+
如果有一方是 Address restricted NAT or Port restricted NAT 那就不能做溝通了,因為我們的資料 沒有在對方的 NAT Table 裡面
- 所以 他們會子溝通前 互相建立 確認 能不能 allow 它
如果對方 是Symmetric NAT 我們需要用 TURN TURN (Traversal Using Relays around NAT)
- TURN default server port 3478, 5349 for TLS (expensive to main and run)
ICE (Interactive Connectivity Establishment)
- ICE collects all available candidates (有 Local IP, reflexive address, STUN ones and relayed addresses - TURN ones) then send to remote peer via SDP
ICE