<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          女人,只會(huì)影響我拔劍的速度

          共 4178字,需瀏覽 9分鐘

           ·

          2021-10-17 04:19

          大家好,我是3y

          最近的確有點(diǎn)小忙,很多東西都是剛上手,暫時(shí)沒辦法梳理成文章跟大家分享。不過(guò),面試系列是不能停的。今天更新的是TCP基礎(chǔ)(這個(gè)知識(shí)點(diǎn)很高頻,能貫穿我們整個(gè)職業(yè)生涯

          不廢話了,開始吧

          第三十九次面試

          候選者面試官你好,請(qǐng)問(wèn)面試可以開始了嗎

          面試官:嗯,開始吧

          面試官今天來(lái)聊聊TCP吧,TCP的各個(gè)狀態(tài)還有印象嗎?

          候選者:還有些許印象的,要不我就來(lái)簡(jiǎn)單說(shuō)下TCP的三次握手和四次揮手的流程吧

          候選者:說(shuō)完這兩個(gè)流程,就能把TCP的狀態(tài)給涵蓋上了

          面試官:可以吧

          候選者:在說(shuō)TCP的三次握手和四次揮手之前,我先給你畫下TCP的頭部格式唄(:

          候選者:對(duì)于TCP三次握手和四次揮手,我們最主要的就是關(guān)注TCP頭部的序列號(hào)、確認(rèn)號(hào)以及幾個(gè)標(biāo)記位(SYN/FIN/ACK/RST)

          候選者:序列號(hào):在初次建立連接的時(shí)候,客戶端和服務(wù)端都會(huì)為「本次的連接」隨機(jī)初始化一個(gè)序列號(hào)。(縱觀整個(gè)TCP流程中,序列號(hào)可以用來(lái)解決網(wǎng)絡(luò)包亂序的問(wèn)題)

          候選者:確認(rèn)號(hào):該字段表示「接收端」告訴「發(fā)送端」對(duì)上一個(gè)數(shù)據(jù)包已經(jīng)成功接收(確認(rèn)號(hào)可以?來(lái)解決網(wǎng)絡(luò)包丟失的問(wèn)題)

          候選者:而標(biāo)記位就很好理解啦。SYN為1時(shí),表示希望創(chuàng)建連接。ACK為1時(shí),確認(rèn)號(hào)字段有效。FIN為1時(shí),表示希望斷開連接。RST為1時(shí),表示TCP連接出現(xiàn)異常,需要斷開。

          候選者:下面就先從三次握手開始吧,期間我也會(huì)在三次握手中涉及到的TCP狀態(tài)也說(shuō)下的。

          候選者:TCP三次握手的過(guò)程其實(shí)就是在:確認(rèn)通信雙方(客戶端和服務(wù)端)的序列號(hào)

          候選者:它的過(guò)程是這樣的

          候選者:在最開始的時(shí)候,客戶端和服務(wù)端都處于 CLOSE 狀態(tài)

          候選者:服務(wù)器主動(dòng)監(jiān)聽某個(gè)端口,處于 LISTEN 狀態(tài)

          候選者:客戶端會(huì)隨機(jī)生成出序列號(hào)(這里的序列號(hào)一般叫做client_isn),并且把標(biāo)志位設(shè)置為SYN(意味著要連接),然后把該報(bào)文發(fā)送給服務(wù)端

          候選者:客戶端發(fā)送完SYN報(bào)文以后,自己便進(jìn)入了 SYN_SEND 狀態(tài)

          候選者:服務(wù)端接收到了客戶端的請(qǐng)求之后,自己也初始化對(duì)應(yīng)的序列號(hào)(這里的序列號(hào)一般叫做 server_isn)

          候選者:在「確認(rèn)號(hào)」字段里填上client_isn + 1(相當(dāng)于告訴客戶端,已經(jīng)收到了發(fā)送過(guò)來(lái)的序列號(hào)了) ,并且把 SYN 和 ACK 標(biāo)記位都點(diǎn)亮(置為1)

          候選者:把該報(bào)文發(fā)送客戶端,服務(wù)端的狀態(tài)變成 SYN-REVD 狀態(tài)

          候選者:客戶端收到服務(wù)端發(fā)送的報(bào)文后,就知道服務(wù)端已經(jīng)接收到了自己的序列號(hào)(通過(guò)確認(rèn)號(hào)就可以知道),并且接收到了服務(wù)端的序列號(hào)(server_isn)

          候選者:此時(shí),客戶端需要告訴服務(wù)端自己已經(jīng)接收到了他發(fā)送過(guò)來(lái)的序列號(hào),所以在「確認(rèn)號(hào)」字段上填上server_isn+1,并且標(biāo)記位 ACK 為1

          候選者:客戶端在發(fā)送報(bào)文之后,進(jìn)入 ESTABLISHED 狀態(tài),而服務(wù)端接收到客戶端的報(bào)文之后,也進(jìn)入 ESTABLISHED 狀態(tài)

          候選者:這就是三次握手的過(guò)程以及涉及到的TCP狀態(tài)

          候選者:總結(jié)下來(lái),就是雙方都把自身的序列號(hào)發(fā)給對(duì)方,看對(duì)方能不能接收到。如果「確認(rèn)可以」,那就可以正常通信。(三次握手這個(gè)過(guò)程就可以看到雙方都有接收和發(fā)送的能力)

          面試官那兩次握手行嗎?

          候選者:兩次握手只能保證客戶端的序列號(hào)成功被服務(wù)端接收,而服務(wù)端是無(wú)法確認(rèn)自己的序列號(hào)是否被客戶端成功接收。所以是不行的(:

          面試官了解了,那我想問(wèn)問(wèn)序列號(hào)為什么是隨機(jī)的?以及序列號(hào)是怎么生成的?

          候選者:一方面為了安全性(隨機(jī)ISN能避免非同一網(wǎng)絡(luò)的攻擊),另一方面可以讓通信雙方能夠根據(jù)序號(hào)將「不屬于」本連接的報(bào)文段丟棄

          候選者:序列號(hào)怎么生成的?這…隨便猜下就應(yīng)該跟「時(shí)鐘」和TCP頭部的某些屬性做運(yùn)算生成的吧,類似于雪花算法(:具體我忘了。

          面試官既然網(wǎng)絡(luò)是不可靠的,那建立連接不是會(huì)經(jīng)過(guò)三次握手嗎?那要是在中途丟了,怎么辦?

          候選者:假設(shè)第一個(gè)包丟了,客戶端發(fā)送給服務(wù)端的 SYN 包丟了(簡(jiǎn)而要之就是服務(wù)端沒接收到客戶端的SYN包)

          候選者:客戶端遲遲收不到服務(wù)端的ACK包,那會(huì)周期性超時(shí)重傳,直到收到服務(wù)端的ACK

          候選者:假設(shè)第二個(gè)包丟了,服務(wù)端發(fā)送的SYN+ACK包丟了(簡(jiǎn)而要之就是客戶端沒接收到服務(wù)端的SYN+ACK包)

          候選者:服務(wù)端遲遲收不到客戶端的ACK包,那會(huì)周期性超時(shí)重傳,直到收到客戶端的ACK

          候選者:假設(shè)第三個(gè)包丟了(ACK包),客戶端發(fā)送完第三個(gè)包后單方面進(jìn)入了 ESTABLISHED 狀態(tài),而服務(wù)端也認(rèn)為此時(shí)連接是正常的,但第三個(gè)包沒到達(dá)服務(wù)端

          候選者:一、如果此時(shí)客戶端與服務(wù)端都還沒數(shù)據(jù)發(fā)送,那服務(wù)端會(huì)認(rèn)為自己發(fā)送的SYN+ACK的包沒發(fā)送至客戶端,所以會(huì)超時(shí)重傳自己的SYN+ACK包

          候選者:二、如果這時(shí)候客戶端已經(jīng)要發(fā)送數(shù)據(jù)了,服務(wù)端接收到了ACK + Data數(shù)據(jù)包,那自然就切換到 ESTABLISHED 狀態(tài)下,并且接收客戶端的Data數(shù)據(jù)包

          候選者:三、如果此時(shí)服務(wù)端要發(fā)送數(shù)據(jù)了,但發(fā)送不了,會(huì)一直周期性超時(shí)重傳SYN + ACK,直到接收到客戶端的ACK包

          面試官嗯,是不是要講下四次揮手了?

          候選者:嗯,在建立完連接之后,客戶端和服務(wù)端雙方都處于 ESTABLISHED 狀態(tài)狀態(tài)

          候選者:斷開連接雙方都有權(quán)利的,下面我還是以客戶端主動(dòng)斷開為例好啦。

          候選者:客戶端打算關(guān)閉連接,會(huì)發(fā) FIN 報(bào)文給服務(wù)端(其實(shí)就是把標(biāo)志位 FIN 點(diǎn)亮),客戶端發(fā)送完之后,就進(jìn)入FIN_WAIT_1狀態(tài)

          候選者:服務(wù)端收到 FIN 報(bào)文之后,回復(fù) ACK 報(bào)文給客戶端(表示已經(jīng)收到了),服務(wù)端發(fā)送完之后,就進(jìn)入 CLOSE_WAIT 狀態(tài)

          候選者:客戶端接收到服務(wù)端的 ACK 報(bào)文,就進(jìn)入了 FIN_WAIT_2 狀態(tài)

          候選者:這時(shí)候,服務(wù)器可能還有數(shù)據(jù)要發(fā)送給客戶端,等服務(wù)端確認(rèn)自己已經(jīng)沒有數(shù)據(jù)返回給客戶端之后,就發(fā)送FIN報(bào)文給客戶端了,自己進(jìn)入 LAST_ACK 狀態(tài)

          候選者:客戶端收到服務(wù)端的FIN報(bào)文之后,回應(yīng)ACK報(bào)文,自己進(jìn)入 TIME_WAIT 狀態(tài)

          候選者:服務(wù)端收到客戶端的ACK報(bào)文之后,服務(wù)端就進(jìn)入 CLOSE 狀態(tài)

          候選者:客戶端在TIME_WAIT等到2MSL,也進(jìn)入了 CLOSE 狀態(tài)

          候選者:四次揮手的流程到這里就結(jié)束了,結(jié)合三次握手,TCP的各個(gè)狀態(tài)也已經(jīng)說(shuō)完了。

          面試官:嗯嗯,剛聊完四次揮手嘛,那你覺得為什么是四次呢?

          候選者:其實(shí)很好理解,當(dāng)客戶端第一次發(fā)送 FIN 報(bào)文之后,只是代表著客戶端不再發(fā)送數(shù)據(jù)給服務(wù)端,但此時(shí)客戶端還是有接收數(shù)據(jù)的能力的。而服務(wù)端收到FIN報(bào)文的時(shí)候,可能還有數(shù)據(jù)要傳輸給客戶端,所以只能先回復(fù) ACK給客戶端

          候選者:等到服務(wù)端不再有數(shù)據(jù)發(fā)送給客戶端時(shí),才發(fā)送 FIN 報(bào)文給客戶端,表示可以關(guān)閉了。

          候選者:所以,一來(lái)一回就四次了。

          面試官從四次揮手的流程上來(lái)看,有個(gè) TIME_WAIT 狀態(tài),你知道這個(gè)狀態(tài)干什么用的嗎?(等待 2MSL)

          候選者:主要有兩個(gè)原因吧。1.保證最后的 ACK 報(bào)文 「接收方」一定能收到(如果收不到,對(duì)方會(huì) 重發(fā) FIN 報(bào)文)2. 確保在創(chuàng)建新連接時(shí),先前網(wǎng)絡(luò)中殘余的數(shù)據(jù)都丟失了

          候選者:其實(shí)也比較好理解的。就正如我們重啟服務(wù)器一樣,會(huì)先優(yōu)雅關(guān)閉各種資源,再留有一段時(shí)間,希望在這段時(shí)間內(nèi),資源是正常關(guān)閉的,這樣重啟服務(wù)器(或者發(fā)布)就基本認(rèn)為不會(huì)影響到線上運(yùn)行了。

          面試官假設(shè) TIME_WAIT 狀態(tài)多過(guò)會(huì)有什么危害?怎么解決呢?

          候選者:從流程上看, TIME_WAIT 狀態(tài) 只會(huì)出現(xiàn)在 主動(dòng)發(fā)起 關(guān)閉連接的一方。危害就是會(huì)占用內(nèi)存資源和端口唄(畢竟在等待嘛),解決的話,有Linux參數(shù)可以設(shè)置,具體忘了額。

          面試官:今天最后再問(wèn)個(gè)問(wèn)題吧,我們常說(shuō)TCP連接,那這個(gè)連接到底是什么?你是怎么理解的?

          候選者:其實(shí)從三次握手可以發(fā)現(xiàn)的是,TCP建立連接無(wú)非就是交換了雙方的狀態(tài)(比如序列號(hào))。然后就沒有然后了…連接本質(zhì)上「只是互相維持一個(gè)狀態(tài),有連接特性」

          面試官:好吧。

          對(duì)線面試官》系列目前已經(jīng)連載38篇啦,這是一個(gè)講人話面試系列

          網(wǎng)盤里有【簡(jiǎn)歷模板】、【原創(chuàng)電子書】等內(nèi)容...如果看不太懂,多半是基礎(chǔ)不夠扎實(shí),建議去網(wǎng)盤領(lǐng)份資料看看!

          怎樣偷偷努力 驚艷所有人?

          掃碼關(guān)注【對(duì)線面試官
          關(guān)注后回復(fù)「888」還可獲取網(wǎng)盤地址喲!
          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  囯产精品久久久久久久免牛肉蒲团 | 99久久无码一区 | 高清一区二区三区 | 久久久久久久久久久久久久久女乱 | 国产不卡视 |