[TCP] 3. 為什麼要知道 TCP 四次握手終止?四次握手過程為何?
為什麼比建立連結時多了一次 handshake ?
多了一次 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
參考資訊
- Everything You Always Wanted to Know About TCP But Too Afraid to Ask (bytebytego.com)
- 两张动图-彻底明白TCP的三次握手与四次挥手tcp三次握手小书go的博客-CSDN博客
- 面试官,不要再问我三次握手和四次挥手 | 猿人谷 (yuanrengu.com)