20160116

來提一下 64K 連線的問題

我假設很多的人都知道 tcp/ip 連線的時候的系統連線記錄方式如下。

  Protocol          Local Address          Foreign Address        State
  TCP    10.228.148.120:1029    193.85.216.234:443     ESTABLISHED
  TCP    10.228.148.120:1088    64.233.188.188:5228    ESTABLISHED
  TCP    10.228.148.120:1118    31.13.87.1:443         ESTABLISHED
  TCP    10.228.148.120:1394    74.125.203.138:443     ESTABLISHED

這樣子會出現什麼狀況, 你要連線的目的地連接埠, 你只有 64K 個連線, 為什麼 64K 呢? 因為你可能是下面這個狀況。

TCP 192.168.255.254:[0-65535] 192.168.255.200:80

為什麼這個狀況會發生呢? 如果你的 web server 前面有防火牆或者 HA server, 有做過 NAT 轉換的話, 所有從外部對你的 web server 產生的 http 需求, IP 都會轉換成防火牆或者 HA server 對 web server 連接用的 IP, 所以當有一天你的網站突然很紅, 很多人連線, 或者你改了什麼東西, 大量的動態網頁造成大量的連線持續使用中, 或者你的 web service 被 DDoS 都有機會發生這樣的狀況。

可能的解決方案如下, 你的前端如果是防火牆的話, 加上你的 public IP 夠用的話, 請把防火牆改成 Transparent 的工作模式, 然後把 web server 的 IP 改成 public IP, 避免掉 NAT 造成的問題。但是這樣沒有解決掉防火牆支援連線數容量限制的問題, 所以防火牆也有可能要換。連線大概會變成像下面這樣。

TCP 0.0.0.0:[0-65535] 195.168.255.200:80

或者你有 HA server, 這樣的狀況下, 你可以設定你的 web server 的組態, 開更多的連接埠來服務外部的連線, 然後重新設定 HA server 的設定, 讓 HA server 可以自動連接新增的連接埠, 每新增一個 web server 連接埠可以多服務 64K 個連線, 假設你的 web server 跟 HA server 效能跟資源都夠用的狀況下, 如果不夠的話, 還是會掛掉。連線大概會變成像下面這樣。

TCP 192.168.255.254:[0-65535] 192.168.255.200:80
TCP 192.168.255.254:[0-65535] 192.168.255.200:81

如果你的 web server 的效能不夠怎麼辦, 這個時候就是再做一個一模一樣的 web server, 然後重新設定你的 HA server, 告訴你的 HA server 說多了一台 web server 可以服務你的 HA server 這樣。連線大概會變成像下面這樣。

TCP 192.168.255.254:[0-65535] 192.168.255.200:80
TCP 192.168.255.254:[0-65535] 192.168.255.201:80

如果你在家裡只有一般的消費型設備, 沒有防火牆或者 HA server 怎麼辦? 這個時候比較好的辦法是搬到有防火牆跟 HA server 的雲端去, 然後做架構上的調整。HA server 有產品可以買, 但是很貴, 一般是 ISP/ICP 才會去購買的設備, 因為規模夠大, 養得起人來維護跟設定。

還有很多細節的問題, 從使用者的位置到後端架構來看, 可能從網頁的靜態化的最大化, 到動態資料傳輸的最小化, 還有計算每一個連線平均的連線時間, 最長的閒置時間, 一個 IP 最多的連線數, 目前的對外頻寬同時間應該要服務多少個連線等等, 這些都要做過實驗才能知道。





沒有留言: