iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
自我挑戰組

為了成為更好的前端,我開始在乎的那些事系列 第 23

[Day 23] 網路常識 - (9) 為什麼要知道 TCP 四次握手終止?四次握手過程為何?

  • 分享至 

  • xImage
  •  

為什麼比建立連結時多了一次 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

 

參考資訊


上一篇
[Day 22] 網路常識 - (8) 為什麼要知道 TCP 三次握手?三次握手過程為何?
下一篇
[Day 24] 網路常識 - (10) TCP connection 沒有你想像的簡單! 細談大量 TCP 連結的效能問題和資安問題
系列文
為了成為更好的前端,我開始在乎的那些事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言