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