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

2022.07.25
面試突擊:為什麼TCP 需要三次握手?

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

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

  • 我:餵,能聽到我說話嗎?
  • 對方:能聽到你說話,你能聽到我說話嗎?
  • 我:能聽到你說話,那我們就來聊正事吧。

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

圖片

TCP 三次握手流程

TCP 三次握手流程如下:

  • 客戶端發送SYN 給服務器端,表示希望建立連接;
  • 服務器端接收到消息之後,回應一個SYN 和ACK(確認應答)給客戶端;
  • 客戶端收到服務器端的SYN 報文之後,回應一個ACK 報文。

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

圖片

總結

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

參考& 鳴謝

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

《Offer 來了》