0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TCP狀態(tài)機(jī)設(shè)計與實現(xiàn)

CHANBAEK ? 來源:嵌入式攻城獅 ? 作者:安迪西 ? 2023-04-21 11:47 ? 次閱讀

1.TCP狀態(tài)機(jī)

TCP狀態(tài)機(jī)是TCP連接的變化過程。 TCP在三次握手和四次揮手的過程,就是一個TCP的狀態(tài)說明,由于TCP是一個面向連接的,可靠的傳輸,每一次的傳輸都會經(jīng)歷連接,傳輸,關(guān)閉的過程,無論是哪個方向的傳輸,必須建立連接才行,在雙方通信的過程中,TCP的狀態(tài)是不一樣的

下圖說明了TCP狀態(tài)的變化過程

圖片

上圖中不同線條的含義

  • 粗線:主動發(fā)起連接(可理解為客戶端模型)
  • 虛線:被動發(fā)起連接(可理解為服務(wù)器模型)
  • 細(xì)線:兩端同時操作

TCP各個狀態(tài)的解釋如下:

CLOSED 表示初始狀態(tài)

LISTEN 表示服務(wù)器端的某個socket處于監(jiān)聽狀態(tài),可以接受連接

SYN_SENT 與SYN_RCVD呼應(yīng),當(dāng)客戶端socket執(zhí)行connect連接時,它首先發(fā)送SYN報文,隨即進(jìn)入到了SYN_SENT狀態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個報文。 該狀態(tài)表示客戶端已發(fā)送SYN報文

SYN_RCVD 表示接收到SYN報文,正常情況下,該狀態(tài)是服務(wù)器端的socket在建立TCP連接時的三次握手會話過程中的一個中間狀態(tài),很短暫。 此種狀態(tài)時,當(dāng)收到客戶端的ACK報文后,會進(jìn)入到ESTABLISHED狀態(tài)

ESTABLISHED 表示連接已經(jīng)建立

FIN_WAIT_1 表示等待對方的FIN報文,當(dāng)socket在ESTABLISHED狀態(tài)時,想主動關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報文,此時該socket進(jìn)入到FIN_WAIT_1狀態(tài)

FIN_WAIT_2 主動關(guān)閉鏈接的一方,發(fā)出FIN收到ACK以后進(jìn)入該狀態(tài),稱為半連接或半關(guān)閉狀態(tài),此時socket只能接收數(shù)據(jù),不能發(fā)。 當(dāng)對方回應(yīng)ACK后,socket即進(jìn)入到FIN_WAIT_2狀態(tài),正常情況下,對方應(yīng)馬上回應(yīng)ACK報文,所以FIN_WAIT_1狀態(tài)一般較難見到,而FIN_WAIT_2狀態(tài)可用netstat看到

TIME_WAIT 表示收到了對方的FIN報文,并發(fā)送出了ACK報文,等2MSL后即可回到CLOSED可用狀態(tài)。 如果FIN_WAIT_1狀態(tài)下,收到對方同時帶 FIN標(biāo)志和ACK標(biāo)志的報文時,可以直接進(jìn)入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)

CLOSING 這種狀態(tài)較特殊,屬于一種較罕見的狀態(tài)。 正常情況下,當(dāng)發(fā)送FIN報文后,按理來說是應(yīng)該先收到(或同時收到)對方的 ACK報文,再收到對方的FIN報文。 但是CLOSING狀態(tài)表示你發(fā)送FIN報文后,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文。 什么情況下會出現(xiàn)此種情況呢? 如果雙方幾乎在同時close一個socket的話,那么就出現(xiàn)了雙方同時發(fā)送FIN報文的情況,也即會出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉socket連接

CLOSE_WAIT 此種狀態(tài)表示在等待關(guān)閉。 當(dāng)對方關(guān)閉一個socket后發(fā)送FIN報文給自己,系統(tǒng)回應(yīng)一個ACK報文給對方,此時進(jìn)入CLOSE_WAIT狀態(tài)。 接下來察看是否還有數(shù)據(jù)發(fā)送給對方,若無,則可close這個socket,發(fā)送FIN報文給對方,即關(guān)閉連接。 所以在CLOSE_WAIT狀態(tài)下,需要關(guān)閉連接

LAST_ACK 該狀態(tài)是被動關(guān)閉一方在發(fā)送FIN報文后,最后等待對方的ACK報文。 當(dāng)收到ACK報文后,即可以進(jìn)入到CLOSED可用狀態(tài)

2.TCP狀態(tài)分析

2.1 TCP狀態(tài)分析工具

利用網(wǎng)絡(luò)助手 + nc命令 + netstat命令工具,來查看及分析TCP狀態(tài):

使用網(wǎng)絡(luò)調(diào)試助手創(chuàng)建服務(wù)器(或客戶端)

使用nc命令(netcat)創(chuàng)建客戶端(服務(wù)端)

connect to somewhere:   nc [-options] hostname port[s] [ports] ...
listen for inbound:     nc -l -p port [options] [hostname] [port]
options:
        -d              detach from console, background mode
        -e prog         inbound program to exec [dangerous!!]
        -g gateway      source-routing hop point[s], up to 8
        -G num          source-routing pointer: 4, 8, 12, ...
        -h              this cruft
        -i secs         delay interval for lines sent, ports scanned
        -l              listen mode, for inbound connects
        -L              listen harder, re-listen on socket close
        -n              numeric-only IP addresses, no DNS
        -o file         hex dump of traffic
        -p port         local port number
        -r              randomize local and remote ports
        -s addr         local source address
        -t              answer TELNET negotiation
        -c              send CRLF instead of just LF
        -u              UDP mode
        -v              verbose [use twice to be more verbose]
        -w secs         timeout for connects and final net reads
        -z              zero-I/O mode [used for scanning]
port numbers can be individual or ranges: m-n [inclusive]

nc 連接服務(wù)器

nc 127.0.0.1 6666

nc 建立服務(wù)器

nc -l -p 6666

使用netstat和find命令查看tcp狀態(tài)

netstat命令:

顯示協(xié)議統(tǒng)計信息和當(dāng)前 TCP/IP 網(wǎng)絡(luò)連接。
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]
  -a        顯示所有連接和偵聽端口。
  -b        顯示在創(chuàng)建每個連接或偵聽端口時涉及的可執(zhí)行程序。在某些情況下,已知可執(zhí)
  	    行程序承載多個獨(dú)立的組件,這些情況下,顯示創(chuàng)建連接或偵聽端口時涉及的組
  	    件序列。在此情況下,可執(zhí)行程序的名稱位于底部 [] 中,它調(diào)用的組件位于頂
  	    部,直至達(dá)到 TCP/IP。注意,此選項可能很耗時,并且在你沒有足夠權(quán)限時可
  	    能失敗。
  -e        顯示以太網(wǎng)統(tǒng)計信息。此選項可以與 -s 選項結(jié)合使用。
  -f        顯示外部地址的完全限定域名(FQDN)。
  -n        以數(shù)字形式顯示地址和端口號。
  -o        顯示擁有的與每個連接關(guān)聯(lián)的進(jìn)程 ID。
  -p proto  顯示 proto 指定的協(xié)議的連接;proto可以是下列任何一個: TCP、UDP、TCPv6 
  	    或 UDPv6。如果與 -s 選項一起用來顯示每個協(xié)議的統(tǒng)計信息,proto 可以是下
  	    列任何一個: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
  -q        顯示所有連接、偵聽端口和綁定的非偵聽 TCP 端口。綁定的非偵聽端口不一定與
  	    活動連接相關(guān)聯(lián)。
  -r        顯示路由表。
  -s        顯示每個協(xié)議的統(tǒng)計信息。默認(rèn)情況下,
            顯示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的統(tǒng)計信息;
  -p        選項可用于指定默認(rèn)的子網(wǎng)。
  -t        顯示當(dāng)前連接卸載狀態(tài)。
  -x        顯示 NetworkDirect 連接、偵聽器和共享終結(jié)點(diǎn)。
  -y        顯示所有連接的 TCP 連接模板。無法與其他選項結(jié)合使用。
  interval  重新顯示選定的統(tǒng)計信息,各個顯示間暫停的間隔秒數(shù)。按 CTRL+C 停止重新顯示
            統(tǒng)計信息。如果省略,則 netstat 將打印當(dāng)前的配置信息一次。

find命令:

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         顯示所有未包含指定字符串的行。
  /C         僅顯示包含字符串的行數(shù)。
  /N         顯示行號。
  /I         搜索字符串時忽略大小寫。
  /OFF[LINE] 不要跳過具有脫機(jī)屬性集的文件。
  "string"   指定要搜索的文本字符串。
  [drive:][path]filename 指定要搜索的文件。

如果沒有指定路徑,F(xiàn)IND 將搜索在提示符處鍵入文本或者由另一命令產(chǎn)生的文本。

2.2 TCP狀態(tài)分析流程

使用網(wǎng)絡(luò)調(diào)試助手開啟一個服務(wù)器,監(jiān)聽“127.0.0.1”和端口“6666”

圖片

此時使用nc命令 netstat -an -p tcp | find “6666” 可見端口“6666”的狀態(tài)為:

LISTENING

圖片

重開一個cmd命令對話框,使用nc命令nc 127.0.0.1 6666連接服務(wù)器

圖片

再次使用nc命令netstat -an -p tcp | find “6666” 可見端口“6666”的狀態(tài)為:

ESTABLISHED

圖片

網(wǎng)絡(luò)調(diào)試助手停止監(jiān)聽后,再次查看tcp端口“6666”,此時的狀態(tài)為:TIME_WAIT

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8958

    瀏覽量

    85085
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1347

    瀏覽量

    78933
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    491

    瀏覽量

    27457
  • 客戶端
    +關(guān)注

    關(guān)注

    1

    文章

    289

    瀏覽量

    16640
收藏 人收藏

    評論

    相關(guān)推薦

    FPGA工程師:如何在FPGA中實現(xiàn)狀態(tài)機(jī)

    安全高效的狀態(tài)機(jī)設(shè)計對于任何使用FPGA的工程師而言都是一項重要技能。選擇Moore狀態(tài)機(jī)、Mealy狀態(tài)機(jī)還是混合機(jī)取決于整個系統(tǒng)的需求。無論選擇哪種類型的狀態(tài)機(jī),充分掌握
    發(fā)表于 03-29 15:02 ?1.3w次閱讀
    FPGA工程師:如何在FPGA中<b class='flag-5'>實現(xiàn)狀態(tài)機(jī)</b>?

    Spring狀態(tài)機(jī)實現(xiàn)原理和使用方法

    說起 Spring 狀態(tài)機(jī),大家很容易聯(lián)想到這個狀態(tài)機(jī)和設(shè)計模式中狀態(tài)模式的區(qū)別是啥呢?沒錯,Spring 狀態(tài)機(jī)就是狀態(tài)模式的一種
    的頭像 發(fā)表于 12-26 09:39 ?1834次閱讀
    Spring<b class='flag-5'>狀態(tài)機(jī)</b>的<b class='flag-5'>實現(xiàn)</b>原理和使用方法

    高效安全的狀態(tài)機(jī)設(shè)

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 高效安全的狀態(tài)機(jī)設(shè)
    發(fā)表于 08-13 17:53

    狀態(tài)機(jī)設(shè)計的例子

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 狀態(tài)機(jī)設(shè)計的例子
    發(fā)表于 08-19 23:01

    狀態(tài)機(jī)設(shè)計指導(dǎo)

    狀態(tài)機(jī)設(shè)計指導(dǎo)
    發(fā)表于 08-20 23:45

    狀態(tài)機(jī)設(shè)計問題

    狀態(tài)機(jī)設(shè)計中always @(*) beginnext = 2'bx;case (state)idle: next=s1;s1: next=s2;s2: next=idle;end以上代碼先給
    發(fā)表于 10-06 18:49

    一個簡單的狀態(tài)機(jī)設(shè)

    筆試時也很常見。[例1] 一個簡單的狀態(tài)機(jī)設(shè)計--序列檢測器序列檢測器是時序數(shù)字電路設(shè)計中經(jīng)典的教學(xué)范例,下面我們將用Verilog HDL語言來描述、仿真、并實現(xiàn)它。序列檢測器的邏輯功能...
    發(fā)表于 02-16 07:29

    如何寫好狀態(tài)機(jī)

    如何寫好狀態(tài)機(jī):狀態(tài)機(jī)是邏輯設(shè)計的重要內(nèi)容,狀態(tài)機(jī)的設(shè)計水平直接反應(yīng)工程師的邏輯功底,所以許多公司的硬件和邏輯工程師面試中,狀態(tài)機(jī)設(shè)計幾乎是必選題目。本章在引入
    發(fā)表于 06-14 19:24 ?97次下載

    狀態(tài)機(jī)設(shè)

    狀態(tài)機(jī)設(shè)計:8.1.1 數(shù)據(jù)類型定義語句TYPE語句的用法如下:TYPE 數(shù)據(jù)類型名IS 數(shù)據(jù)類型定義OF 基本數(shù)據(jù)類型;或TYPE 數(shù)據(jù)類型名IS 數(shù)據(jù)類型定義;TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_L
    發(fā)表于 08-09 23:07 ?36次下載

    高速環(huán)境下FPGA或CPLD中的狀態(tài)機(jī)設(shè)

        本文給出了采用這些技術(shù)的高速環(huán)境狀態(tài)機(jī)設(shè)計的規(guī)范及分析方法和優(yōu)化方法,并給出了相應(yīng)的示例。       為了使FPGA或CPLD中的狀態(tài)機(jī)設(shè)
    發(fā)表于 04-15 11:27 ?662次閱讀
    高速環(huán)境下FPGA或CPLD中的<b class='flag-5'>狀態(tài)機(jī)設(shè)</b>計

    如何使用STATECAD進(jìn)行多狀態(tài)機(jī)設(shè)計實例分析

    有限狀態(tài)機(jī)設(shè)計的關(guān)鍵是如何把一個實際的時序邏輯關(guān)系抽象成一個時序邏輯函數(shù),傳統(tǒng)的電路圖輸入法通過直接設(shè)計寄存器組來實現(xiàn)各個狀態(tài)之間的轉(zhuǎn)換, 而用硬件描述語言來描述有限
    發(fā)表于 11-11 09:49 ?2063次閱讀
    如何使用STATECAD進(jìn)行多<b class='flag-5'>狀態(tài)機(jī)設(shè)</b>計實例分析

    VHDL有限狀態(tài)機(jī)設(shè)計-ST

    EDA的有限狀態(tài)機(jī),廣義而言是指只要涉及觸發(fā)器的電路,無論電路大小都可以歸結(jié)為狀態(tài)機(jī)。有限狀態(tài)機(jī)設(shè)計在學(xué)習(xí)EDA時是很重要的一章。
    發(fā)表于 06-08 16:46 ?3次下載

    狀態(tài)機(jī)實現(xiàn)哪些內(nèi)容

    狀態(tài)機(jī)模式是一種行為模式,通過多態(tài)實現(xiàn)不同狀態(tài)的調(diào)轉(zhuǎn)行為的確是一種很好的方法,只可惜在嵌入式環(huán)境下,有時只能寫純C代碼,并且還需要考慮代碼的重入和多任務(wù)請求跳轉(zhuǎn)等情形,因此實現(xiàn)起來著實
    的頭像 發(fā)表于 06-22 14:26 ?700次閱讀
    <b class='flag-5'>狀態(tài)機(jī)</b>要<b class='flag-5'>實現(xiàn)</b>哪些內(nèi)容

    基于FPGA的狀態(tài)機(jī)設(shè)

    狀態(tài)機(jī)的基礎(chǔ)知識依然強(qiáng)烈推薦mooc上華科的數(shù)字電路與邏輯設(shè)計,yyds!但是數(shù)電基礎(chǔ)一定要和實際應(yīng)用結(jié)合起來,理論才能發(fā)揮真正的價值。我們知道FPGA是并行執(zhí)行的,如果我們想要處理具有前后順序的事件就需要引入狀態(tài)機(jī)
    的頭像 發(fā)表于 07-28 10:02 ?904次閱讀
    基于FPGA的<b class='flag-5'>狀態(tài)機(jī)設(shè)</b>計

    什么是狀態(tài)機(jī)?狀態(tài)機(jī)的種類與實現(xiàn)

    狀態(tài)機(jī),又稱有限狀態(tài)機(jī)(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(jī)(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化的模型。在芯片設(shè)計中,
    的頭像 發(fā)表于 10-19 10:27 ?8842次閱讀