字節二面:TCP斷開連接是怎樣的?
前言
大家好,我是田螺。
有位星球粉絲去字節面試,被問了這道題:TCP斷開連接是怎么樣的?
大家第一感覺會不會不知道怎么去回答?其實呢,就是換個角度在問TCP的四次揮手過程而已。
TCP斷開連接(也稱為TCP連接終止或關閉連接)是指在TCP協議中,通信雙方結束會話并釋放占用的資源的過程。斷開連接使用了一個類似于建立連接的四次揮手過程,以確保雙方都安全地關閉連接。
如果是我,我會按這幾個角度來回答:
- 四次揮手過程
- TCP揮手為什么需要四次呢?
- TIME-WAIT 狀態為什么需要等待 2MSL
1. 四次揮手過程
圖片
- 第一次揮手(FIN=1,seq=u),發送完畢后,客戶端進入FIN_WAIT_1 狀態
- 第二次揮手(ACK=1,ack=u+1,seq =v),發送完畢后,服務器端進入CLOSE_WAIT 狀態,客戶端接收到這個確認包之后,進入 FIN_WAIT_2 狀態
- 第三次揮手(FIN=1,ACK1,seq=w,ack=u+1),發送完畢后,服務器端進入LAST_ACK 狀態,等待來自客戶端的最后一個ACK。
- 第四次揮手(ACK=1,seq=u+1,ack=w+1),客戶端接收到來自服務器端的關閉請求,發送一個確認包,并進入 TIME_WAIT狀態,等待了某個固定時間(兩個最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,沒有收到服務器端的 ACK ,認為服務器端已經正常關閉連接,于是自己也關閉連接,進入 CLOSED 狀態。服務器端接收到這個確認包之后,關閉連接,進入 CLOSED 狀態。
2. TCP揮手為什么需要四次呢?
舉個例子吧! 假設小明和小紅打電話聊天,差不多要結束了:
圖片
小明和小紅打電話聊天,通話差不多要結束時,小紅說“我沒啥要說的了”,小明回答“我知道了”。但是小明可能還會有要說的話,小紅不能要求小明跟著自己的節奏結束通話,于是小明可能又嘰嘰歪歪說了一通,最后小明說“我說完了”,小紅回答“知道了”,這樣通話才算結束。”
3. TIME-WAIT 狀態為什么需要等待 2MSL
MSL,Maximum Segment Lifetime,是指一個 TCP 報文段在網絡中存活的最長時間、 2MSL,即兩個最大段生命周期。我們先回頭看看揮手這張圖:
圖片
- 第一個 MSL 確保所有在網絡中延遲的報文段(包括 FIN 和 ACK)能夠到達。
- 第二個 MSL 確保如果對方未收到 ACK 而重傳 FIN,該報文能夠到達并被正確處理。
專業點說,等待2MSL是為了確保 TCP 連接的可靠性和一致性。
3.1. 確保最后的 ACK 能夠被對方接收
當主動關閉的一方發送最后一個 ACK 后,如果這個 ACK 報文在傳輸過程中丟失,另一方會重新發送 FIN 報文。TIME-WAIT 狀態的 2MSL 時間足夠長,可以確保如果對方沒有收到 ACK,重發的 FIN 報文仍然能夠被接收到并處理,重新發送 ACK。如果主動關閉的一方在發送 ACK 后立即關閉了連接,那么對方如果重發 FIN,將不會收到響應,可能導致連接未能正常關閉。
3.2 防止舊的重復報文段影響新連接
TCP 連接的每個報文段都有一個序列號。如果一個 TCP 連接在關閉后立即被重新建立,而之前的連接中傳輸的某些報文由于網絡延遲而滯后到達,這些舊的報文段可能會被誤認為是新連接的一部分,從而引起混亂。TIME-WAIT 狀態等待 2MSL 的時間,足夠讓網絡中所有舊的報文段都過期,從而避免它們對新連接造成干擾。
3.3 一些類似的后端思想
郵件確認鏈接:
在用戶注冊或重置密碼時,系統通常會發送一封確認郵件,要求用戶點擊鏈接以驗證其操作。這一過程可能設置一個有效期,在有效期內,如果用戶沒有完成確認,操作將被取消。這類似于 TIME-WAIT 狀態中的等待,以確保操作的確認和安全。































