TCP三次握手和四次揮手詳解

2021-09-24 02:45:13 字數 2176 閱讀 5860

三次握手(three-way handshake),是指建立乙個 tcp 連線時,需要客戶端和伺服器總共傳送3個包。

三次握手的目的是連線伺服器指定埠,建立 tcp 連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。

第1次握手

客戶端:

第2次握手

伺服器:

第3次握手

客戶端:

客戶端此包傳送完畢之後,客戶端和伺服器進入established(tcp 連線成功)狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送資料。

第1次

客戶端:

第2次

伺服器:

tcp 通知應用程序,客戶端向伺服器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有資料要傳送了,但是伺服器若傳送資料,客戶端依然要接收。這個狀態還要持續一段時間,也就是整個 close-wait 狀態持續的時間。

客戶端:

第3次

伺服器將最後的資料傳送完畢後,就向客戶端傳送連線釋放報文,由於在半關閉狀態,伺服器很可能又傳送了一些資料。假定此時的序列號為 seq=w

伺服器:

第4次

客戶端:

客戶端接收到伺服器的連線釋放報文之後,必須發出確認。

伺服器:

伺服器比客戶端先進入closed狀態。

3.1.1 為什麼三次握手

當 server 收到 client 端的 syn 連線請求報文後,可以直接傳送 syn、ack 報文。ack 報文做應答, syn 報文用來同步。

三次握手做好傳送資料的準備工作,同時也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被傳送和確認。

前兩次握手進行同步和準備,第三次握手進入狀態。

為什麼不是兩次握手呢?

如果乙個連線請求在網路中跑得慢,超時了,這時客戶端會重發請求,但這個跑的慢的客戶端最後還是跑到了,然後服務端就接收了兩個請求,然後全部回應就會建立兩個連線,浪費資源。如果加入第三次驗證,則客戶端接收到乙個服務端確認連線請求之後,後面再接收到確認連線請求就可以拋棄不管了。

3.1.2 為什麼4次揮手

tcp 是雙向的,所以需要在兩個方向分別關閉,每個方向的關閉又需要請求和確認,所以一共就4次。

tcp 有乙個保活計時器,客戶端出現故障了,伺服器是不能一直等下去浪費資源的的。

伺服器每收到一次客戶端請求後都會重新復位這個計時器,時間通常為 2h ,如果 2h 還沒有收到客戶端的任何資料,伺服器就會傳送乙個探測報文段,以後每隔 75s 就會傳送一次。若一連傳送10個探測報文仍然沒有反應,伺服器就認為客戶端出現故障,接著就關閉連線。

syn 洪水攻擊傳送在三次握手的前2次,攻擊者傳送 tcp syn,syn 是 tcp 三次握手中的第乙個資料報,當伺服器返回 ack 後,攻擊者不對其進行再確認,那這個連線就處於掛起狀態,也就是所謂的半連線狀態,伺服器收不到再確認的話,還會重**送 ack 給攻擊者,這會導致伺服器資源被浪費。攻擊者對伺服器傳送非常大量的這種 tcp 連線,由於大量半連線狀態在伺服器產生,伺服器的資源消耗會不斷增加,最後導致伺服器故障。

伺服器傳送 ack 之後處於 syn_recv 狀態,伺服器只有收到客戶端的 ack 之後,才會轉入 established 狀態。

syn、ack、fin 這些大寫的單詞表示標誌位,其值只有0、1;小寫的 seq、ack 表示序號。

syn、ack、fin 存放在 tcp 的標誌位。

字段含義

ack確認號是否有效,一般置為1

syn請求建立連線,並在其序列號的字段進行序列號的初始值設定。建立連線,設為1

fin希望斷開連線

urg緊急指標是否有效。為1表示某一位需要被優先處理

psh提示接收端應用程式立即從 tcp 緩衝區把資料讀走

rst對方要求重新建立連線,復位

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...