關於三次握手和四次揮手,面試官想聽到怎樣的回答?


秋招面騰訊阿里字節,面試官都給我拋了這個百問不厭的問題,幸好我提前准備過,完美應付,下面是我根據個人經驗總結出來的,按照我說的,基本穩。

三次握手

由於在面試中,三次握手是被問的最頻繁的面試題,所以本次我們從面試的角度來講解三次握手

當面試官問你為什么需要有三次握手、三次握手的作用、講講三次三次握手的時候,我想很多人會這樣回答:

首先很多人會先講下握手的過程:

1、第一次握手:客戶端給服務器發送一個 SYN 報文。

2、第二次握手:服務器收到 SYN 報文之后,會應答一個 SYN+ACK 報文。

3、第三次握手:客戶端收到 SYN+ACK 報文之后,會回應一個 ACK 報文。

4、服務器收到 ACK 報文之后,三次握手建立完成。

作用是為了確認雙方的接收與發送能力是否正常。

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

第一次握手:客戶端發送網絡包,服務端收到了。這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。

第二次握手:服務端發包,客戶端收到了。這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。不過此時服務器並不能確認客戶端的接收能力是否正常。

第三次握手:客戶端發包,服務端收到了。這樣服務端就能得出結論:客戶端的接收、發送能力正常,服務器自己的發送、接收能力也正常。

因此,需要三次握手才能確認雙方的接收與發送能力是否正常。

這樣回答其實也是可以的,但我覺得,這個過程的我們應該要描述的更詳細一點,因為三次握手的過程中,雙方是由很多狀態的改變的,而這些狀態,也是面試官可能會問的點。所以我覺得在回答三次握手的時候,我們應該要描述的詳細一點,而且描述的詳細一點意味着可以扯久一點。加分的描述我覺得應該是這樣:

剛開始客戶端處於 closed 的狀態,服務端處於 listen 狀態。然后

1、第一次握手:客戶端給服務端發一個 SYN 報文,並指明客戶端的初始化序列號 SN(c)。此時客戶端處於 SYN_Send 狀態。

2、第二次握手:服務器收到客戶端的 SYN 報文之后,會以自己的 SYN 報文作為應答,並且也是指定了自己的初始化序列號 ISN(s),同時會把客戶端的 ISN + 1 作為 ACK 的值,表示自己已經收到了客戶端的 SYN,此時服務器處於 *SYN_REVD* 的狀態。

3、第三次握手:客戶端收到 SYN 報文之后,會發送一個 ACK 報文,當然,也是一樣把服務器的 ISN + 1 作為 ACK 的值,表示已經收到了服務端的 SYN 報文,此時客戶端處於 establised 狀態。

4、服務器收到 ACK 報文之后,也處於 establised 狀態,此時,雙方以建立起了鏈接。

三次握手的作用

三次握手的作用也是有好多的,多記住幾個,保證不虧。例如:

1、確認雙方的接受能力、發送能力是否正常。

2、指定自己的初始化序列號,為后面的可靠傳送做准備。

單單這樣還不足以應付三次握手,面試官可能還會問一些其他的問題,例如:

1、(ISN)是固定的嗎

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

如果ISN是固定的,攻擊者很容易猜出后續的確認號,因此 ISN 是動態生成的。

2、什么是半連接隊列

服務器第一次收到客戶端的 SYN 之后,就會處於 SYN_RCVD 狀態,此時雙方還沒有完全建立其連接,服務器會把此種狀態下請求連接放在一個隊列里,我們把這種隊列稱之為半連接隊列。當然還有一個全連接隊列,就是已經完成三次握手,建立起連接的就會放在全連接隊列中。如果隊列滿了就有可能會出現丟包現象。

這里在補充一點關於SYN-ACK 重傳次數的問題: 服務器發送完SYN-ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超 過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。注意,每次重傳等待的時間不一定相同,一般會是指數增長,例如間隔時間為 1s, 2s, 4s, 8s, ....

3、三次握手過程中可以攜帶數據嗎

很多人可能會認為三次握手都不能攜帶數據,其實第三次握手的時候,是可以攜帶數據的。也就是說,第一次、第二次握手不可以攜帶數據,而第三次握手是可以攜帶數據的。

為什么這樣呢?大家可以想一個問題,假如第一次握手可以攜帶數據的話,如果有人要惡意攻擊服務器,那他每次都在第一次握手中的 SYN 報文中放入大量的數據,因為攻擊者根本就不理服務器的接收、發送能力是否正常,然后瘋狂着重復發 SYN 報文的話,這會讓服務器花費很多時間、內存空間來接收這些報文。也就是說,第一次握手可以放數據的話,其中一個簡單的原因就是會讓服務器更加容易受到攻擊了。

而對於第三次的話,此時客戶端已經處於 established 狀態,也就是說,對於客戶端來說,他已經建立起連接了,並且也已經知道服務器的接收、發送能力是正常的了,所以能攜帶數據頁沒啥毛病。

四次揮手

由於在面試中,三次握手是被問的最頻繁的面試題,所以本次我們從面試的角度來講解三次握手

四次揮手也一樣,千萬不要對方一個 FIN 報文,我方一個 ACK 報文,再我方一個 FIN 報文,我方一個 ACK 報文。然后結束,最好是說的詳細一點,例如想下面這樣就差不多了,要把每個階段的狀態記好,我上次面試就被問了幾個了,呵呵。我答錯了,還以為自己答對了,當時還解釋的頭頭是道,呵呵。

剛開始雙方都處於 establised 狀態,假如是客戶端先發起關閉請求,則:

1、第一次揮手:客戶端發送一個 FIN 報文,報文中會指定一個序列號。此時客戶端處於FIN_WAIT1狀態。

2、第二次握手:服務端收到 FIN 之后,會發送 ACK 報文,且把客戶端的序列號值 + 1 作為 ACK 報文的序列號值,表明已經收到客戶端的報文了,此時服務端處於 CLOSE_WAIT狀態。

3、第三次揮手:如果服務端也想斷開連接了,和客戶端的第一次揮手一樣,發給 FIN 報文,且指定一個序列號。此時服務端處於 LAST_ACK 的狀態。

4、第四次揮手:客戶端收到 FIN 之后,一樣發送一個 ACK 報文作為應答,且把服務端的序列號值 + 1 作為自己 ACK 報文的序列號值,此時客戶端處於 TIME_WAIT 狀態。需要過一陣子以確保服務端收到自己的 ACK 報文之后才會進入 CLOSED 狀態

5、服務端收到 ACK 報文之后,就處於關閉連接了,處於 CLOSED 狀態。

這里特別需要主要的就是*TIME_WAIT*這個狀態了,這個是面試的高頻考點,就是要理解,為什么客戶端發送 ACK 之后不直接關閉,而是要等一陣子才關閉。這其中的原因就是,要確保服務器是否已經收到了我們的 ACK 報文,如果沒有收到的話,服務器會重新發 FIN 報文給客戶端,客戶端再次收到 ACK 報文之后,就知道之前的 ACK 報文丟失了,然后再次發送 ACK 報文。

至於 TIME_WAIT 持續的時間至少是一個報文的來回時間。一般會設置一個計時,如果過了這個計時沒有再次收到 FIN 報文,則代表對方成功就是 ACK 報文,此時處於 CLOSED 狀態。

這里我給出每個狀態所包含的含義,有興趣的可以看看。

LISTEN - 偵聽來自遠方TCP端口的連接請求;

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

SYN-RECEIVED - 在收到和發送一個連接請求后等待對連接請求的確認;

ESTABLISHED- 代表一個打開的連接,數據可以傳送給用戶;

FIN-WAIT-1 - 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認;

FIN-WAIT-2 - 從遠程TCP等待連接中斷請求;

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

CLOSING -等待遠程TCP對連接中斷的確認;

LAST-ACK - 等待原來發向遠程TCP的連接中斷請求的確認;

TIME-WAIT -等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認;

CLOSED - 沒有任何連接狀態;

最后,在放在三次握手與四次揮手的圖

另外,計算機網網絡和操作系統被問的概率還是很高的,推薦大家看這份筆記,通俗易懂,看完基本就穩了

圖解操作系統、網絡、計算機組成 PDF 下載!

這里也有一些寫的不錯的文章,給大家找來了

1. 計算機網絡五層模型入門

2. 通信雙方如何保證消息不丟失?

3. 集線器、交換機與路由器有什么區別?

4. 什么是 TCP 擁塞控制?

5. 什么是 TCP 流量控制

6. 什么是 TCP 三次握手?

7. 什么是 TCP 四次揮手?

8. 什么是 HTTP?

9. 什么是 HTTPS?

10. 什么是 SSL/TLS 協議?

11. 什么是 DNS?

12. 什么是 DHCP ?

13. 什么是廣播路由算法?

14. 什么是數字簽名?

15. 什么是 SQL 注入攻擊?

16. 什么是 XSS 攻擊?

喜歡看視頻的,也可以看我整理的這個計算機基礎視頻
[計算機基礎三門課視頻](


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM