Skip to main content

[TCP] 3. 為什麼要知道 TCP 四次握手終止?四次握手過程為何?

為什麼比建立連結時多了一次 handshake ?

https://ithelp.ithome.com.tw/upload/images/20231008/20148944uImPY3k7Q0.png

多了一次 handshake 的主要差別在 Server 發送 segment 時,把 FIN segment 跟 ACK segment 分開傳送了,造成這種差別的主要原因是:

因為 Server 已經在處理資料的狀態了,無法立即的中斷,不然就會造成資料傳輸的遺失



比喻

這就好像身為前端工程師,我們會請後端幫忙處理資料傳送給我們,當下班時間到,我們告知後端說要收工下班回家時,後端卻說他還沒好,再等一下他把剩下的資料處理完給我們就下班

這時候我們就會等待後端等資料處理完給我們,等我們確定後端說沒有資料要處理後,我們再結束



用術語來說,我們等待的時候,我們不會發送訊息了,但是還可以接收後端給的資料,就是怕後端還有資料沒處理完,造成資料的遺失,我們就處在一種 半接收 的狀態,已經不會發送訊息了,但是還是可以接收資訊的狀態,讓後端可以完成他的工作,把資料處理完給我們,最後再結束


為什麼不能跟 connection 一樣 3 次 handshake 就好了?

如果我們直接關閉的話,Server 有可能還有沒處理完的資料,這樣就會造成資料的遺失


為什麼 Client 在最後一次 handshake 時還要等待一段時間才關閉?

  • 確保 Client 的最後一個 ACK 能成功地到達 Server
  • 如果 ACK 沒有傳送成功,對方就會重新發送 FIN segment
  • 這時 retransmission 的 Server FIN segment + Client ACK segment = 2 MSL

如果不等待會怎樣?

如果立馬 Closed 的話,假設 Client 的 ACK 都沒有傳成功,那 Server 就會一直重發 FIN + ACK segment

這時,因為 Client 已經 Closed,有可能一經開了新的 connection,但因為又收到 Server 的 FIN + ACK segment,就又會被中止了


為什麼建立 TCP connection 就不用考慮等待 MSL 的問題呢?

  • 當 Client 最後沒有成功回傳 ACK 時,Server 在重發 SYN + ACK 就好了
  • 不像 TCP termination 時,如果沒有等待,會把錯誤的關閉資訊發到下一次 connection

參考資訊