【前端100問】Q16:談談你對 TCP 三次握手和四次揮手的理解

寫在前面

此系列來源于開源項目:前端 100 問:能搞懂 80%的請把簡歷給我
為了備戰(zhàn) 2021 春招
每天一題,督促自己
從多方面多角度總結答案,豐富知識
談談你對 TCP 三次握手和四次揮手的理解

正文回答

q16-1.png

三次握手講解

  1. 客戶端發(fā)送位碼為 syn = 1,隨機產生 seq number=1234567 的數據包到服務器,服務器由 SYN=1 知道客戶端要求建立聯機(客戶端:我要連接你)
  2. 服務器收到請求后要確認聯機信息,向 A 發(fā)送 ack number=(客戶端的 seq+1),syn=1,ack=1,隨機產生 seq=7654321 的包(服務器:好的,你來連吧)
  3. 客戶端收到后檢查 ack number 是否正確,即第一次發(fā)送的 seq number+1,以及位碼 ack 是否為 1,若正確,客戶端會再發(fā)送 ack number=(服務器的 seq+1),ack=1,服務器收到后確認 seq 值與 ack=1 則連接建立成功。(客戶端:好的,我來了)

為什么 http 建立連接需要三次握手,不是兩次或四次?

三次是最少的安全次數,兩次不安全,四次浪費資源;

TCP 關閉連接過程

  1. Client 向 Server 發(fā)送 FIN 包,表示 Client 主動要關閉連接,然后進入 FIN_WAIT_1 狀態(tài),等待 Server 返回 ACK 包。此后 Client 不能再向 Server 發(fā)送數據,但能讀取數據。
  2. Server 收到 FIN 包后向 Client 發(fā)送 ACK 包,然后進入 CLOSE_WAIT 狀態(tài),此后 Server 不能再讀取數據,但可以繼續(xù)向 Client 發(fā)送數據。
  3. Client 收到 Server 返回的 ACK 包后進入 FIN_WAIT_2 狀態(tài),等待 Server 發(fā)送 FIN 包。
  4. Server 完成數據的發(fā)送后,將 FIN 包發(fā)送給 Client,然后進入 LAST_ACK 狀態(tài),等待 Client 返回 ACK 包,此后 Server 既不能讀取數據,也不能發(fā)送數據。
  5. Client 收到 FIN 包后向 Server 發(fā)送 ACK 包,然后進入 TIME_WAIT 狀態(tài),接著等待足夠長的時間(2MSL)以確保 Server 接收到 ACK 包,最后回到 CLOSED 狀態(tài),釋放網絡資源。
  6. Server 收到 Client 返回的 ACK 包后便回到 CLOSED 狀態(tài),釋放網絡資源。

為什么要四次揮手?

TCP 是全雙工信道,何為全雙工就是客戶端與服務端建立兩條通道

通道 1:客戶端的輸出連接服務端的輸入

通道 2:客戶端的輸入連接服務端的輸出

兩個通道可以同時工作:客戶端向服務端發(fā)送信號的同時服務端也可以向客戶端發(fā)送信號。

所以關閉雙通道的時候就是這樣:

  • 客戶端:我要關閉輸入通道了。
  • 服務端:好的,你關閉吧,我這邊也關閉這個通道。
  • 服務端:我也要關閉輸入通道了。
  • 客戶端:好的你關閉吧,我也把這個通道關閉。

幽默一下

男:我要掛了哦
女:等哈,我還要敷面膜
女:我敷完了,現在可以掛了
男:我舍不得掛,你掛吧
女:好吧,我掛了
男:等了 2MSL 聽見嘟嘟嘟的聲音后掛斷

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容