1. 程式人生 > >阿里Java面試官:請別再問我3次握手與4次揮手了!

阿里Java面試官:請別再問我3次握手與4次揮手了!

在面試中,三次握手和四次揮手可以說是問的最頻繁的一個知識點了,我相信大家也都看過很多關於三次握手與四次揮手的文章。

 

 

 

今天的這篇文章,重點是圍繞著面試,我們應該掌握哪些比較重要的點,哪些是比較多被面試官給問到的,我覺得如果你能把我下面列舉的一些點都記住、理解,我想就差不多了。

 

 

三次握手

 

 

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

 

 

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

 

 

  • 第一次握手:客戶端給伺服器傳送一個 SYN 報文。
  • 第二次握手:伺服器收到 SYN 報文之後,會應答一個 SYN+ACK 報文。
  • 第三次握手:客戶端收到 SYN+ACK 報文之後,會迴應一個 ACK 報文。
  • 伺服器收到 ACK 報文之後,三次握手建立完成。

 

 

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

 

 

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

 

 

  • 第一次握手:客戶端傳送網路包,服務端收到了。

 

 

這樣服務端就能得出結論:客戶端的傳送能力、服務端的接收能力是正常的。

 

 

  • 第二次握手:服務端發包,客戶端收到了。

 

 

這樣客戶端就能得出結論:服務端的接收、傳送能力,客戶端的接收、傳送能力是正常的。不過此時伺服器並不能確認客戶端的接收能力是否正常。

 

 

  • 第三次握手:客戶端發包,服務端收到了。

 

 

這樣服務端就能得出結論:客戶端的接收、傳送能力正常,伺服器自己的傳送、接收能力也正常。

 

 

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

 

 

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

 

 

所以我覺得在回答三次握手的時候,我們應該要描述的詳細一點,而且描述的詳細一點意味著可以扯久一點。

 

 

加分的描述我覺得應該是這樣:剛開始客戶端處於 Closed 的狀態,服務端處於 Listen 狀態。

 

 

 

然後:

 

 

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

  • 第二次握手:伺服器收到客戶端的 SYN 報文之後,會以自己的 SYN 報文作為應答,並且也是指定了自己的初始化序列號 ISN(s)。

 

 

同時會把客戶端的 ISN + 1 作為 ACK 的值,表示自己已經收到了客戶端的 SYN,此時伺服器處於 SYN_REVD 的狀態。

 

 

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

  • 伺服器收到 ACK 報文之後,也處於 establised 狀態,此時,雙方已建立起了連結。

 

 

三次握手的作用

 

 

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

 

 

  • 確認雙方的接受能力、傳送能力是否正常。
  • 指定自己的初始化序列號,為後面的可靠傳送做準備。
  • 如果是 HTTPS 協議的話,三次握手這個過程,還會進行數字證書的驗證以及加密金鑰的生成。

 

 

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

 

 

①(ISN)是固定的嗎

 

 

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

 

 

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

 

 

②什麼是半連線佇列

 

 

伺服器第一次收到客戶端的 SYN 之後,就會處於 SYN_RCVD 狀態,此時雙方還沒有完全建立其連線,伺服器會把此種狀態下請求連線放在一個佇列裡,我們把這種佇列稱之為半連線佇列。

 

 

當然還有一個全連線佇列,就是已經完成三次握手,建立起連線的就會放在全連線佇列中。如果佇列滿了就有可能會出現丟包現象。

 

 

這裡在補充一點關於SYN-ACK 重傳次數的問題:

 

 

  • 伺服器傳送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳。
  • 如果重傳次數超過系統規定的最大重傳次數,系統將該連線資訊從半連線佇列中刪除。

 

 

注意,每次重傳等待的時間不一定相同,一般會是指數增長,例如間隔時間為 1s,2s,4s,8s......

 

 

③三次握手過程中可以攜帶資料嗎

 

 

很多人可能會認為三次握手都不能攜帶資料,其實第三次握手的時候,是可以攜帶資料的。

 

 

也就是說,第一次、第二次握手不可以攜帶資料,而第三次握手是可以攜帶資料的。

 

 

為什麼這樣呢?大家可以想一個問題,假如第一次握手可以攜帶資料的話,如果有人要惡意攻擊伺服器,那他每次都在第一次握手中的 SYN 報文中放入大量的資料。

 

 

因為攻擊者根本就不理伺服器的接收、傳送能力是否正常,然後瘋狂著重複發 SYN 報文的話,這會讓伺服器花費很多時間、記憶體空間來接收這些報文。

 

 

也就是說,第一次握手可以放資料的話,其中一個簡單的原因就是會讓伺服器更加容易受到攻擊了。

 

 

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

 

 

關於三次握手的,HTTPS 的認證過程能知道一下更好,不過我就不說了,留著寫 HTTP 面試相關時的文章再說。

 

 

四次揮手

 

 

四次揮手也一樣,千萬不要對方一個 FIN 報文,我方一個 ACK 報文,再我方一個 FIN 報文,對方一個 ACK 報文。

 

 

然後結束,要說的詳細一點,例如像下面這樣就差不多了,要把每個階段的狀態記好,我上次面試就被問了幾個了,呵呵。我答錯了,還以為自己答對了,當時還解釋的頭頭是道,呵呵。

 

 

 

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

 

 

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

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

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

  • 第四次揮手:客戶端收到 FIN 之後,一樣傳送一個 ACK 報文作為應答,且把服務端的序列號值 +1 作為自己 ACK 報文的序列號值,此時客戶端處於 TIME_WAIT 狀態。

 

 

需要過一陣子以確保服務端收到自己的 ACK 報文之後才會進入 CLOSED 狀態

 

 

  • 服務端收到 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:沒有任何連線狀態。

 

 

最後,再放下三次握手與四次揮手的圖:

 

 

相關推薦

阿里Java面試3握手4揮手

在面試中,三次握手和四次揮手可以說是問的最頻繁的一個知識點了,我相信大家也都看過很多關於三次握手與四次揮手的文章。  

Spark的MLlib和ML庫的區別

機器學習庫(MLlib)指南 MLlib是Spark的機器學習(ML)庫。其目標是使實際的機器學習可擴充套件和容易。在高層次上,它提供瞭如下工具: ML演算法:通用學習演算法,如分類,迴歸,聚類和

TCP協議的3握手4揮手過程詳解 標籤 TCP IM

1、前言 儘管TCP和UDP都使用相同的網路層(IP),TCP卻嚮應用層提供與UDP完全不同的服務。TCP提供一種面向連線的、可靠的位元組流服務。 面向連線意味著兩個使用TCP的應用(通常是一個客戶和一個伺服器)在彼此交換資料之前必須先建立一個TCP連線。這一過程與打電話很相似,先撥

(轉)理論經典TCP協議的3握手4揮手過程詳解

<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post"

Linux學習筆記十一圖解TCP3握手4揮手

cto 基於 名詞 分段 water http nag 名詞解釋 pro 如圖所示是是一個IP數據包的圖表: 我們知道web訪問是基於http協議和tcp/ip協議棧的,所以下面我們www.magedu.com 來通過抓包分析tcp3次握手過程。 如圖:第一個包:SYN

Java架構-拜託,面試不要Redis分散式鎖的實現原理

一、寫在前面 現在面試,一般都會聊聊分散式系統這塊的東西。通常面試官都會從服務框架(Spring Cloud、Dubbo)聊起,一路聊到分散式事務、分散式鎖、ZooKeeper等知識。 所以咱們這篇文章就來聊聊分散式鎖這塊知識,具體的來看看Redis分散式鎖的實現原理。 說實

面試說一下物件鎖和類鎖的區別

有鎖才有自由 生活中不存在絕對的自由,絕對的自由通常對應的無序和混沌,只有在道德、法律、倫理的約束下的相對自由,才能使人感受到自由。 而在多執行緒程式設計中,鎖是至關重要的,鎖就是道德,就是法律約束,沒有鎖的多執行緒環境將會是混亂的,所有執行緒都在爭奪資源,最後的結果就是導致系統崩潰,而有了鎖之後,多執行緒環

面試求你TCP的三握手和四揮手

少點程式碼,多點頭髮 本文已經收錄至我的GitHub,歡迎大家踴躍star 和 issues。 https://github.com/midou-tech/articles 三次握手建立連結,四次揮手斷開連結。這個問題算非常經典的問題,也是面試官非常喜歡問的問題。 不誇張的說,龍叔在校招面試的時候每一家公

面試寫一個你認為比較“完美”的單例

單例模式是保證一個類的例項有且只有一個,在需要控制資源(如資料庫連線池),或資源共享(如有狀態的工具類)的場景中比較適用。如果讓我們寫一個單例實現,估計絕大部分人都覺得自己沒問題,但如果需要實現一個比較完美的單例,可能並沒有你想象中簡單。本文以主人公小雨的一次面試為背景,循序漸進地討論如何實現一個較為“完美”

面試講一下Redis主從複製的功能及實現原理

摘要:Redis在主從模式下會有許多問題需要考慮,這裡寫了一些關於redis在多伺服器下的一些問題分析和總結。 Redis單節點存在單點故障問題,為了解決單點問題,一般都需要對redis配置從節點,然後使用哨兵來監聽主節點的存活狀態,如果主節點掛掉,從節點能繼續提供快取功能。主從配置結合哨兵模式能解決單點故障

拜託面試不要Spring Cloud底層原理

歡迎關注微信公眾號:石杉的架構筆記(id:shishan100) 每週一三五,精品技術文章準時送上! 目錄 一、業務場景介紹 二、Spring Cloud核心元件:Eureka 三、Spring Cloud核心元件:Feign 四、Spring Cloud核心元件:Ribbon 五、Sp

拜託,面試不要TCC分散式事務的實現原理

往期文章 1、 拜託!面試請不要再問我Spring Cloud底層原理 2、 【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級訪問? 3、 【效能優化之道】每秒上萬併發下的Spring Cloud引數優化實戰 4、 微服務架構如何保障

拜託,面試不要Redis分散式鎖的實現原理【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至五早8點半!精品技術文章準時送上! 目錄 一、寫在前面 二、Redisson實現Redis分散式鎖的底層原理       (1)加鎖機制       (2)鎖互斥機制  

拜託,面試不要Redis分散式鎖的實現原理

目錄 一、寫在前面 二、Redisson實現Redis分散式鎖的底層原理       (1)加鎖機制       (2)鎖互斥機制       (3)watch dog自動延期機制   &nbs

面試不要Spring Cloud底層原理

概述 毫無疑問,Spring Cloud是目前微服務架構領域的翹楚,無數的書籍部落格都在講解這個技術。不過大多數講解還停留在對Spring Cloud功能使用的層面,其底層的很多原理,很多人可能並不知曉。因此本文將通過大量的手繪圖,給大家談談Spring Cloud微服務架構的底層原理。實際上,Spring

拜託,面試基數排序

排序,面試中考察基本功問的比較多,工作多年以後,對排序的細節記憶不那麼清楚的小夥伴,面試時會比較吃虧。 有一種很神奇的排序,基數排序(Radix Sort),時間複雜度為O(n),今天花1分鐘,通過幾幅圖,爭取讓大家搞懂細節。   畫外音:居然還有時間複雜度為O(n)

求求你,下次面試什麼是 Spring AOP 和代理

作者 | 倪升武 責編 | 胡巍巍 我們知道,Spring 中 AOP 是一大核心技術,也是面試中經常會被問到的問題,最近我在網上也看到很多面試題,其中和 Spring AOP 相關的就有不少,這篇文章主要來總結下相關的技術點,希望對大家有用

[轉]求求你,下次面試什麼是 Spring AOP 和代理

求求你,下次面試別再問我什麼是 Spring AOP 和代理了! 倪升武 CSDN 1周前 作者 | 倪升武 責編 | 胡巍巍 我們知道,Spring 中 AOP 是一大核心技術,也是面試中經常會被問到的問題,最近我在網上也看到很多面

SpringCloud-拜託面試不要Spring Cloud底層原理實戰

上一篇我們說到《拜託!面試請不要再問我Spring Cloud底層原理》,我們大概瞭解了Spring Cloud中各個元件的作用以及其背後實現的原理。但是俗話說得好,實踐是檢驗真理的唯一標準。這一篇我們動手實踐一下,即搭建一個包含訂單服務、庫存服務、倉庫服務、積分服務的微服務架構專案。 一、

SpringCloud-拜託面試不要Spring Cloud底層原理

原文地址:https://mp.weixin.qq.com/s/mOk0KuEWQUiugyRA3-FXwg,原創作者:中華石杉,微信公眾號:石杉的架構筆記。 一、概述 毫無疑問,Spring Cloud是目前微服務架構領域的翹楚,無數的書籍部落格都在講解這個技術。不過大多數講解還停留在對S