TCP & Keep-Alive

TCP 三向交握

TCP 連線(Transmission Control Protocol,傳輸控制協定)

建立 TCP 連線

TCP 的特性是:在傳送任何資料之前,雙方必須先確認彼此都連上線了。這個確認的過程就叫做 「三向交握」(Three-Way Handshake)

Next.js 伺服器要跟 MySQL 資料庫連線的過程就會如下:

  1. 第一步(SYN): 伺服器傳訊息給資料庫:「嗨,我是伺服器,我想建立連線,你聽得到我說話嗎?」
  2. 第二步(SYN-ACK): 資料庫收到後回傳:「聽得到!我這邊準備好了。那你聽得到我說話嗎?」
  3. 第三步(ACK): 伺服器再次確認:「聽到了!那我們正式開始連線吧!」

經過這三次一來一回的「交握」,一條安全的 TCP 連線通道就正式開通了,接下來雙方才能開始傳送 SQL 語法和資料。


關閉 TCP 連線(四次揮手)

當資料傳完、事情辦完了,必須把通道關閉,釋放記憶體。這個過程叫 「四次揮手」(Four-Way Handshake)

  1. 伺服器:「我的資料傳完了,我想關閉連線囉。」
  2. 資料庫:「收到,我知道你想關閉了。但我手邊還有最後一兩筆資料要處理,你等我一下。」
  3. 資料庫(處理完後):「好了,我這邊也搞定了,可以正式關閉了。」
  4. 伺服器:「收到,那再見!」(正式中斷連線)

頻繁開關 TCP 連線

很傷效能!
因爲前端每發送一個請求,伺服器就要跟資料庫經歷「三向交握(開)」到「傳資料」再到「四次揮手(關)」。
光是為了講一句話,背後就要講 7 句廢話(開關的封包往返)。這會導致網頁回應變得很慢。

所以在與資料庫連線的時候才會建立連線池!


TCP Keep-Alive

連線建立好之後,問題來了:如果突然有一段時間,伺服器跟資料庫之間「完全沒有人要傳資料」,這條連線會發生什麼事?

在網路世界中,如果一條 TCP 連線長時期沒有資料流動,它很有可能會被沿途的路由器或防火牆(Firewall)認為這條連線已經報廢了,進而默默地從路由表中斷開。

這時候 TCP Keep-Alive(保持存活) 機制就派上用場了。

我還活着!

TCP Keep-Alive 就像是一個隱形的心跳探測器。當連線進入閒置(Idle)狀態,且超過設定的時間後,作業系統會自動幫你發送一個極小的探測封包(Probe)給對方:

  • 伺服器發送:「(戳一下資料庫)哈囉,你還在嗎?」
  • 資料庫回應:「在啦,還活着。」

如果資料庫有回應,這條 TCP 連線就會繼續維持暢通;如果連戳幾次都沒回應,伺服器就會知道「喔!對方已經斷線或死機了」,然後主動把這條死掉的連線清理掉。

1 comment