首頁 > 軟體

TCP的建立和終止 圖解

2020-06-16 17:17:46

前言

在沒有理解TCP連線是如何建立和終止之前,我想你可能並不會使用connect,accept,close這三個函數並且使用netstat程式來偵錯應用。所以掌握TCP連線的建立和終止勢在必行。

三次握手

  1. 用戶端首先通過呼叫connect函數發起主動開啟(伺服器為被動開啟),這導致用戶端TCP傳送一個SYN同步分節(Synchronize Sequence Numbers),告訴伺服器將在連線中傳送的資料的初始序列號,如圖為 J;(SYN分節不攜帶資料,其所在的IP資料包只含有一個IP首部、一個TCP首部以及可能有的TCP選項)

  2. 伺服器需要對用戶端的請求進行確認,同時自己也傳送一個SYN分節(包含伺服器將在同一連線中傳送的資料的初始序列號)

  3. 用戶端進行確認。

為什麼傳送加一的序列號呢?因為這是傳送這一端所期待的下一個序列號,而且SYN佔據一個位元組的序列號空間;

四次揮手

在步驟2和步驟3之間,從執行被動關閉一端到執行主動關閉一端流動資料是又可能,這成為半關閉。

這個圖只是展示了用戶端執行主動關閉的情況,不過無論是用戶端還是伺服器端,任何一方都可以執行主動關閉。

TCP狀態轉換圖

在理解了前面的知識以後,再來看總體的狀態轉換圖就會簡單很多。

TCP為一個連線定義了11種狀態,並且TCP規則規定如何基於當前狀態及在該狀態下所接收的分節從一個狀態轉換到另一個狀態。

LISTEN :監聽來自遠方TCP埠的連線請求。
SYN-SENT :在傳送連線請求後等待匹配的連線請求。
SYN-RECEⅣED :在收到和傳送一個連線請求後等待對連線請求的確認。
ESTABLISHED :代表一個開啟的連線,資料可以傳送給使用者。
FIN-WAIT-1 :等待遠端TCP的連線中斷請求,或先前的連線中斷請求的確認。
FIN-WAIT-2 :從遠端TCP等待連線中斷請求。
CLOSE-WAIT :等待從本地使用者發來的連線中斷請求。
CLOSING :等待遠端TCP對連線中斷的確認。
LAST-ACK :等待原來發向遠端TCP的連線中斷請求的確認。
TIME-WAIT :等待足夠的時間以確保遠端TCP接收到連線中斷請求的確認。
CLOSED :沒有任何連線狀態。

TCP連線過程是狀態的轉換,促使發生狀態轉換的是使用者呼叫:OPEN,SEND,RECEⅣE,CLOSE,ABORT和STATUS。傳送過來的資料段,特別那些包括以下標記的資料段SYN,ACK,RST和FIN。還有超時,上面所說的都會時TCP狀態發生變化。

圖中粗實線代表的是用戶端狀態轉換,虛線代表的是伺服器狀態轉換。

我們從圖中可以發現兩種特殊的情況,分別是同時開啟和同時關閉,前者發生在兩端幾乎同時傳送SYN並且這兩個SYN在網路中交錯的情形下,後者傳送在同時傳送FIN的情形下。

同時開啟

很明顯,這個連線的過程經歷四次資料交換,但是一個典型的連線建立只需要3次。

從狀態轉換圖中可以發現,TCP在遇見這種協定的時候,只會開啟一條連線,比如圖中是由用戶端做主動開啟。

同時關閉

在傳送程式後則會進入到 FIN_WAIT_1 狀態。在收到對端的FIN後,回復一個ACK,會進入CLOSING狀態。在收到對端的ACK後,進入TIME_WAIT狀態,也就是說,這中間不會在存在半關閉的狀態。

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-04/142659.htm


IT145.com E-mail:sddin#qq.com