[翻譯]簡單描述 TCP 有限狀態機

原文地址:鏈接服務器

TCP 有限狀態機能夠用來描述 TCP 鏈接的全部階段。從鏈接前的 null 狀態,到創建鏈接過程當中經歷的一系列狀態,以及關閉鏈接過程當中出現的一系列狀態。數據結構

要完整地描述上述過程須要囊括大部分的 TCP 標準,免不了大段複雜的解釋。這隻會讓你們昏昏入睡。大部分人其實只需大體瞭解下就能夠了。簡化的TCP 有限狀態機無疑能作到這點。tcp

本篇文章將用一圖一表簡單介紹 TCP 的各類狀態,介紹設備在這些狀態下所執行的動做,以及它們的下一狀態。爲了簡化描述,咱們用三個英文簡稱來表明觸發狀態轉變的三種信號。這三個英文簡稱來自 TCP 報頭的標識位(TCP header flag)ide

  • SYN:同步信號,用來創建鏈接。之因此稱爲同步信號(SYN)是由於它的做用是同步兩端設備的初始序列號(sequence numbers)ui

  • FIN:結束信號,代表設備但願停止鏈接spa

  • ACK:迴應信號,表示成功接收到對方發過來的信號設計

再次聲明,這裏只會講解了 TCP 鏈接、斷開時涉及的正常狀態,一些應對錯誤時出現的 TCP 狀態不會在這裏講述。若是所有講完,就違背了本篇「簡單」的宗旨htm

因爲不會使用嵌套表格,因此另起了一列,重複內容用 \ 代替圖片

狀態 狀態描述 設備動做及下一個狀態
CLOSED CLOSED狀態是創建鏈接前所處的狀態 被動開啓:服務器 TCP 端口被動開啓,鏈接開始進行。服務器會創建控制鏈接的傳輸控制塊(一種數據結構,簡稱 TCB),而後進入 LISTEN 狀態
\ \ 主動開啓,發送 SYN :客戶端發送 SYN ,主動進行鏈接,同時創建傳輸控制塊(TCB)。而後進入 SYN-SENT 狀態
LISTEN LISTEN 狀態代表設備(一般是服務器)正在等待接收對方 SYN ,自家的 SYN 還沒有發送 接收到客戶端的 SYN ,發送 SYN + ACK :服務端接收到客戶端發送的 SYN 後進行回覆,迴應信號包括本身的SYN,以及代表收到客戶端 SYN 的 ACK 信號。隨後,服務端進入 SYN-RECEIVED 狀態
SYN-SENT SYN-SENT 狀態代表設備(一般是客戶端)已經發送了 SYN , 正在等待另外一端設備(一般是服務端)發送 SYN進行配對 收到另外一端發送的 SYN,迴應 ACK:若是設備已經發送了 SYN,且接收到了配對端的 SYN,但尚未收到配對端迴應 SYN 的 ACK。那麼設備將發送 ACK,代表本身已經接收到對方的 SYN。隨後進入 SYN-RECEVIED 狀態,等待接收對方迴應本身 SYN 的 ACK
\ \ 收到配對端的 SYN + ACK,發送 ACK:若是接收到對方的 SYN ,也接收到了對方迴應這邊 SYN 的 ACK,那麼設備就發送 ACK,告知對方本身收到了它的 SYN。進入 ESTABLISHED 狀態
SYN-RECEIVED SYN-RECEIVED 代表設備收到對方發過來的 SYN ,本身也向對方發送了 SYN。如今正在等待接收對方發送的 ACK, 以確認配對一方已收到這邊發送的 SYN 接收 ACK:當收到對方的 ACK (表示收到這邊發送的 SYN),進入 ESTABLISHED 狀態
ESTABLISHED ESTABLISHED 狀態是 TCP 鏈接完成後所處的穩定狀態。此時,鏈接雙方能夠自由收發數據。ESTABLISHED 狀態會一直維持到 TCP 鏈接結束 請求關閉,發送 FIN:設備發送帶有 FIN 標識的信號,要求關閉鏈接。隨後進入 FIN-WAIT-1 狀態
\ \ 接收 FIN:設備接收到鏈接方爲關閉鏈接而傳來的 FIN。設備迴應 ACK,進入 CLOSE-WAIT 狀態
CLOSE-WAIT CLOSE-WAIT 狀態表示設備接收到鏈接方傳來的 FIN,如今須要等待設備上的程序爲關閉鏈接作相應的工做 請求關閉,發送 FIN:設備上使用 TCP 的程序被告知鏈接端要求關閉 TCP 鏈接,程序因而向設備的 TCP 層發出關閉請求。TCP 發送 FIN 給已經提出關閉要求(已經發送了 FIN)的鏈接端。進入 LAST-ASK 狀態
LAST-ACK LAST-ASK表示設備已經接收了另外一端發送過來的 FIN,並回應了ACK。也向對方發送了 FIN,此時還需等待接收對方迴應的 ACK,以確認對方成功接收了這邊發送過去的 FIN 收到了迴應 FIN 的 ACK:設備收到了迴應 FIN 的 ACK。如今 TCP 兩端的設備都各自發送了 FIN,也各自收到了對方的迴應。所以,設備直接進入了 CLOSED 狀態
FIN-WAIT-1 FIN-WAIT-1 狀態代表設備可能處在等待接收對方迴應收到 FIN 的 ACK ,也可能處在等待接收對方發送的 FIN 收到迴應 FIN 的 ACK:設備收到迴應本身關閉請求的答覆,進入 FIN-WAIT-2 狀態
\ \ 收到 FIN,發送 ACK:設備沒有接到對方爲回覆 FIN 而發送的 ACK,但收到了對方請求關閉鏈接的 FIN。那麼設備迴應對方發來的 FIN,發送 ACK,而後進入 CLOSING 狀態
FIN-WAIT-2 FIN_WAIT_2 狀態代表設備已經發送了 FIN,而且收到了對方迴應的 ACK,還在等待對方發送 FIN 接收到 FIN,發送 ACK:設備接收到對方的 FIN,迴應 ACK,進入 TIME-WAIT 狀態
CLOSING CLOSING狀態代表設備已經接收到了對方的 FIN,本身也迴應了 ACK,還需等待接收對方迴應本身 FIN 的 ACK 接收到迴應 FIN 的 ACK:設備接收到對方迴應本身 FIN 的 ACK,進入 TIME-WAIT 狀態
TIME-WAIT 設備處於 TIME-WAIT 狀態代表設備收到了對方的 FIN,而且迴應了 ACK,設備發送了 FIN,也收到了對方迴應的 ACK。此時能夠關閉鏈接。不過咱們仍是要倒計一段時間再關閉,防止影響鏈接端接收這邊發送過去的 ACK。也防止和新鏈接產生衝突 倒計時間到:設計的定時時間耗盡後,鏈接關閉,進入 CLOSED 狀態

圖片描述

相關文章
相關標籤/搜索