天天看點

伺服器TCP連接配接的狀态與并發性的探究

 最近在研究學習伺服器并發性方面的相關資料,運維工程師在探讨伺服器并發性時就不可避免的需要了解和掌握TCP/IP協定相關的知識。比如我們會經常使用指令netstat檢視伺服器并發情況時但是運維人員對tcp的傳回狀态了解多少,我們又是該怎樣計算目前伺服器并發數量?是以作為運維工程師有必要深入了解tcp相關協定的實作原理和機制。廢話不說了,還是聊一聊今天的正題吧

伺服器TCP連接配接的狀态與并發性的探究

<b>一、</b><b>TCP</b><b>與伺服器并發的關系</b><b></b>

TCP是一個面向連接配接的協定TCP連接配接的建立需要三次握手,而連接配接的中止則需要四次握手。應用層通過TCP協定棧進行資料通信時,TCP會遇到同時為多個應用程式程序提供并發服務的問題。多個TCP連接配接或多個應用程式程序可能需要通過同一個 TCP協定端口傳輸資料。為了差別不同的應用程式程序和連接配接,許多計算機作業系統為應用程式與TCP/IP協定互動提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程式程序或網絡連接配接的通信,實作資料傳輸的并發服務(其實在實際應用中我們隻需通過源主機的IP和端口号碼差別出不同的會話)。這也就是為什麼各種TCP伺服器都有一個最大連接配接數限制的原因。

<b>二、</b><b>TCP</b><b>可能存在的</b><b>11</b><b>種狀态如下:</b><b></b>

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:沒有任何連接配接狀态

<b>三、</b><b>TCP</b><b>狀态轉換圖:</b>

伺服器TCP連接配接的狀态與并發性的探究

上圖描述了 TCP 的11種狀态的轉換關系,圖中的圓角矩形表示狀态,箭頭表示狀态之間的轉換。圖中用粗線表示用戶端主動和被動的伺服器端建立連接配接的正常過程:用戶端的狀态變遷用粗實線,伺服器端的狀态變遷用粗虛線。細線用于不常見的序列,如複位、同時打開、同時關閉等。圖中的每條狀态變換線上均标有“事件/動作”:事件是指使用者執行了系統調用( CONNECT 、 LISTEN 、 SEND 或 CLOSE )、收到一個封包段( SYN 、 FIN 、 ACK 或 RST )、或者是出現了超過兩倍最大的分組生命期的情況;動作是指發送一個封包段( SYN 、 FIN 或 ACK )或什麼也沒有(用“-”表示)。粗實線表示客戶的正常路徑;粗虛線表示伺服器的正常路徑;細線表示不常見的事件。每個連接配接均開始于 CLOSED 狀态。當一方執行了被動的連接配接原語( LISTEN )或主動的連接配接原語( CONNECT )時,它便會脫離 CLOSED 狀态。如果此時另一方執行了相對應的連接配接原語,連接配接便建立了,并且狀态變為 ESTABLISHED 。任何一方均可以首先請求釋放連接配接,當連接配接被釋放後,狀态又回到了 CLOSED 。

<b>一)、正常狀态轉換介紹</b>

   我們用上圖顯示正常的 TCP 連接配接的建立與終止過程中,客戶與伺服器所經曆的不同狀态。

伺服器端首先執行 LISTEN 原語進入被動打開狀态( LISTEN ),等待用戶端連接配接;

當用戶端的一個應用程式發出 CONNECT 指令後,本地的 TCP 實體為其建立一個連接配接記錄并标記為 SYN SENT 狀态,然後給伺服器發送一個 SYN 封包段;

伺服器收到一個 SYN 封包段,其 TCP 實體給用戶端發送确認 ACK 封包段同時發送一個 SYN 信号,進入 SYN RCVD 狀态;

用戶端收到 SYN + ACK 封包段,其 TCP 實體給伺服器端發送出三次握手的最後一個 ACK 封包段,并轉換為 ESTABLISHED 狀态;

伺服器端收到确認的 ACK 封包段,完成了三次握手,于是也進入 ESTABLISHED 狀态。

在此狀态下,雙方可以自由傳輸資料。當一個應用程式完成資料傳輸任務後,它需要關閉 TCP 連接配接。假設仍由用戶端發起主動關閉連接配接。

1)  用戶端執行 CLOSE 原語,本地的 TCP 實體發送一個 FIN 封包段并等待響應的确認(進入狀态 FIN WAIT 1 );

2)  伺服器收到一個 FIN 封包段,它确認用戶端的請求發回一個 ACK 封包段,進入 CLOSE WAIT 狀态;

3)  用戶端收到确認 ACK 封包段,就轉移到 FIN WAIT 2 狀态,此時連接配接在一個方向上就斷開了;

4)  伺服器端應用得到通告後,也執行 CLOSE 原語關閉另一個方向的連接配接,其本地 TCP 實體向用戶端發送一個 FIN 封包段,并進入 LAST ACK 狀态,等待最後一個 ACK 确認封包段;

5)  用戶端收到 FIN 封包段并确認,進入 TIMED WAIT 狀态,此時雙方連接配接均已經斷開,但 TCP 要等待一個 2 倍封包段最大生存時間 MSL ( Maximum Segment Lifetime ),確定該連接配接的所有分組全部消失,以防止出現确認丢失的情況。當定時器逾時後, TCP 删除該連接配接記錄,傳回到初始狀态( CLOSED )。

6)  伺服器收到最後一個确認 ACK 封包段,其 TCP 實體便釋放該連接配接,并删除連接配接記錄,傳回到初始狀态( CLOSED )。

<b>二)、同時打開和同時關閉等狀态</b><b></b>

同時打開和同時關閉則是兩種特殊的TCP狀态,發生的機率很小在此不再贅述。如有興趣的同學可以弄本tcp/ip原理方面的書看看!

繼續閱讀