TCP連接的狀態轉移

TCP是一個面向連接的傳輸層協議,因此不論哪一方需要傳輸數據,都需要在雙方之間建立一條傳輸連接。

TCP連接的狀態轉移


用TCP的三次握手與四次揮手來解釋TCP的各個狀態之間的會比較清晰。

一、TCP的三次握手:

a)         單方主動發起連接:

TCP連接的狀態轉移

1、  服務器端應用層的應用程序創建了一個socket,使服務端被動打開,從CLOSED狀態切換至LISTEN狀態;

2、  此時客戶端向服務端發送了一個SYN=1,seq=i的數據段,主動打開,并將狀態從CLOSED切換至SYN_SENT(此為TCP三次握手中的第一次握手);

3、  服務端收到客戶端的發來的同步請求后,給客戶端回應一個SYN=1,ACK=1,seq=jack=i+1的數據段,并將狀態從LISTEN切換至SYN_RCVD,等待客戶端的最后的ACK(此為TCP三次握手中的第二次握手);

4、  客戶端收到服務端發來的ACKSYN請求后,回應服務端ACK=1,seq=i+1,ack=j+1數據段,并將狀態從SYN_SENT轉換至ESTABLISHED(此為TCP三次握手中的第三次握手);

5、  服務端收到客戶端發來的ACK確認后,將狀態從SYN_RCVD轉換至ESTABLISHED.

 

b)         雙方同時發起連接請求:
TCP連接的狀態轉移
此種狀態并不存在一方為服務器,一方為客戶端的情況,主機A與主機B既是客戶端又是服務端。

1、  主機A與主機B同時向對方發起同步請求;并將狀態從CLOSED轉換到SYN_SENT
  A
SYN=1  seq=i —–>  B(在收到對方的SYN請求后,狀態從SYN_SENT轉換到SYN_RCVD
  B
SYN=1  seq=j —–>  A(在收到對方的SYN請求后,狀態從SYN_SENT轉換到SYN_RCVD

2、  主機A與主機B再同時確認對方的同步請求;
  A
SYN=1 ACK=1  seq=i+1  ack=j+1 —–>  B(在收到對方的ACK確認后,狀態從SYN_RCVD轉換到ESTABLISHED
  B
SYN=1 ACK=1  seq=j+1  ack=i+1 —–>  A(在收到對方的ACK確認后,狀態從SYN_RCVD轉換到ESTABLISHED
                                                           
注:注意同時發起請求時各狀態轉換的時間

二、TCP的四次揮手:

a)         單方主動發起斷開請求:
TCP連接的狀態轉移

1、  假設由客戶端主動發起斷開請求,客戶端向服務器端發送FIN=1,seq=m的數據段,請求斷開連接,并將狀態從ESTABLISHED轉換至FIN_WAIT 1 等待服務器確認;(此為四次揮手中的第一次揮手)

2、  服務器端接收到客戶端發來的FIN請求后,會回應給客戶端一個ACK=1
seq=n
,ack=m+1的數據段,并將狀態從ESTABLISHED轉換至CLOSE_WAIT;此時如果服務器端還由未發送完成的數據,則會繼續發送;(此為四次揮手中的第二次揮手)

3、  客戶端收到來自服務器端發來的ACK數據段后,關閉客戶端至服務器方向TCP連接,此時整個TCP連接處于半關閉狀態(half-close);
客戶端狀態從FIN_WAIT 1切換至FIN_WAIT 2 ;等待服務器端發送FIN確認可以斷開連接;注:此時客戶端仍然可以接收來自服務器端發送的數據

4、  當服務器端數據傳輸完成,向客戶端發送FIN=1 ACK=1 seq=w ack=m+1的數據段(此時服務器ack確認的數據段為客戶端關閉TCP連接的最后一個數據段的序號),并將狀態從CLOSE_WAIT轉換至LAST_ACK,等待客戶端的ACK確認(此為TCP四次揮手的第3次揮手)

5、  客戶端收到來自服務器端發送的FIN數據段后,向服務器段發送ACK確認數據段,并將狀態從FIN_WAIT 2轉換至TIMED_WAIT;等待2MSL(最大報文段生存時間),如果沒有收到來自服務器端的回應,關閉TCP連接,從TIMED_WAIT狀態轉換至CLOSED狀態(此為TCP四次揮手的第四次揮手)

6、  服務器端在收到客戶端發送的ACK后,將狀態轉換為LISTEN;如果在一定時間內收不到客戶端的ACK,會重新向客戶端發送FIN數據段

b)         雙方同時發起FIN請求:
TCP連接的狀態轉移

1、  雙方同時向對方發送FIN請求;并將狀態從ESTABLISHED轉換至FIN_WAIT 1

2、  雙方都收到來自對方發送的FIN請求時,將狀態從FIN_WAIT
1
轉換至CLOSING;給對方發送ACK確認數據段后,又將狀態從CLOSING轉換至TIMED_WAIT;雙方在等待2MSL時長后,沒有收到來自對方的回應后,超時進入CLOSED狀態

c)         如果在客戶端向服務端發起SYN請求后,服務器段不愿意進行連接,此時服務器端會向客戶端發送一個FIN請求,并將狀態從SYN_RCVD切換到FIN_WAIT1;客戶端收到FIN后,會回應服務器端一個ACK數據段,表示雙方同時嘗試關閉連接;并將狀態從SYN_SENT切換至CLOSING;服務器端在收到客戶端發來的ACK數據段后,切換狀態至TIMED_WAIT;在超時后雙方即關閉連接。

三、各個狀態梳理:

CLOSED:初始狀態;

LISTEN:應用層應用程序創建了一個socket;

SYN_RCVD:收到SYN同步請求,回應對方發送ACK、SYN;
SYN_SENT
:發送了SYN同步請求;
ESTABLSHED
:收到了對方的ACK確認;

FIN_WAIT 1:發起了FIN終止連接的請求,還未得到對方確認;

CLOSE_WAIT:收到了對方的FIN請求,回應給對方ACK
FIN_WAIT 2
:發送FIN請求,收到了ACKA確認,但未收到對方的FIN請求;

LAST_ACK:向對方發送了FIN請求,還未得到確認;

TIMED_WAIT:收到對方的FIN請求,回應ACK,等待2MSL;

CLOSING:在向對方發送FIN后,先接到對方的FIN,從FIN_WAIT 1轉換至此狀態,在向對方發送ACK后會進入TIME_WAIT狀態; 

原創文章,作者:M22-Zero,如若轉載,請注明出處:http://www.www58058.com/71378

(1)
M22-ZeroM22-Zero
上一篇 2017-03-19 16:52
下一篇 2017-03-19 18:35

相關推薦

  • 在centos6.9上實現軟RAID

    在centos6.9上實現軟RAID 什么是RAID?     RAID,全稱Redundant Arrays of Inexpensive(Independent)Disks。簡單翻譯叫磁盤陣列。    通俗一點講就是多個磁盤合成一個“陣列”來提供更好的性能、冗余,或者兩者都提…

    Linux干貨 2017-08-12
  • 虛擬化技術介紹、Xen的簡單實現

    虛擬化是什么? 虛擬化是一種資源管理技術, 是將計算機的各實體資源, 如服務、網絡、內存及存儲等, 予以抽象、轉換后呈現出來, 打破實體之間的不可切割的障礙, 使用戶可以比原本的配置更好的方式來應用這些資源。這些資源的新虛擬部分是不受現有資源的架設方式, 地域或物理配置所限制。一般情況下, 虛擬化資源包括計算能力和數據存儲 —<轉自維基百科&…

    2016-05-31
  • 計算機的組成和Linux發展史

    計算機的組成及功能   計算機是由CPU,內存,輸入裝置和輸出裝置四大部件組成計算機,每一部件分別按要求執行特定的基本功能。  CPU: 控制器和運算器合稱中央處理器,也就是CPU,它的功能主要是解釋計算機指令以及處理計算機軟件中的數據。  內存: 它是與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內存中進行的,內存(Me…

    Linux干貨 2016-10-30
  • Linux發展史

    日期:2016-10-12  Bell,MIT與GE的『Multics』系統     早期的計算機還很不普遍,除非是軍事或者高科技用途,或者學術單位的學術研究,否則真的很難接觸到。而且計算機架構很難使用。那個時候,程序設計者必須先將程序相關的信息在讀卡紙上面打洞然后將讀卡紙插入卡片閱讀機來將信息讀入主機中運算…

    Linux干貨 2016-10-14
  • GRUB啟動故障排除和內核編譯

    如何進入光盤應急系統(以下修復操作僅適用于GRUB legacy, 不適用于GRUB2): 步驟一:給主機掛上安裝光盤, 或者有相應啟動鏡像的硬盤分區(可移動的分區) 步驟二:開機時選擇CDROM先啟動 步驟三:進入光盤啟動界面選擇應急救援模式 步驟四: 不選擇設置網絡接口, 直接讀取磁盤分區并以讀寫方式掛載 步驟五: 選擇shell進入bash中對磁盤進行…

    Linux干貨 2016-09-12
  • 計算機組成及Linux基礎

    第1題:描述計算機的組成及功能 1.1計算機的組成       計算機是有 運算器,控制器,存儲器,輸入設備和輸出設備組成計算機 1.2計算機各部件功能 運算器 對數據進行算術運算,邏輯運算和對數據進行加工處理 存儲器 存儲程序,數據和各種信號,命令等信息,并在需要時提供這些信息 控制器 是整個計算機的中樞神…

    Linux干貨 2017-07-02
欧美性久久久久