摘要:第三次握手客戶端收到報(bào)文之后,會(huì)回應(yīng)一個(gè)報(bào)文。因此,需要三次握手才能確認(rèn)雙方的接收與發(fā)送能力是否正常。三次握手的作用三次握手的作用也是有好多的,多記住幾個(gè),保證不虧。也就是說(shuō),第一次第二次握手不可以攜帶數(shù)據(jù),而第三次握手是可以攜帶數(shù)據(jù)的。
在面試中,三次握手和四次揮手可以說(shuō)是問(wèn)的最頻繁的一個(gè)知識(shí)點(diǎn)了,我相信大家也都看過(guò)很多關(guān)于三次握手與四次揮手的文章,今天的這篇文章,重點(diǎn)是圍繞著面試,我們應(yīng)該掌握哪些比較重要的點(diǎn),哪些是比較被面試官給問(wèn)到的,我覺(jué)得如果你能把我下面列舉的一些點(diǎn)都記住、理解,我想就差不多了。
三次握手當(dāng)面試官問(wèn)你為什么需要有三次握手、三次握手的作用、講講三次三次握手的時(shí)候,我想很多人會(huì)這樣回答:
首先很多人會(huì)先講下握手的過(guò)程:
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ā)送能力是正常的。不過(guò)此時(shí)服務(wù)器并不能確認(rèn)客戶端的接收能力是否正常。
第三次握手:客戶端發(fā)包,服務(wù)端收到了。這樣服務(wù)端就能得出結(jié)論:客戶端的接收、發(fā)送能力正常,服務(wù)器自己的發(fā)送、接收能力也正常。
因此,需要三次握手才能確認(rèn)雙方的接收與發(fā)送能力是否正常。
這樣回答其實(shí)也是可以的,但我覺(jué)得,這個(gè)過(guò)程的我們應(yīng)該要描述的更詳細(xì)一點(diǎn),因?yàn)槿挝帐值倪^(guò)程中,雙方是由很多狀態(tài)的改變的,而這些狀態(tài),也是面試官可能會(huì)問(wèn)的點(diǎn)。所以我覺(jué)得在回答三次握手的時(shí)候,我們應(yīng)該要描述的詳細(xì)一點(diǎn),而且描述的詳細(xì)一點(diǎn)意味著可以扯久一點(diǎn)。加分的描述我覺(jué)得應(yīng)該是這樣:
剛開(kāi)始客戶端處于 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è)過(guò)程,還會(huì)進(jìn)行數(shù)字證書(shū)的驗(yàn)證以及加密密鑰的生成到。
單單這樣還不足以應(yīng)付三次握手,面試官可能還會(huì)問(wèn)一些其他的問(wèn)題,例如:
1、(ISN)是固定的嗎
三次握手的一個(gè)重要功能是客戶端和服務(wù)端交換ISN(Initial Sequence Number), 以便讓對(duì)方知道接下來(lái)接收數(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í)雙方還沒(méi)有完全建立其連接,服務(wù)器會(huì)把此種狀態(tài)下請(qǐng)求連接放在一個(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èn)題:?服務(wù)器發(fā)送完SYN-ACK包,如果未收到客戶確認(rèn)包,服務(wù)器進(jìn)行首次重傳,等待一段時(shí)間仍未收到客戶確認(rèn)包,進(jìn)行第二次重傳,如果重傳次數(shù)超 過(guò)系統(tǒng)規(guī)定的最大重傳次數(shù),系統(tǒng)將該連接信息從半連接隊(duì)列中刪除。注意,每次重傳等待的時(shí)間不一定相同,一般會(huì)是指數(shù)增長(zhǎng),例如間隔時(shí)間為 1s, 2s, 4s, 8s, ....
3、三次握手過(guò)程中可以攜帶數(shù)據(jù)嗎
很多人可能會(huì)認(rèn)為三次握手都不能攜帶數(shù)據(jù),其實(shí)第三次握手的時(shí)候,是可以攜帶數(shù)據(jù)的。也就是說(shuō),第一次、第二次握手不可以攜帶數(shù)據(jù),而第三次握手是可以攜帶數(shù)據(jù)的。
為什么這樣呢?大家可以想一個(gè)問(wèn)題,假如第一次握手可以攜帶數(shù)據(jù)的話,如果有人要惡意攻擊服務(wù)器,那他每次都在第一次握手中的 SYN 報(bào)文中放入大量的數(shù)據(jù),因?yàn)楣粽吒揪筒焕矸?wù)器的接收、發(fā)送能力是否正常,然后瘋狂著重復(fù)發(fā) SYN 報(bào)文的話,這會(huì)讓服務(wù)器花費(fèi)很多時(shí)間、內(nèi)存空間來(lái)接收這些報(bào)文。也就是說(shuō),第一次握手可以放數(shù)據(jù)的話,其中一個(gè)簡(jiǎn)單的原因就是會(huì)讓服務(wù)器更加容易受到攻擊了。
而對(duì)于第三次的話,此時(shí)客戶端已經(jīng)處于 established 狀態(tài),也就是說(shuō),對(duì)于客戶端來(lái)說(shuō),他已經(jīng)建立起連接了,并且也已經(jīng)知道服務(wù)器的接收、發(fā)送能力是正常的了,所以能攜帶數(shù)據(jù)頁(yè)沒(méi)啥毛病。
關(guān)于三次握手的,https 的認(rèn)證過(guò)程能知道一下最好,不過(guò)我就不說(shuō)了,留著寫(xiě) http 面試相關(guān)時(shí)的文章再說(shuō)。
四次揮手四次揮手也一樣,千萬(wàn)不要對(duì)方一個(gè) FIN 報(bào)文,我方一個(gè) ACK 報(bào)文,再我方一個(gè) FIN 報(bào)文,我方一個(gè) ACK 報(bào)文。然后結(jié)束,最好是說(shuō)的詳細(xì)一點(diǎn),例如想下面這樣就差不多了,要把每個(gè)階段的狀態(tài)記好,我上次面試就被問(wèn)了幾個(gè)了,呵呵。我答錯(cuò)了,還以為自己答對(duì)了,當(dāng)時(shí)還解釋的頭頭是道,呵呵。
剛開(kāi)始雙方都處于 establised 狀態(tài),假如是客戶端先發(fā)起關(guān)閉請(qǐng)求,則:
1、第一次揮手:客戶端發(fā)送一個(gè) FIN 報(bào)文,報(bào)文中會(huì)指定一個(gè)序列號(hào)。此時(shí)客戶端處于FIN_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_WAIT狀態(tài)。
3、第三次揮手:如果服務(wù)端也想斷開(kāi)連接了,和客戶端的第一次揮手一樣,發(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)。需要過(guò)一陣子以確保服務(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)文,如果沒(méi)有收到的話,服務(wù)器會(huì)重新發(fā) FIN 報(bào)文給客戶端,客戶端再次收到 ACK 報(bào)文之后,就知道之前的 ACK 報(bào)文丟失了,然后再次發(fā)送 ACK 報(bào)文。
至于 TIME_WAIT 持續(xù)的時(shí)間至少是一個(gè)報(bào)文的來(lái)回時(shí)間。一般會(huì)設(shè)置一個(gè)計(jì)時(shí),如果過(guò)了這個(gè)計(jì)時(shí)沒(méi)有再次收到 FIN 報(bào)文,則代表對(duì)方成功就是 ACK 報(bào)文,此時(shí)處于 CLOSED 狀態(tài)。
這里我給出每個(gè)狀態(tài)所包含的含義,有興趣的可以看看。
LISTEN - 偵聽(tīng)來(lái)自遠(yuǎn)方TCP端口的連接請(qǐng)求;
SYN-SENT -在發(fā)送連接請(qǐng)求后等待匹配的連接請(qǐng)求;
SYN-RECEIVED - 在收到和發(fā)送一個(gè)連接請(qǐng)求后等待對(duì)連接請(qǐng)求的確認(rèn);
ESTABLISHED- 代表一個(gè)打開(kāi)的連接,數(shù)據(jù)可以傳送給用戶;
FIN-WAIT-1 - 等待遠(yuǎn)程TCP的連接中斷請(qǐng)求,或先前的連接中斷請(qǐng)求的確認(rèn);
FIN-WAIT-2 - 從遠(yuǎn)程TCP等待連接中斷請(qǐng)求;
CLOSE-WAIT - 等待從本地用戶發(fā)來(lái)的連接中斷請(qǐng)求;
CLOSING -等待遠(yuǎn)程TCP對(duì)連接中斷的確認(rèn);
LAST-ACK - 等待原來(lái)發(fā)向遠(yuǎn)程TCP的連接中斷請(qǐng)求的確認(rèn);
TIME-WAIT -等待足夠的時(shí)間以確保遠(yuǎn)程TCP接收到連接中斷請(qǐng)求的確認(rèn);
CLOSED - 沒(méi)有任何連接狀態(tài);
最后,在放在三次握手與四次揮手的圖
大家如果有什么補(bǔ)充的話,歡迎留言補(bǔ)充哦。
最后推廣下我的公眾號(hào):苦逼的碼農(nóng):公眾號(hào)里面已經(jīng)有100多篇原創(chuàng)文件,也分享了很多實(shí)用工具,海量視頻資源、電子書(shū)資源,關(guān)注自提。點(diǎn)擊掃碼關(guān)注哦。 戳我即可關(guān)注,
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7243.html
摘要:在協(xié)議中,協(xié)議提供可靠的連接服務(wù),連接是通過(guò)三次握手進(jìn)行初始化的。三次握手的目的是同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換窗口大小信息。采用三次握手的辦法可以防止上述現(xiàn)象發(fā)生。 TCP是什么? 具體的關(guān)于TCP是什么,我不打算詳細(xì)的說(shuō)了;當(dāng)你看到這篇文章時(shí),我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我們就繼續(xù)。它只是一個(gè)超級(jí)麻煩的協(xié)議,而它又是互聯(lián)網(wǎng)的基礎(chǔ),也是每個(gè)程序員必備...
閱讀 3390·2023-04-26 01:40
閱讀 3093·2021-11-24 09:39
閱讀 1402·2021-10-27 14:19
閱讀 2648·2021-10-12 10:11
閱讀 1307·2021-09-26 09:47
閱讀 1847·2021-09-22 15:21
閱讀 2711·2021-09-06 15:00
閱讀 894·2021-08-10 09:44