java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手
感謝牛客網(wǎng)網(wǎng)友提供的面試經(jīng)驗(yàn)!
1. 解釋一下TCP三次握手四次揮手
圖片來(lái)源于微信公眾號(hào):碼農(nóng)求職小助手
答: 嗯(稍作思考)…
三次握手簡(jiǎn)單來(lái)說(shuō),在數(shù)據(jù)傳輸開(kāi)始前:
第一次握手:客戶(hù)端向服務(wù)端發(fā)送一段用來(lái)連接請(qǐng)求的報(bào)文,其中SYN=1,ACK=0。
第二次握手:服務(wù)器端接收之后,如果同意連接。則返回一段確認(rèn)的報(bào)文,SYN=1,ACK=1。
第三次握手: 客戶(hù)端收到服務(wù)端的確認(rèn)后,還要再次向服務(wù)段給出確認(rèn),ACK=1。
三次握手完畢后,客戶(hù)端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。
三次握手簡(jiǎn)單來(lái)說(shuō),在數(shù)據(jù)傳輸開(kāi)始前:
第一次握手:SYN=1(seq=x)SYN=1表示請(qǐng)求連接,seq=x為隨機(jī)選取序號(hào),發(fā)送端由CLOSE進(jìn)入FIN_SENT狀態(tài)。
第二次握手:ACK=1(ack=x+1),ACK=1表示確認(rèn)連接,返回序列號(hào)加1是為了讓客戶(hù)端確認(rèn)我接受到的信息是你發(fā)送的。SYN=1(seq=y),代表服務(wù)端也請(qǐng)求連接,并返回一個(gè)自己指定的序列號(hào)。服務(wù)端由LISTEN進(jìn)入SYN_RECD狀態(tài)。
第三次握手:ACK=1(seq=x+1,ack=y+1)ACK=1表示確認(rèn)連接;ack=y+1是為了驗(yàn)證傳輸?shù)臏?zhǔn)確性,seq=x+1(前面發(fā)送的FIN報(bào)文段需要消耗一個(gè)序號(hào));客戶(hù)端由SYN_SENT進(jìn)入ESTABLISHED階段。服務(wù)端收到ACK后進(jìn)入ESTABLISH階段。
四次握手簡(jiǎn)單來(lái)說(shuō),在數(shù)據(jù)傳輸結(jié)束后:
第一次揮手:客戶(hù)端發(fā)送一個(gè)用來(lái)關(guān)閉客戶(hù)端到服務(wù)端的數(shù)據(jù)傳送的報(bào)文。FIN=1。
第二次揮手:服務(wù)端收到FIN包后,發(fā)送一個(gè)確認(rèn)包給對(duì)方,ACK=1。
第三次揮手:服務(wù)端發(fā)送一個(gè)用來(lái)關(guān)閉服務(wù)端到客戶(hù)端的數(shù)據(jù)傳送的報(bào)文,FIN=1,ACK=1。
第四次揮手:客戶(hù)端收到FIN后,發(fā)送一個(gè)確認(rèn)包,ACK=1。之后等待2MSL(MSL最長(zhǎng)報(bào)文段壽命)后,保證報(bào)文段能夠達(dá)到B,再進(jìn)入關(guān)閉狀態(tài)。
至此,完成四次揮手,客戶(hù)端與服務(wù)器才正式結(jié)束數(shù)據(jù)傳輸。
四次握手詳細(xì)來(lái)說(shuō),在數(shù)據(jù)傳輸結(jié)束后:
第一次揮手:FIN=1(seq=u)FIN=1表示要求釋放連接;seq=u,u等于前面已經(jīng)傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1。客戶(hù)端由由ESTABLISHED進(jìn)入FIN_WAIT_1階段。
第二次揮手:ACK=1(ack=u+1,seq=v)ACK=1表明確認(rèn)字段才有效;確認(rèn)號(hào)為ack=u+1,seq=v,等于服務(wù)端前面已經(jīng)傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1。服務(wù)端由由ESTABLISHED進(jìn)入CLOSE_WAIT階段。
第三次揮手:ACK=1,FIN=1(ack=u+1,seq=w)seq=w(半關(guān)閉狀態(tài)下可能又有數(shù)據(jù)傳入)。服務(wù)端進(jìn)入LAST_ACKj階段,客戶(hù)端進(jìn)入FIN_WAIT_2狀態(tài),
第四次揮手:ACK=1(ack=w+1,seq=u+1)seq=w+1(確認(rèn)序號(hào)),seq=u+1(前面發(fā)送的FIN報(bào)文段需要消耗一個(gè)序號(hào))。客戶(hù)端等待2MSL(MSL最長(zhǎng)報(bào)文段壽命)后,保證報(bào)文段能夠達(dá)到B,進(jìn)入CLOSE狀態(tài)。最后服務(wù)端收到報(bào)文后進(jìn)入CLOSE之后。
二. 解釋一下SYN、ACK 、FIN 、seq和ack
同步SYN:連接建立時(shí)用于同步序號(hào)。當(dāng)SYN=1,ACK=0時(shí)表示:這是一個(gè)連接請(qǐng)求報(bào)文段。若同意連接,則在響應(yīng)報(bào)文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個(gè)連接請(qǐng)求,或連接接受報(bào)文。SYN這個(gè)標(biāo)志位只有在TCP建產(chǎn)連接時(shí)才會(huì)被置1,握手完成后SYN標(biāo)志位被置0。
確認(rèn)ACK:占1位,僅當(dāng)ACK=1時(shí),確認(rèn)號(hào)字段才有效。ACK=0時(shí),確認(rèn)號(hào)無(wú)效。
終止FIN:用來(lái)釋放一個(gè)連接。FIN=1表示:此報(bào)文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放運(yùn)輸連接。
序列號(hào)seq:占4個(gè)字節(jié),用來(lái)標(biāo)記數(shù)據(jù)段的順序,TCP把連接中發(fā)送的所有數(shù)據(jù)字節(jié)都編上一個(gè)序號(hào),第一個(gè)字節(jié)的編號(hào)由本地隨機(jī)產(chǎn)生;給字節(jié)編上序號(hào)后,就給每一個(gè)報(bào)文段指派一個(gè)序號(hào);序列號(hào)seq就是這個(gè)報(bào)文段中的第一個(gè)字節(jié)的數(shù)據(jù)編號(hào)。
確認(rèn)號(hào)ack:占4個(gè)字節(jié),期待收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào);序列號(hào)表示報(bào)文段攜帶數(shù)據(jù)的第一個(gè)字節(jié)的編號(hào);而確認(rèn)號(hào)指的是期望接收到下一個(gè)字節(jié)的編號(hào);因此當(dāng)前報(bào)文段最后一個(gè)字節(jié)的編號(hào)+1即為確認(rèn)號(hào)。
PS:ACK、SYN和FIN這些大寫(xiě)的單詞表示標(biāo)志位,其值要么是1,要么是0;ack、seq小寫(xiě)的單詞表示序號(hào)。原文鏈接:link.
三. 為什么是三次握手,可以是兩次嗎?
不可以(非常堅(jiān)定的語(yǔ)氣)。假如以?xún)纱挝帐纸⑦B接,服務(wù)端在某一時(shí)刻突然收到了一個(gè)來(lái)自被客戶(hù)端卡了很久已經(jīng)丟棄的SYN包,服務(wù)端的操作是返回SYN+ACK并且進(jìn)入工作狀態(tài)。客戶(hù)端收到反饋后,無(wú)法告訴服務(wù)端這是錯(cuò)誤的SYN的包,會(huì)造成資源的浪費(fèi)。
四. 為什么斷開(kāi)連接需要四次揮手?
答:因?yàn)樵诳蛻?hù)端發(fā)送給服務(wù)端FIN包后,服務(wù)端返回的FIN和ACK包是分開(kāi)發(fā)送的。為什么要分開(kāi)呢?因?yàn)榭蛻?hù)端發(fā)送給服務(wù)端FIN包后,只表示客戶(hù)端已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了,但是另一個(gè)方向上可能還會(huì)有數(shù)據(jù)傳輸進(jìn)來(lái)。所以第二次和第三次揮手分開(kāi)發(fā)送,服務(wù)端先給出ACK確認(rèn)信號(hào),表示已經(jīng)收到FIN請(qǐng)求,然后當(dāng)自己也可以結(jié)束的時(shí)候,再次發(fā)送FIN信號(hào)。是為了為未傳輸完畢的數(shù)據(jù)預(yù)留時(shí)間,所以需要揮手交互需要四次。
五. 為什么 TIME-WAIT 狀態(tài)必須等待 2MSL 的時(shí)間呢?
為了保證 A 發(fā)送的最后一個(gè) ACK 報(bào)文段能夠到達(dá) B。 A 發(fā)送的最后一個(gè) ACK 報(bào)文段有可能丟失,因而使處在 LAST-ACK 狀態(tài)的 B 收不到對(duì)已發(fā)送的 FIN + ACK 報(bào)文段的確認(rèn)。B 會(huì)超時(shí)重傳這個(gè) FIN+ACK 報(bào)文段,而 A 就能在 2MSL 時(shí)間內(nèi)(超時(shí) + 1MSL 傳輸)收到這個(gè)重傳的 FIN+ACK 報(bào)文段。接著 A 重傳一次確認(rèn),重新啟動(dòng) 2MSL 計(jì)時(shí)器。最后,A 和 B 都正常進(jìn)入到 CLOSED 狀態(tài)。如果 A 在 TIME-WAIT 狀態(tài)不等待一段時(shí)間,而是在發(fā)送完 ACK 報(bào)文段后立即釋放連接,那么就無(wú)法收到 B 重傳的 FIN + ACK 報(bào)文段,因而也不會(huì)再發(fā)送一次確認(rèn)報(bào)文段,這樣,B 就無(wú)法按照正常步驟進(jìn)入 CLOSED 狀態(tài)。
防止已失效的連接請(qǐng)求報(bào)文段出現(xiàn)在本連接中。A 在發(fā)送完最后一個(gè) ACK 報(bào)文段后,再經(jīng)過(guò)時(shí)間 2MSL,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失。這樣就可以使下一個(gè)連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求報(bào)文段。
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java数组长度最大值_java 数组排
- 下一篇: java 右键卡死_为什么右键单击不适用