TCP & Keep-Alive
TCP 三向交握
TCP 連線(Transmission Control Protocol,傳輸控制協定)
建立 TCP 連線
TCP 的特性是:在傳送任何資料之前,雙方必須先確認彼此都連上線了。這個確認的過程就叫做 「三向交握」(Three-Way Handshake)。
Next.js 伺服器要跟 MySQL 資料庫連線的過程就會如下:
- 第一步(SYN): 伺服器傳訊息給資料庫:「嗨,我是伺服器,我想建立連線,你聽得到我說話嗎?」
- 第二步(SYN-ACK): 資料庫收到後回傳:「聽得到!我這邊準備好了。那你聽得到我說話嗎?」
- 第三步(ACK): 伺服器再次確認:「聽到了!那我們正式開始連線吧!」
經過這三次一來一回的「交握」,一條安全的 TCP 連線通道就正式開通了,接下來雙方才能開始傳送 SQL 語法和資料。
關閉 TCP 連線(四次揮手)
當資料傳完、事情辦完了,必須把通道關閉,釋放記憶體。這個過程叫 「四次揮手」(Four-Way Handshake):
- 伺服器:「我的資料傳完了,我想關閉連線囉。」
- 資料庫:「收到,我知道你想關閉了。但我手邊還有最後一兩筆資料要處理,你等我一下。」
- 資料庫(處理完後):「好了,我這邊也搞定了,可以正式關閉了。」
- 伺服器:「收到,那再見!」(正式中斷連線)
頻繁開關 TCP 連線
很傷效能!
因爲前端每發送一個請求,伺服器就要跟資料庫經歷「三向交握(開)」到「傳資料」再到「四次揮手(關)」。
光是為了講一句話,背後就要講 7 句廢話(開關的封包往返)。這會導致網頁回應變得很慢。
所以在與資料庫連線的時候才會建立連線池!
TCP Keep-Alive
連線建立好之後,問題來了:如果突然有一段時間,伺服器跟資料庫之間「完全沒有人要傳資料」,這條連線會發生什麼事?
在網路世界中,如果一條 TCP 連線長時期沒有資料流動,它很有可能會被沿途的路由器或防火牆(Firewall)認為這條連線已經報廢了,進而默默地從路由表中斷開。
這時候 TCP Keep-Alive(保持存活) 機制就派上用場了。
我還活着!
TCP Keep-Alive 就像是一個隱形的心跳探測器。當連線進入閒置(Idle)狀態,且超過設定的時間後,作業系統會自動幫你發送一個極小的探測封包(Probe)給對方:
- 伺服器發送:「(戳一下資料庫)哈囉,你還在嗎?」
- 資料庫回應:「在啦,還活着。」
如果資料庫有回應,這條 TCP 連線就會繼續維持暢通;如果連戳幾次都沒回應,伺服器就會知道「喔!對方已經斷線或死機了」,然後主動把這條死掉的連線清理掉。

1 comment