衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是TCP狀態轉移

汽車電子技術 ? 來源:物聯網IoT開發 ? 作者: 杰杰mcu ? 2023-02-14 10:35 ? 次閱讀

TCP狀態轉移

在前一篇文章【面試必考】TCP協議“三次握手”與“四次揮手”已經介紹了TCP協議的三次握手和四次揮手。總的來說,TCP通信過程包括三個步驟:建立TCP連接(三次握手)、數據傳輸、終止TCP連接(四次揮手)。但是在這個通信過程中,有非常復雜的狀態問題,下面就來了解一下進行TCP協議通信時候的狀態轉移。

TCP協議根據連接時接收到報文的不同類型,采取相應動作也不同,還要處理各個狀態的關系,如當收到握手報文時候、超時的時候、用戶主動關閉的時候等都需要不一樣的狀態去采取不一樣的處理。在LwIP中,為了實現TCP協議的狀態描述,定義了11種連接時候的狀態:

1static const char *const tcp_state_str[] = {
 2  "CLOSED",     //關閉狀態(無連接)
 3  "LISTEN",     //監聽狀態
 4  "SYN_SENT",   //已發起請求連接(等待確認)
 5  "SYN_RCVD",   //已收到請求連接
 6  "ESTABLISHED",//穩定連接狀態
 7  "FIN_WAIT_1", //單向請求終止連接狀態
 8  "FIN_WAIT_2", //對方已應答請求終止連接
 9  "CLOSE_WAIT", //等待終止連接
10  "CLOSING",    //兩端同時關閉  
11  "LAST_ACK",   //服務器等待對方接受關閉
12  "TIME_WAIT"   //關閉成功(2MSL等待狀態)
13};
  • LISTEN:表示監聽狀態。服務器調用了listen函數進入監聽狀態,客戶端可以開始進行連接了。
  • SYN_SENT:表示客戶端已經發送了SYN報文請求連接(同時在等待服務器的確認)。當客戶端調用connect函數發起連接時,首先發SYN給服務端,然后自己進入SYN_SENT狀態,并等待服務端發送ACK+SYN報文(握手應答報文)進行確認。
  • SYN_RCVD:在每一個 TCP 連接建立時,都要進行三次握手,這個狀態表示服務器接收到客戶端發來的同步報文段(第一次握手),并且向客戶端發送了確認同步報文段(第二次握手)之后的狀態,在這個狀態時,其實連接已經經歷了兩次握手。
  • ESTABLISHED:這個狀態是處于穩定連接狀態,建立連接的TCP協議兩端的主機都是處于這個狀態,它們相互知道彼此的窗口大小、序列號、最大報文段等信息
  • FIN_WAIT_1FIN_WAIT_2:處于這個狀態一般都是客戶端主機單向請求終止連接,然后主機等待服務器的回應,而如果服務器產生應答,則主機狀態轉移為FIN_WAIT_2,此時<客戶端 -> 服務器 >方向上的TCP連接就斷開,但是<服務器 -> 客戶端>方向上的連接還是存在的。此處有一個注意的地方:如果主機處于FIN_WAIT_2狀態,說明主機已經發出了FIN報文段,并且服務器也已對它進行確認,除非客戶端是在實行半關閉狀態,否則將等待服務器主機的應用層處理關閉連接,因為服務器已經意識到它已收到FIN報文段,它需要發一個 FIN 來關閉<服務器 -> 客戶端>方向上的連接。這樣客戶端這端才會從FIN_WAIT_2狀態進入TIME_WAIT狀態。如果是網絡不好或者是服務器不發送FIN報文段的時候,這意味著客戶端這端可能永遠保持這個FIN_WAIT_2狀態,從而無法 進入CLOSE_WAIT狀態,并一直占用這個端口連接或者socket,在嵌入式中,如果存在多個這種狀態的話,則這很可能導致內存耗盡。
  • CLOSE_WAIT:在收到客戶端主動斷開連接的 FIN 報文段(第一次揮手)后,服務器返回給客戶端確認報文段(第二次揮手)后的狀態。
  • TIME_WAIT狀態:TIME_WAIT狀態也稱為 2MSL等待狀態

具體見下圖:

  • . 紅色虛線:表示服務器的狀態轉移。

  • . 黑色實線:表示客戶端的狀態轉移。

    圖片

    TCP協議狀態轉移

RST報文

順便再提一點不太常見的TCP協議狀態轉移,主要是針對服務器端的(綠色那條):

  1. 服務器在收到SYN握手報文后,再收到了客戶端的RST報文,那么它會重新進入監聽狀態,再重新等待連接。

一般說來,無論何時一個報文段發往基準的連接出現錯誤, TCP都會發出一個復位報文段(這里提到的基準的連接是指由目的 IP地址、目的端口號、源 IP地址和源端口號都是已知的連接。

此外產生復位的另一種常見情況是當連接請求到達時,目的端口并沒有在監聽中,當一個數據報到達目的端口時,它將產生一個ICMP端口不可達的信息,同時TCP協議將進行復位,當然啦,在lwip中這些ICMP端口不可達報文都會被丟棄的,也不用管那么多。

TIME_WAIT狀態

第一次看這個轉移圖的時候,可能很多人都有疑惑,為什么要有一個 TIME_WAIT 狀態?為什么不能直接到達 CLOSED 狀態?

每個具體TCP連接的實現必須選擇一個TCP報文段最大生存時間MSLMaximum Segment Lifetime),就如IP數據報中的TTL字段表示報文在網絡中生存的時間一樣。MSL是任何報文段被丟棄前在網絡內的最長時間,這個時間是有限的,為什么需要等待呢?我們知道 IP數據報 是不可靠的,而TCP報文段是封裝在IP數據報中,TCP協議必須保證發出的 ACK 報文段是正確被對方接收, 因此處于該狀態的主機必須在這個狀態停留最長時間為2倍的MSL,以防最后這個ACK丟失,因為TCP協議必須保證數據能準確送達目的地。

我們來假設一下 :假設沒有 TIME_WAIT 這種狀態。現實中,網絡環境不是理想的。在數據包傳輸的過程中,難免會有一些延時啊、丟包啊的情況發生。如果在客戶端的最后一個確認報文段發出去之后,由于某種原因,沒有到達服務端,服務端在超時后,就會向客戶端重新發一個 FIN 報文段,請求重傳這個已經丟失的確認報文段。但由于在客戶端,連接實際上已經斷開,端口已經關閉。那么在客戶端收到這個報文段后,會向服務端發送一個 RST 報文段請求重連(這也是為什么我要在前面講解RST的原因 ),而此時服務器收到這個 RST報文段后,會認為是錯誤的,因為在服務器看來都沒斷開連接,它所期望收到的是確認報文段。所以這個時候客戶端是不允許直接CLOSE關閉了事的,因此它需要等待服務器確認了,再CLOSE

假設一下:如果沒有 TIME_WAIT 這種狀態,客戶端在關閉連接后,再次成功建立新的連接,客戶端任然可能會收到服務器的最后一個確認報文段,但是由于序號不同(重新建立連接時的序號是隨機的,這點很重要,要記住),客戶端會要求服務端重傳數據包,這樣,連接就必然會混亂出錯。而在 TIME_WAIT 這種狀態等待一段時間是為了讓本次連接的時間內所產生的所有報文都從網絡中消失,使得下一個新的連接不會出現舊的報文。

TIME_WAIT 狀態的等待時間一般是 2MAL ,并且客戶端連接的端口沒有釋放,這樣,讓前一個連接的報文段有足夠的時間被處理或者丟棄,也就不會出現這個問題。

這才是TCP協議優雅且可靠的終止連接方式啊!太強大了,我得膜拜一下~

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 狀態
    +關注

    關注

    0

    文章

    16

    瀏覽量

    11974
  • LwIP
    +關注

    關注

    2

    文章

    88

    瀏覽量

    27371
  • TCP協議
    +關注

    關注

    1

    文章

    101

    瀏覽量

    12124
收藏 人收藏

    評論

    相關推薦

    狀態轉移圖的研究及單流程編程訓練實驗

    狀態轉移圖的研究及單流程編程訓練實驗 一、實驗目的
    發表于 12-26 22:41 ?6063次閱讀
    <b class='flag-5'>狀態</b><b class='flag-5'>轉移</b>圖的研究及單流程編程訓練實驗

    TCP通訊狀態如何獲取

    工控機與外圍設備以太網TCP通訊,如何獲得通訊的狀態,比如是否建立連接,是否空閑中,是否數據發送中等因為需要在設備中啟動前判斷通訊是否正常,發送數據后是否接受成功,有沒有發送完成等信號?初用labview用以太網通訊,還望指點? 感激不盡
    發表于 03-05 16:24

    關于VISA端口狀態轉移方式

    VISA端口 就以串口舉例 狀態轉移A情況:比如只有一個COM1方法:1.初始化COM1后 直接連線 地球人都知道2.初始化后寫入功能全局變量(其實就是未初始化的移位寄存器),下次調用的時候讀出該
    發表于 07-05 18:21

    關于VISA狀態轉移問題

    VISA端口 就以串口舉例 狀態轉移A情況:比如只有一個COM1方法:1.初始化COM1后 直接連線 地球人都知道2.初始化后寫入功能全局變量(其實就是未初始化的移位寄存器),下次調用的時候讀出該
    發表于 07-05 18:24

    基于狀態轉移的獨立按鍵程序設計

    基于狀態轉移的獨立按鍵程序設計本章所描述的按鍵程序要達到的目的:檢測按鍵按下,短按,長按,釋放。即通過按鍵的返回值我們可以獲取到如下的信息:按鍵按下(短按),按鍵長按,按鍵連發,按鍵釋放。不知道大家
    發表于 03-19 14:45

    狀態機下載到片子,狀態轉移

    我用VHDL編寫的程序,Modelsim跑前后仿真都沒有問題。下載到片子上怎么都沒結果。后來考慮可能是沒有進狀態機,試著用LED發現沒有狀態轉移。后來編寫了一個最基本的狀態機程序,發現
    發表于 09-29 10:11

    觸發器的狀態轉移圖和激勵表

    描述觸發器的邏輯功能還可以采用圖形方式,即狀態轉移圖來描述。圖13-4為基本觸發器的狀態轉移圖。圖中兩
    發表于 08-13 09:31 ?2.3w次閱讀
    觸發器的<b class='flag-5'>狀態</b><b class='flag-5'>轉移</b>圖和激勵表

    線性系統狀態轉移矩陣討論

    狀態轉移矩陣是現代控制理論的重要概念,在線性控制系統的運動分析起著重要的作用。分別對連續時間線性時變系統.判斷矩陣函數一線性系統狀態轉移矩陣的充分條件,并求出了其對
    發表于 05-23 15:35 ?0次下載

    TCP IP協議有什么樣的狀態

    首先介紹一下TCP連接建立與關閉過程中的狀態TCP連接過程是狀態的轉換,促使狀態發生轉換的因素包括用戶調用、特定數據包以及超時等,具體
    的頭像 發表于 02-24 14:31 ?3180次閱讀
    <b class='flag-5'>TCP</b> IP協議有什么樣的<b class='flag-5'>狀態</b>

    一種可轉移的對話狀態生成器

    過度依賴域本體和缺乏跨域知識共享是對話狀態跟蹤的兩個實際但尚未研究的問題。現有方法通常在推理期間無法跟蹤未知時隙值,并且常常難以適應新領域。在本文中,我們提出了一種可轉移的對話狀態生成器(TRADE)
    的頭像 發表于 04-09 14:23 ?2309次閱讀

    汽車系統功能分析和狀態轉移圖資料下載

    電子發燒友網為你提供汽車系統功能分析和狀態轉移圖資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 04-11 08:53 ?5次下載
    汽車系統功能分析和<b class='flag-5'>狀態</b><b class='flag-5'>轉移</b>圖資料下載

    PLC單流程狀態轉移圖編程怎么操作

    所謂單一過程,就是狀態轉移只能有一個順序,沒有其他可能。比如轉盤使用凸輪和限位開關實現自動控制的控制過程,只有一個順序,即S0→S20→S21→S22→S0,是典型的單一過程,由單一過程組成的狀態
    發表于 12-27 11:19 ?1860次閱讀

    TCP狀態機設計與實現

    TCP狀態機是TCP連接的變化過程。TCP在三次握手和四次揮手的過程,就是一個TCP狀態說明,
    的頭像 發表于 04-21 11:47 ?1794次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>狀態</b>機設計與實現

    TCP狀態流轉圖詳解

    接下來再看一下著名的 TCP 狀態流轉圖。 CLOSED狀態:表示初始狀態。 LISTEN狀態:表示服務器端的某個 socket 處于監聽
    的頭像 發表于 10-08 17:11 ?1174次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>狀態</b>流轉圖詳解

    TCP協議的連接狀態

    TCP是一個巨復雜的協議,因為他要解決很多問題,而這些問題又帶出了很多子問題和陰暗面。所以學習TCP本身是個比較痛苦的過程,但對于學習的過程卻能讓人有很多收獲。 一、TCP協議的定義 TCP
    的頭像 發表于 11-13 15:47 ?1811次閱讀
    <b class='flag-5'>TCP</b>協議的連接<b class='flag-5'>狀態</b>
    百家乐官网讯特| 真人百家乐官网软件博彩吧| 百家乐官网开户送8彩金| 金满堂百家乐官网的玩法技巧和规则| 兰桂坊百家乐官网的玩法技巧和规则 | 24山方位吉凶| 百家乐官网贴| 百家乐最长的闲| 大发888亚洲城| 真人百家乐官网代理合作| 百家乐网上技巧| 大发888游戏代充| 网上百家乐官网有人赢过嘛| 百家乐能战胜吗| 大发888娱乐场出纳| 百家乐官网公式软件| 大世界百家乐娱乐| 曲阳县| 澳门百家乐娱乐开户| 德州扑克概率计算| 找查百家乐官网玩法技巧| 百家乐荷官培训| 百家乐代理| 百家乐官网园选蒙| 大发888真人游戏| 百家乐官网推广| 百家乐和| 百家乐官网客户端下载| 七胜百家乐官网赌场娱乐网规则| 百家乐投注方法网| 德令哈市| 风水24山对应的字为吉| 大发888下载 34| 劳力士百家乐官网的玩法技巧和规则 | 凱旋門百家乐官网娱乐城| 顶级赌场是骗人的吗| 百家乐官网博赌场| 网上百家乐乐代理| 辽中县| 百家乐打法心得| 百家乐官网稳赢投注方法|