TCP/IP有限狀態機

TCP/IP有限狀態機服務器

 

TCP初始化鏈接三次握手吧:發SYN包,而後返回SYN/ACK包,再發ACK包,鏈接正式創建。網絡

可是這裏有點出入,當請求者收到SYS /ACK包後,就開始創建鏈接了,而被請求者第三次握手結束後才創建鏈接。併發

 

關閉鏈接要四次握手:發FIN包,ACK 包,FIN包,ACK包,四次握手!!ide

 

1、創建TCP鏈接spa

 

wKioL1WNHMyC7mV_AADGgT60CIY624.jpg

1、客戶端發送SYN報文(SYN1) ,指明客戶打算鏈接的服務器端口,以及初始化順序號(ISN操作系統

2、服務端發回包含服務器的初始順序號的SYN報文段(SYN1) 同時,將確認號設置爲客戶的ISN1以對客戶的SYN報文段進行確認(ACK1)設計

3、客戶端將確認號設置爲服務器的順序號(ISN)+1對服務器的SYN報文段進行確認(ACK1)3d

這三個報文段完成鏈接的創建,這個過程也稱爲三次握手。orm

 

------------------------------------------------------------------------xml

同時打開

兩個應用程序同時彼此執行主動打開的狀況是可能的,儘管發生的可能行極小。每一方必須發送一個SYN,且這些SYN必須傳遞給對方。這須要每一方使用一個對方熟知的端口做爲本地端口。這又稱爲同時打開。

TCP是特地設計爲了能夠處理同時打開,對於同時打開它僅創建一條鏈接,而不是兩條鏈接。

wKiom1WNGxDCwd8CAADARO62Em4108.jpg

 

(1)當出現同時打開狀況時,兩端幾乎同時發送SYN,並進入SYN_SENT狀態;

(2)當每一端收到SYN時,狀態變爲SYN_RCVD,同時它們都再發SYN並對收到的SYN進行確認;

(3)當雙方都收到SYN及相應的ACK時,狀態都變遷爲ESTABLISHED。

    一個同時打開的鏈接須要交換4個報文段,比正常的三次握手多一個。此外,不要注意的是,沒有將任何一端稱爲客戶或服務器,由於每一端既是客戶又是服務器。

------------------------------------------------------------------------

 

2、關閉一個TCP鏈接

TCP創建起來後,就能夠在兩個方向傳送數據流。 TCP的應用進程在沒有數據須要發送時,就發送關閉命令。

TCP經過發送控制位FIN=1的數據片來關閉本方數據流,可是還能夠繼續接收數據,直到對方關閉那個方向的數據流,鏈接就關閉。

wKioL1WNHM3gnw5GAAEfMqn1HeA691.jpg

要終止一個鏈接要通過4次握手,由於TCP的半關閉(half-close)形成的。因爲一個TCP鏈接是全雙工(即數據在兩個方向上能同時傳遞),所以兩個方向必須單獨的進行關閉。

關閉的原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向鏈接。當一端收到一個FIN,它必須通知應用層另外一端已經停止了那個方向的數據傳送,發送FIN一般是應用層進行關閉的結果。

 

 

TCP鏈接關閉有三種狀況:

1、本方啓動關閉

收到本方應用進程的關閉命令後,TCP在發送完還沒有處理的報文段後,發FIN=1的報文段給對方,且TCP再也不受理本方應用進程的數據發送。

FIN之前發送的數據字節,包括FIN,都須要對方確認,不然要重傳。注意FIN也要佔一個順序號。一旦收到對方對FIN的確認以及對方的FIN報文段,本方TCP就對該FIN進行確認,在等待一段時間,而後關閉鏈接。等待是爲了防止本方的確認報文丟失,避免對方的重傳報文干擾新的鏈接。

 

2、對方啓動關閉

TCP收到對方發來的FIN報文時,發ACK確認此FIN報文,並通知應用進程鏈接正在關閉。應用進程將以關閉命令響應。TCP在發送完還沒有處理的報文段後,發一個FIN報文給對方TCP,而後等待對方對FIN的確認,收到確認後關閉鏈接。若對方的確認未及時到達,在等待一段時間後也關閉鏈接。

 

3、雙方同時啓動關閉

鏈接雙方的應用進程同時發送關閉命令,則雙方TCP在發送完還沒有處理的報文段後,發送FIN報文。各方TCPFIN前所發報文都獲得確認後,發ACK確認他收到的FIN。各方在收到對方FIN的確認後,一樣等待一段時間後在關閉鏈接。這稱之爲同時關閉。

 

------------------------------------------------------------------------

同時關閉

雙方都執行主動關閉是可能的,TCP協議也容許這樣的同時關閉。

wKiom1WNGxDxiV1XAAC0-_B2MSc664.jpg

(1)當應用層發出關閉命令時,兩端均從ESTABLISHED變爲FIN_WAIT_1;

(2)這將致使雙方各發送一個FIN,兩個FIN通過網絡傳輸後分別到達另外一端;

(3)收到FIN後,狀態由FIN_WAIT_1變遷到CLOSING,併發送最後的ACK;

(3)當收到ACK時,狀態變化成TIME_WAIT。

------------------------------------------------------------------------

 

3、TCP有限狀態機

客戶端TCP狀態遷移:

CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

 

服務器TCP狀態遷移:

CLOSED -> LISTEN -> SYN_RECEIVED -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

wKioL1WNHM2DIo0kAACGHr-AhvE124.gif

(1)CLOSED 狀態時初始狀態。關閉狀態,沒有鏈接活動或正在進行

(2)LISTEN:被動打開,服務器端的 狀態變爲LISTEN(監聽)。

被動打開的概念:鏈接的一端的應用程序通知操做系統,但願創建一個傳入的鏈接。這時候操做系統爲鏈接的這一端創建一個連 接。

與之對應的是主動鏈接:應用程序經過主動打開請求來告訴操做系統創建一個鏈接。

(3)SYNRECVD:服務器端收到SYN後,狀態爲SYN;發送SYN ACK;

(4) SYN_SENTY:應用程序發送SYN後,狀態爲SYN_SENT;

(5)ESTABLISHED: SYNRECVD收到ACK後,狀態爲ESTABLISHED; SYN_SENT在收到SYN ACK,發送ACK,狀態爲ESTABLISHED;

6)FIN_WAIT_1:(主動關閉)應用程序端發送FIN,準備斷開TCP鏈接;狀態從ESTABLISHED——>FIN_WAIT_1;

7)FIN_WAIT_2:(主動關閉)應用程序端只收到服務器端的ACK信號,並無收到FIN信號;說明服務器端還有數據傳輸,那麼此時爲半鏈接;

8)TIME_WAIT:有兩種方式進入 該狀態:

一、FIN_WAIT_1進入:此時應用程序端口收到FIN+ACK(而不是像FIN_WAIT_2那樣只收到ACK,說明數據已經發送完畢)並 向服務器端口發送ACK;

二、FIN_WAIT_2進入:此時應用程序端口收到了FIN,而後向服務器端發送ACK;TIME_WAIT是爲了實現TCP 全雙工鏈接的可靠性關閉,用來重發可能丟失的ACK報文;須要持續2個MSL(最大報文生存時間):假設應用程序端口在進入TIME_WAIT後,2個 MSL時間內並無收到FIN,說明應用程序最後發出的ACK已經收到了;不然,會在2個MSL內在此收到ACK報文;

9 CLOSE_WAIT:(被動關閉)服務器端在收到FIN後,發送ACK,狀態爲CLOSE_WAIT;若是此時服務器端還有數據須要發送,那麼就發送,直到數據發送完畢;此時,服務器端發送FIN,狀態變爲LAST_ACK;

10)LAST-ACK(被動關閉)當被動關閉的一方在發送FIN報文後,等待對方的ACK報文的時候,就處於LAST_ACK 狀態。當收到對方的ACK報文後,也就能夠進入到CLOSED 可用狀態了。

相關文章
相關標籤/搜索