關於TCP三次握手和四次揮手的理解

2021-08-15 08:42:15 字數 2393 閱讀 2747

1. 三次握手:

伺服器一定處於listen狀態,否則客戶端發過來的連線會被拒絕。注:伺服器和客戶端的角色是相對的。

客戶端

傳送第一次握手

(客戶端傳送連線請求(sync包)到伺服器)之後由closed狀態轉為sync-send狀態;

伺服器收到第一次握手

的客戶端sync包,然後傳送第二次握手

(伺服器傳送sync+ack(客戶端sync包的確認)包給客戶端)之後伺服器由listen狀態轉為sync-recv狀態;

客戶端收到第二次握手

的伺服器sync+ack包,然後傳送第三次握手

(客戶端對「伺服器的sync+ack包「的ack包給給伺服器)之後客戶端就轉為established狀態;

伺服器收到第三次握手

的客戶端ack包之後也進入了established。

2. 四次揮手:

伺服器與客戶端都處於established狀態,且有一方主動發起了關閉,另外一方會被動關閉。被動關閉的一方需要處理socket的資源**等,被動關閉的一方需要及時關閉,所以說被動關閉的一方出現大量close_wait狀態通常都是因為程式**問題。

主動關閉的一方(可能是伺服器也可能是客戶端)的狀態遷移:fin-wait1->fin-wait2->time_wait-closed

被動關閉的一方的狀態遷移:close_wait->last_ack->closed

同時關閉:雙方狀態一致: fin_wait1->closing->time_wait

假設客戶端主動關閉連線,以下說明客戶端和伺服器如何遷移:

客戶端

傳送第一次揮手

(客戶端第乙個fin包給伺服器)之後由established狀態轉為fin_wait1狀態;

伺服器收到客戶端的第一次揮手

(客戶端第乙個fin包給伺服器)之後,傳送第二次揮手

(對客戶端fin的ack確認包)給伺服器,伺服器進入close_wait狀態,等待伺服器自身的socket關閉等處理(等待io,業務處理,資源**等等);

客戶端收到伺服器的第二次揮手

(對客戶端fin的ack確認包),進入fin_wait2狀態,等待伺服器關閉(伺服器呼叫close函式傳送伺服器的fin包);

伺服器傳送第三次揮手

(在處理完自己的事情,呼叫close函式之後,傳送伺服器的fin包),進入last_ack狀態;

客戶端收到第三次揮手

(伺服器的fin包),傳送第四次揮手

(客戶端第二個fin包+ack(對伺服器fin包的確認)),客戶端進入time_wait狀態;

伺服器收到第四次揮手

(客戶端第二個fin包+ack(對伺服器fin包的確認)),進入closed狀態;

客戶端等待2msl時間,進入closed狀態

注:fin_wait2狀態等待時間是有限的,系統可配:tcp_fin_timeout 這個引數可以控制改狀態存活的時間

fin_wait1和close_wait是比較危險的狀態,一般伺服器網路鼓掌首先要檢視這倆個狀態是否正常:close_wait在上面說過,如果伺服器**有問題(忘記close等),伺服器會一直有需要的close_wait狀態的socket,造成伺服器不可連線;fin_wait1會在發出來fin而沒有手到ack會重新傳送fin,重發次數由系統引數配置:tcp_orphan_retries;如果系統負載過重,減少tcp_orphan_retries值可能有作用。

一般來說fin_wait1幾乎不可見,因為伺服器之間的ack速度非常快;

fin_wait1 的ddos攻擊舉例說明:

參考:

tcp共有11個網路狀態,其中涉及到關閉的狀態有5個。

在我們編寫網路相關程式的時候,這5個狀態經常出現。因為這5個狀態相互關聯,相互糾纏,而且狀態變化觸發都是由應用觸發,但是又涉及作業系統和網路,所以正確的理解tcp 在關閉時網路狀態變化情況,為我們診斷網路中各種問題,快速定位故障有著非常重要的作用和意義。

下是是根據w.richard stevens的《tcp/ip詳解》一書的tcp狀態轉換圖。

關於TCP三次握手四次揮手

三次握手 1 a的tcp客戶程序首先建立傳輸控制模組tcb,同步位syn 1 初始序列號seq x,進入syn sent 同步已傳送 階段 2 b收到請求報文,同意建立連線,向a傳送確認 syn ack都置1 確認號是ack x 1,初始序列號seq y 進入syn rcvd 同步已收到 狀態 3 ...

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

TCP三次握手和四次揮手

一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...