1. 程式人生 > >TCP 連線 三次握手原理

TCP 連線 三次握手原理

作者:JAVA爛豬皮
連結:https://zhuanlan.zhihu.com/p/73467254
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
 

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

三次握手

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

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

  • 第一次握手:客戶端給伺服器傳送一個 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:沒有任何連線狀態。

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

 

相關推薦

TCP 連線 握手原理

作者:JAVA爛豬皮 連結:https://zhuanlan.zhihu.com/p/73467254 來源:知乎 著作權歸作者所

TCP連線 握手揮手

前言: TCP協議是面向連線、安全可靠、基於位元組流的傳輸層協議,在進行http協議訪問時就用到了tcp連線。在建立TCP連線時需要經歷三次握手,斷開連線時需要經歷四次揮手。在此進行記錄。 內容:   TCP三次握手    第一次握手:由客戶端發起,客戶端生成一個SYN,以及一個

結合wireshark分析TCP握手原理

(7)重組資料。Wireshark的重組功能,可以重組一個會話中不同資料包的資訊,或者是一個重組一個完整的圖片或檔案。由於傳輸的檔案往往較大,所以資訊分佈在多個數據包中。為了能夠檢視到整個圖片或檔案,這時候就需要使用重組資料的方法來實現。

TCP連線握手和四揮手

1、三次握手 (1)三次握手的詳述 首先Client端傳送連線請求報文,Server段接受連線後回覆ACK報文,併為這次連線分配資源。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP連線就建立了。    最初兩端的TCP程

TCP 握手原理以及半連線和全連線

問題描述 JAVA的client和server,使用socket通訊。server使用NIO。  間歇性的出現client向server建立連線三次握手已經完成,但server的selector沒有響應到這連線。  出問題的時間點,會同時有很多連接出現這個問題

TCP握手原理,你真的瞭解嗎?

最近碰到一個問題,Client 端連線伺服器總是拋異常。在反覆定位分析、並查閱各種資料搞懂後,我發現並沒有文章能把這兩個佇列以及怎麼觀察他們的指標說清楚。 問題描述 場景:Java 的 Client 和 Server,使用 Socket 通訊。Server 使用 NIO。 問題: 間歇性出現 Clien

TCP 握手原理,你真的理解嗎

最近,阿里中介軟體小哥哥蟄劍碰到一個問題——client端連線伺服器總是拋異常。在反覆定位分析、並查閱各種資料文章搞懂後,他發現沒有文章把這兩個佇列以及怎麼觀察他們的指標說清楚。 因此,蟄劍寫下這篇文章,希望藉此能把這個問題說清楚。歡迎大家一起交流探討。 問題描述

TCP握手揮手和 長連線連線

tcp長連線和短連線 TCP在真正的讀寫操作之前,server與 client之間必須建立一個連線, 當讀寫操作完成後,雙方不再需要這個 連線時它們可以釋放這個連線, 連線的建立通過三次握手,釋放則需要 四次握手, 所以說每個連線的建立都是需要資源消 耗和時間

TCP握手原理詳解

TCP/IP協議不是TCP和IP這兩個協議的合稱,而是指因特網整個TCP/IP協議族。 從協議分層模型方面來講,TCP/IP由四個層次組成:網路介面層、網路層、傳輸層、應用層。 TCP協議:即傳輸控制協議,它提供的是一種可靠的資料流服務。當傳送受差錯干擾的資料,或舉出

使用wireshark來分析tcp握手和四斷開連線

http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html#2938375 http://www.cppblog.com/kevinlynx/archive/2008/07/30/57521.aspx 程序

TCP建立連線握手和釋放連線握手

TCP的報文結構如下下所示:序列號seq:佔4個位元組,用來標記資料段的順序,TCP把連線中傳送的所有資料位元組都編上一個序號,第一個位元組的編號由本地隨機產生;給位元組編上序號後,就給每一個報文段指派

C/S 伺服器與客戶端連線握手揮手原理

前言 TCP(Transmission Control Protocol)網路傳輸控制協議,是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,資料傳輸前建立連線的工作要經過三次握手,資料傳輸後斷開連線的工作要經過四次揮手。 工作過程 –TCP標誌

TCP/IP握手和HTTP過程

等待 自身 text ssi 描述 套接字 網絡連接 計算 中間 1、TCP連接 手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口,使上層網絡數據的傳輸建立在“無差別”的網絡之上。 建立起

TCP握手和四揮手

可能 事情 斷開 fin 最長 time 重復 延時 cnblogs 三次握手 TCP連接是通過三次握手來連接的。 第一次握手 當客戶端向服務器發起連接請求時,客戶端會發送同步序列標號SYN到服務器,在這裏我們設SYN為m,等待服務器確認,這時客戶端的狀態為SYN_SENT

簡析TCP握手與四分手

丟包 現在 流量 tcp連接 首部 都是 字節序 鏈接 暫時 具體的關於TCP是什麽,我不打算詳細的說了;當你看到這篇文章時,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我們就繼續。它只是一個超級麻煩的協議,而它又是互聯網的基礎,也是每個程序員必備的基本功。首

socket的TCP握手/四揮手

exce 5.2.1 其他 oca clas message trac input 創建 第一次握手:客戶端嘗試連接服務器,向服務器發送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待服務器確

TCP握手和四揮手過程

-1 連接狀態 字段 osi listen 情況 time 連接 -a TCP包頭:其中ACK,SYN,FIN在這兩個過程中會用到,簡單介紹如下: ACK:表示是否前面的確認號字段是否有效,ACK=1,表示有效,只有當ACK=1時,前面的確認號字段才有效,TCP規

TCP協議握手與四揮手通俗解析

再次 方式 32位 sent 時間 應用層 系統 socket編程 檢測 TCP/IP協議三次握手與四次握手流程解析 一、TCP報文格式 TCP/IP協議的詳細信息參看《TCP/IP協議詳解》三卷本。下面是TCP報文格式圖: 圖1 TCP報文格式 上圖中

TCP協議握手過程分析

fmt 圖1 同步 建立連接 協議 from pan mir 重置 TCP(Transmission Control Protocol) 傳輸控制協議。 TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接: 位碼即tcp標誌位,有6種標

Tcp協議握手揮手

blog 可靠的 協議 smis 客戶端 finish 協議號 time 徹底 一、什麽是TCP   TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接(連接導向)的、可靠的、 基於IP的傳輸層協議。TCP在IP報文的協議號是6