面試突擊68:為什麼 TCP 需要 3 次握手?

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第1天,點選檢視活動詳情

TCP 三次握手是一道經典的面試題,它是指 TCP 在傳遞資料之前,需要進行 3 次互動才能正式建立起連線,並進行資料傳遞。 TCP 之所以需要 3 次握手是因為 TCP 雙方都是全雙工的。所謂全雙工指的是,TCP 任何一端既是傳送資料方,又是接收資料方,因此這就要求 TCP 通訊雙方既要保證自己的傳送能力,又要保證自己的接收能力才行。 這就好像打電話時,通訊雙方都要保證自己能話筒(傳遞聲音)和耳機(接收聲音)都是正常的才行,這樣才能進行有效的交流,通常打電話時,都是這樣開頭的:

  1. 我:喂,能聽到我說話嗎?
  2. 對方:能聽到你說話,你能聽到我說話嗎?
  3. 我:能聽到你說話,那我們就來聊正事吧。

TCP 三次握手也是相同的道理,3 次握手證明的能力詳情如下: image.png

TCP 三次握手流程

TCP 三次握手流程如下:

  1. 客戶端傳送 SYN 給伺服器端,表示希望建立連線;
  2. 伺服器端接收到訊息之後,迴應一個 SYN 和 ACK(確認應答)給客戶端;
  3. 客戶端收到伺服器端的 SYN 報文之後,迴應一個 ACK 報文。

具體執行流程如下圖所示: image.png

總結

TCP 之所以需要 3 次握手,是因為 TCP 通訊雙方都是全雙工的,所以要經過 3 次互動才能確認雙方的傳送能力和接收能力,並且 TCP 握手必須是 3 次,如果是 2 次握手,不能證明伺服器端的傳送能力和客戶端的接收能力;也不能是 4 次握手,因為 3 次已經能證明的事情,再互動握手 1 次完全沒有必要。

參考 & 鳴謝

《碼出高效:Java開發手冊》

《Offer 來了》

是非審之於己,譭譽聽之於人,得失安之於數。

公眾號:Java面試真題解析

面試合集:http://gitee.com/mydb/interview