iOS常問面試題:三次握手與四次揮手

在面試中,三次握手和四次揮手可以說是問的最頻繁的一個(gè)知識(shí)點(diǎn)了镰烧,我相信大家也都看過很多關(guān)于三次握手與四次揮手的文章拢军,今天的這篇文章,重點(diǎn)是圍繞著面試怔鳖,我們應(yīng)該掌握哪些比較重要的點(diǎn)茉唉,哪些是比較被面試官給問到的,我覺得如果你能把我下面列舉的一些點(diǎn)都記住败砂、理解赌渣,我想就差不多了。

三次握手

當(dāng)面試官問你為什么需要有三次握手昌犹、三次握手的作用、講講三次三次握手的時(shí)候览芳,我想很多人會(huì)這樣回答:

首先很多人會(huì)先講下握手的過程:

  1. 第一次握手: 客戶端給服務(wù)器發(fā)送一個(gè) SYN 報(bào)文斜姥。

  2. 第二次握手: 服務(wù)器收到 SYN 報(bào)文之后,會(huì)應(yīng)答一個(gè) SYN+ACK 報(bào)文沧竟。

  3. 第三次握手: 客戶端收到 SYN+ACK 報(bào)文之后铸敏,會(huì)回應(yīng)一個(gè) ACK 報(bào)文。

  4. 服務(wù)器收到 ACK 報(bào)文之后悟泵,三次握手建立完成杈笔。

作用是為了確認(rèn)雙方的接收與發(fā)送能力是否正常。

這里我順便解釋一下為啥只有三次握手才能確認(rèn)雙方的接受與發(fā)送能力是否正常糕非,而兩次卻不可以:

第一次握手: 客戶端發(fā)送網(wǎng)絡(luò)包蒙具,服務(wù)端收到了。這樣服務(wù)端就能得出結(jié)論:客戶端的發(fā)送能力朽肥、服務(wù)端的接收能力是正常的禁筏。

第二次握手: 服務(wù)端發(fā)包,客戶端收到了衡招。這樣客戶端就能得出結(jié)論:服務(wù)端的接收篱昔、發(fā)送能力,客戶端的接收始腾、發(fā)送能力是正常的州刽。不過此時(shí)服務(wù)器并不能確認(rèn)客戶端的接收能力是否正常。

第三次握手: 客戶端發(fā)包浪箭,服務(wù)端收到了穗椅。這樣服務(wù)端就能得出結(jié)論:客戶端的接收、發(fā)送能力正常山林,服務(wù)器自己的發(fā)送房待、接收能力也正常邢羔。

因此,需要三次握手才能確認(rèn)雙方的接收與發(fā)送能力是否正常桑孩。

這樣回答其實(shí)也是可以的拜鹤,但我覺得,這個(gè)過程的我們應(yīng)該要描述的更詳細(xì)一點(diǎn)流椒,因?yàn)槿挝帐值倪^程中敏簿,雙方是由很多狀態(tài)的改變的,而這些狀態(tài)宣虾,也是面試官可能會(huì)問的點(diǎn)惯裕。所以我覺得在回答三次握手的時(shí)候,我們應(yīng)該要描述的詳細(xì)一點(diǎn)绣硝,而且描述的詳細(xì)一點(diǎn)意味著可以扯久一點(diǎn)蜻势。加分的描述我覺得應(yīng)該是這樣:

剛開始客戶端處于 closed 的狀態(tài),服務(wù)端處于 listen 狀態(tài)鹉胖。然后

  1. 第一次握手: 客戶端給服務(wù)端發(fā)一個(gè) SYN 報(bào)文握玛,并指明客戶端的初始化序列號(hào)ISN(c)。此時(shí)客戶端處于 SYN_Send 狀態(tài)甫菠。

  2. 第二次握手: 服務(wù)器收到客戶端的 SYN 報(bào)文之后挠铲,會(huì)以自己的 SYN 報(bào)文作為應(yīng)答,并且也是指定了自己的初始化序列號(hào) ISN(s)寂诱,同時(shí)會(huì)把客戶端的 ISN + 1 作為 ACK 的值拂苹,表示自己已經(jīng)收到了客戶端的 SYN,此時(shí)服務(wù)器處于 SYN_REVD 的狀態(tài)痰洒。

  3. 第三次握手: 客戶端收到 SYN 報(bào)文之后瓢棒,會(huì)發(fā)送一個(gè) ACK 報(bào)文,當(dāng)然带迟,也是一樣把服務(wù)器的 ISN + 1 作為 ACK 的值音羞,表示已經(jīng)收到了服務(wù)端的 SYN 報(bào)文,此時(shí)客戶端處于 establised 狀態(tài)仓犬。

  4. 服務(wù)器收到 ACK 報(bào)文之后嗅绰,也處于 establised 狀態(tài),此時(shí)搀继,雙方以建立起了鏈接窘面。

三次握手的作用

三次握手的作用也是有好多的,多記住幾個(gè)叽躯,保證不虧财边。例如:

  1. 確認(rèn)雙方的接受能力、發(fā)送能力是否正常点骑。

  2. 指定自己的初始化序列號(hào)酣难,為后面的可靠傳送做準(zhǔn)備谍夭。

  3. 如果是 https 協(xié)議的話,三次握手這個(gè)過程憨募,還會(huì)進(jìn)行數(shù)字證書的驗(yàn)證以及加密密鑰的生成到紧索。

單單這樣還不足以應(yīng)付三次握手,面試官可能還會(huì)問一些其他的問題菜谣,例如:

1珠漂、(ISN)是固定的嗎

三次握手的一個(gè)重要功能是客戶端和服務(wù)端交換ISN(Initial Sequence Number), 以便讓對方知道接下來接收數(shù)據(jù)的時(shí)候如何按序列號(hào)組裝數(shù)據(jù)。

如果ISN是固定的尾膊,攻擊者很容易猜出后續(xù)的確認(rèn)號(hào)媳危,因此 ISN 是動(dòng)態(tài)生成的。

2冈敛、什么是半連接隊(duì)列

服務(wù)器第一次收到客戶端的 SYN 之后待笑,就會(huì)處于 SYN_RCVD 狀態(tài),此時(shí)雙方還沒有完全建立其連接抓谴,服務(wù)器會(huì)把此種狀態(tài)下請求連接放在一個(gè)隊(duì)列里滋觉,我們把這種隊(duì)列稱之為半連接隊(duì)列。當(dāng)然還有一個(gè)全連接隊(duì)列齐邦,就是已經(jīng)完成三次握手,建立起連接的就會(huì)放在全連接隊(duì)列中第租。如果隊(duì)列滿了就有可能會(huì)出現(xiàn)丟包現(xiàn)象措拇。

這里在補(bǔ)充一點(diǎn)關(guān)于SYN-ACK 重傳次數(shù)的問題:服務(wù)器發(fā)送完SYN-ACK包,如果未收到客戶確認(rèn)包慎宾,服務(wù)器進(jìn)行首次重傳丐吓,等待一段時(shí)間仍未收到客戶確認(rèn)包,進(jìn)行第二次重傳趟据,如果重傳次數(shù)超 過系統(tǒng)規(guī)定的最大重傳次數(shù)券犁,系統(tǒng)將該連接信息從半連接隊(duì)列中刪除。注意汹碱,每次重傳等待的時(shí)間不一定相同粘衬,一般會(huì)是指數(shù)增長,例如間隔時(shí)間為 1s, 2s, 4s, 8s, ….

3咳促、三次握手過程中可以攜帶數(shù)據(jù)嗎

很多人可能會(huì)認(rèn)為三次握手都不能攜帶數(shù)據(jù)稚新,其實(shí)第三次握手的時(shí)候,是可以攜帶數(shù)據(jù)的跪腹。也就是說褂删,第一次、第二次握手不可以攜帶數(shù)據(jù)冲茸,而第三次握手是可以攜帶數(shù)據(jù)的屯阀。

為什么這樣呢?大家可以想一個(gè)問題缅帘,假如第一次握手可以攜帶數(shù)據(jù)的話,如果有人要惡意攻擊服務(wù)器难衰,那他每次都在第一次握手中的 SYN 報(bào)文中放入大量的數(shù)據(jù)钦无,因?yàn)楣粽吒揪筒焕矸?wù)器的接收、發(fā)送能力是否正常召衔,然后瘋狂著重復(fù)發(fā) SYN 報(bào)文的話铃诬,這會(huì)讓服務(wù)器花費(fèi)很多時(shí)間、內(nèi)存空間來接收這些報(bào)文苍凛。也就是說趣席,第一次握手可以放數(shù)據(jù)的話,其中一個(gè)簡單的原因就是會(huì)讓服務(wù)器更加容易受到攻擊了醇蝴。

而對于第三次的話宣肚,此時(shí)客戶端已經(jīng)處于 established 狀態(tài),也就是說悠栓,對于客戶端來說霉涨,他已經(jīng)建立起連接了,并且也已經(jīng)知道服務(wù)器的接收惭适、發(fā)送能力是正常的了笙瑟,所以能攜帶數(shù)據(jù)頁沒啥毛病。

關(guān)于三次握手的癞志,https 的認(rèn)證過程能知道一下最好往枷,不過我就不說了,留著寫 http 面試相關(guān)時(shí)的文章再說凄杯。

四次揮手

四次揮手也一樣错洁,千萬不要對方一個(gè) FIN 報(bào)文,我方一個(gè) ACK 報(bào)文戒突,再我方一個(gè) FIN 報(bào)文屯碴,我方一個(gè) ACK 報(bào)文。然后結(jié)束膊存,最好是說的詳細(xì)一點(diǎn)导而,例如想下面這樣就差不多了,要把每個(gè)階段的狀態(tài)記好膝舅,我上次面試就被問了幾個(gè)了嗡载,呵呵。我答錯(cuò)了仍稀,還以為自己答對了洼滚,當(dāng)時(shí)還解釋的頭頭是道,呵呵技潘。

剛開始雙方都處于 establised 狀態(tài)遥巴,假如是客戶端先發(fā)起關(guān)閉請求千康,則:

  1. 第一次揮手: 客戶端發(fā)送一個(gè) FIN 報(bào)文,報(bào)文中會(huì)指定一個(gè)序列號(hào)铲掐。此時(shí)客戶端處于CLOSED_WAIT1狀態(tài)拾弃。

  2. 第二次握手: 服務(wù)端收到 FIN 之后,會(huì)發(fā)送 ACK 報(bào)文摆霉,且把客戶端的序列號(hào)值 + 1 作為 ACK 報(bào)文的序列號(hào)值豪椿,表明已經(jīng)收到客戶端的報(bào)文了,此時(shí)服務(wù)端處于CLOSE_WAIT2狀態(tài)携栋。

  3. 第三次揮手: 如果服務(wù)端也想斷開連接了搭盾,和客戶端的第一次揮手一樣,發(fā)給 FIN 報(bào)文婉支,且指定一個(gè)序列號(hào)鸯隅。此時(shí)服務(wù)端處于 LAST_ACK 的狀態(tài)。

  4. 第四次揮手: 客戶端收到 FIN 之后向挖,一樣發(fā)送一個(gè) ACK 報(bào)文作為應(yīng)答蝌以,且把服務(wù)端的序列號(hào)值 + 1 作為自己 ACK 報(bào)文的序列號(hào)值,此時(shí)客戶端處于 TIME_WAIT 狀態(tài)何之。需要過一陣子以確保服務(wù)端收到自己的 ACK 報(bào)文之后才會(huì)進(jìn)入 CLOSED 狀態(tài)

  5. 服務(wù)端收到 ACK 報(bào)文之后跟畅,就處于關(guān)閉連接了,處于 CLOSED 狀態(tài)溶推。

這里特別需要主要的就是TIME_WAIT這個(gè)狀態(tài)了碍彭,這個(gè)是面試的高頻考點(diǎn),就是要理解悼潭,為什么客戶端發(fā)送 ACK 之后不直接關(guān)閉,而是要等一陣子才關(guān)閉舞箍。這其中的原因就是舰褪,要確保服務(wù)器是否已經(jīng)收到了我們的 ACK 報(bào)文,如果沒有收到的話疏橄,服務(wù)器會(huì)重新發(fā) FIN 報(bào)文給客戶端占拍,客戶端再次收到 FIN 報(bào)文之后,就知道之前的 ACK 報(bào)文丟失了捎迫,然后再次發(fā)送 ACK 報(bào)文晃酒。

至于 TIME_WAIT 持續(xù)的時(shí)間至少是一個(gè)報(bào)文的來回時(shí)間。一般會(huì)設(shè)置一個(gè)計(jì)時(shí)窄绒,如果過了這個(gè)計(jì)時(shí)沒有再次收到 FIN 報(bào)文贝次,則代表對方成功就是 ACK 報(bào)文,此時(shí)處于 CLOSED 狀態(tài)彰导。

這里我給出每個(gè)狀態(tài)所包含的含義蛔翅,有興趣的可以看看敲茄。

LISTEN - 偵聽來自遠(yuǎn)方TCP端口的連接請求;

SYN-SENT -在發(fā)送連接請求后等待匹配的連接請求;

SYN-RECEIVED - 在收到和發(fā)送一個(gè)連接請求后等待對連接請求的確認(rèn);

ESTABLISHED - 代表一個(gè)打開的連接,數(shù)據(jù)可以傳送給用戶;

FIN-WAIT-1 - 等待遠(yuǎn)程TCP的連接中斷請求山析,或先前的連接中斷請求的確認(rèn);

FIN-WAIT-2 - 從遠(yuǎn)程TCP等待連接中斷請求;

CLOSE-WAIT - 等待從本地用戶發(fā)來的連接中斷請求;

CLOSING -等待遠(yuǎn)程TCP對連接中斷的確認(rèn);

LAST-ACK - 等待原來發(fā)向遠(yuǎn)程TCP的連接中斷請求的確認(rèn);

TIME-WAIT -等待足夠的時(shí)間以確保遠(yuǎn)程TCP接收到連接中斷請求的確認(rèn);

CLOSED - 沒有任何連接狀態(tài);

再放個(gè)三次握手與四次揮手的圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堰燎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笋轨,更是在濱河造成了極大的恐慌秆剪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爵政,死亡現(xiàn)場離奇詭異仅讽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茂卦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門何什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人等龙,你說我怎么就攤上這事处渣。” “怎么了蛛砰?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵罐栈,是天一觀的道長。 經(jīng)常有香客問我泥畅,道長荠诬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任位仁,我火速辦了婚禮柑贞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聂抢。我一直安慰自己钧嘶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布琳疏。 她就那樣靜靜地躺著有决,像睡著了一般。 火紅的嫁衣襯著肌膚如雪空盼。 梳的紋絲不亂的頭發(fā)上书幕,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音揽趾,去河邊找鬼台汇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的励七。 我是一名探鬼主播智袭,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掠抬!你這毒婦竟也來了吼野?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤两波,失蹤者是張志新(化名)和其女友劉穎瞳步,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腰奋,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡单起,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劣坊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘀倒。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖局冰,靈堂內(nèi)的尸體忽然破棺而出测蘑,到底是詐尸還是另有隱情,我是刑警寧澤康二,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布碳胳,位于F島的核電站,受9級特大地震影響沫勿,放射性物質(zhì)發(fā)生泄漏挨约。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一产雹、第九天 我趴在偏房一處隱蔽的房頂上張望诫惭。 院中可真熱鬧,春花似錦蔓挖、人聲如沸贝攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哈踱,卻和暖如春荒适,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背开镣。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工刀诬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓陕壹,卻偏偏與公主長得像质欲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子糠馆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容