歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 服務器TCP連接的狀態與並發性的探究

服務器TCP連接的狀態與並發性的探究

日期:2017/2/27 16:01:03   编辑:Linux教程
一、TCP與服務器並發的關系
TCP是一個面向連接的協議TCP連接的建立需要三次握手,而連接的中止則需要四次握手。應用層通過TCP協議棧進行數據通信時,TCP會遇到同時為多個應用程序進程提供並發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協議端口傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的並發服務(其實在實際應用中我們只需通過源主機的IP和端口號碼區別出不同的會話)。這也就是為什麼各種TCP服務器都有一個最大連接數限制的原因。

二、TCP可能存在的11種狀態如下:
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:沒有任何連接狀態

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

一)、正常狀態轉換介紹
我們用上圖顯示正常的 TCP 連接的建立與終止過程中,客戶與服務器所經歷的不同狀態。
  1. 服務器端首先執行 LISTEN 原語進入被動打開狀態( LISTEN ),等待客戶端連接;
  2. 當客戶端的一個應用程序發出 CONNECT 命令後,本地的 TCP 實體為其創建一個連接記錄並標記為 SYN SENT 狀態,然後給服務器發送一個 SYN 報文段;
  3. 服務器收到一個 SYN 報文段,其 TCP 實體給客戶端發送確認 ACK 報文段同時發送一個 SYN 信號,進入 SYN RCVD 狀態;
  4. 客戶端收到 SYN + ACK 報文段,其 TCP 實體給服務器端發送出三次握手的最後一個 ACK 報文段,並轉換為 ESTABLISHED 狀態;
  5. 服務器端收到確認的 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 )。

二)、同時打開和同時關閉等狀態
同時打開和同時關閉則是兩種特殊的TCP狀態,發生的概率很小在此不再贅述。
Copyright © Linux教程網 All Rights Reserved