TCP三次握手,四次揮手詳解以及相關面試問題

TCP 三次握手

TCP三次握手圖解:

在這裏插入圖片描述

TCP三次握手概述:

首先要明白兩次握手是必須的,如果只有一次握手,無法建立可靠的連接,因爲並不知道另一方有沒有收到信息,所以兩次握手是必須的。

1.第一次握手客戶端向服務器發送請求,服務器接收到請求
客戶端 ——> 服務端 : SYN = 1 , seq = x

SYN = 1 代表同步請求,seq則是發送的序列號(必須發送序列號,因爲序列號可以避免因網絡延遲帶來的信號混亂)

2.第二次握手服務器接受請求,向客戶端發送同步信號
服務端 ——> 客戶端: SYN = 1, ACK = 1, seq = y, ack = x + 1

SYN = 1 代表同步請求,seq代表服務端發出報文段的序列號,ack則是確認號(確認號只有在 ACK = 1 的情況下才有效).
SYN = 1 , ACK = 1代表這是對客戶端發來的同步請求的回覆

3.第三次握手客戶端向服務器發送準備完成信號
客戶端 ——> 服務端: ACK = 1, seq = x + 1 , ack = y + 1

此時的 SYN = 0, 說明此信號已經不是同步請求,而是互相傳送數據的確認,第三次握手可以避免因網絡延時問題造成的服務器空等待,也可以避免第二次握手信號丟失導致服務器錯誤傳輸數據。


TCP 四次揮手

TCP四次揮手圖解:

在這裏插入圖片描述

TCP四次揮手概述:

TCP關閉連接必須是可靠的,也就是讓客戶端和服務端都可靠的關閉連接。

如果只有一次揮手客戶端就直接關閉,那麼可能數據還沒有傳輸完成,服務器還有可能空等待

如果是兩次揮手數據也可能沒有傳完

如果是三次揮手這一次的揮手可能丟失,這樣服務器雖然正常關閉,但是客戶
端卻一直空等待,認爲服務器還在傳數據

第四次揮手可以防止第三次揮手的信號丟失

等待2ML客戶端第四次揮手後等待2MSL, 可以防止第四次揮手信號的丟失

四次揮手分析:

1.第一次揮手客戶端告知服務器,自己傳輸完成,讓服務器關閉
客戶端 ——> 服務端: seq = u, FIN = 1

2.第二次揮手服務器得知客戶端將結束連接,返回確認消息,並持續傳送最後的數據
服務端 ——> 客戶端: seq = v, ACK = 1, ack = u + 1

3.第三次揮手服務器將最後的數據傳送完成,向客戶端發送確認消息,讓客戶端關閉
服務端 ——> 客戶端: seq = w, FIN = 1, ACK = 1, ack = u + 1

4.第四次揮手客戶端收到消息,等待2MSL之後,如果沒有服務端重發的ACK消息,自己就關閉
客戶端 ——> 服務端: seq = u + 1, ACK = 1, ack = w + 1

TCP的四次揮手在本質上都是爲了讓客戶端與服務器正常的關閉。

那麼爲什麼客戶端需要等待2MSL再關閉
因爲服務端可能沒有收到最後一次發來的ACK,那麼他就不會關閉,這樣客戶端提前關閉了,服務端卻一直再運行消耗着資源。
讓客戶端等待2MSL再關閉,如果期間服務端沒有收到最後一次發來的ACK,那麼會有超時重傳機制,也就是相當於重新進行第三次揮手,那麼客戶端在2MSL的時間內也回重新收到ACK,然後再一次進行第四次揮手讓服務器關閉

注意:服務端在進行第三次揮手後,立刻會啓動超時重傳機制;客戶端在發出第四次揮手後,立刻就會啓動2MSL的等待


TCP三次握手,四次揮手常見面試問題:

1.爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?(爲什麼握手需要四次?

主要是因爲關閉連接時,像比於建立連接時可能會有數據還沒有傳輸完成的情況。如果只有三次揮手,第三次揮手信號如果因網絡延遲丟失,此時服務器已經關閉,而客戶端還認爲還有數據沒有傳完,仍在等待

2.爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

如果不等待2MSL客戶端就直接結束, 第四次揮手信號丟失,服務端將會一直等待;讓客戶端等待2MSL時間,即便是第四次揮手信號丟失,服務端也會開啓超時重傳機制,重新發送第三次揮手的信號(2MSL的時間可以讓信號丟失的情況下,超時重傳機制重新發的信號也能夠到達)。

3.爲什麼不能用兩次握手進行連接?

如果只有兩次握手,如果第二次握手的信號丟失,那麼客戶端將不知道是否已經連接上服務端,會形成死鎖

4.如果已經建立了連接,但是客戶端突然出現故障了怎麼辦?

服務端會有一個超時關閉機制,如果限定時間內沒有接收到客戶端的數據傳送,那麼就認爲客戶端已經出現故障, 服務器自動斷開