1.TCP狀態(tài)機(jī)
TCP狀態(tài)機(jī)是TCP連接的變化過程。 TCP在三次握手和四次揮手的過程,就是一個(gè)TCP的狀態(tài)說明,由于TCP是一個(gè)面向連接的,可靠的傳輸,每一次的傳輸都會(huì)經(jīng)歷連接,傳輸,關(guān)閉的過程,無論是哪個(gè)方向的傳輸,必須建立連接才行,在雙方通信的過程中,TCP的狀態(tài)是不一樣的
下圖說明了TCP狀態(tài)的變化過程
上圖中不同線條的含義
- 粗線:主動(dòng)發(fā)起連接(可理解為客戶端模型)
- 虛線:被動(dòng)發(fā)起連接(可理解為服務(wù)器模型)
- 細(xì)線:兩端同時(shí)操作
TCP各個(gè)狀態(tài)的解釋如下:
CLOSED : 表示初始狀態(tài)
LISTEN : 表示服務(wù)器端的某個(gè)socket處于監(jiān)聽狀態(tài),可以接受連接
SYN_SENT : 與SYN_RCVD呼應(yīng),當(dāng)客戶端socket執(zhí)行connect連接時(shí),它首先發(fā)送SYN報(bào)文,隨即進(jìn)入到了SYN_SENT狀態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個(gè)報(bào)文。 該狀態(tài)表示客戶端已發(fā)送SYN報(bào)文
SYN_RCVD : 表示接收到SYN報(bào)文,正常情況下,該狀態(tài)是服務(wù)器端的socket在建立TCP連接時(shí)的三次握手會(huì)話過程中的一個(gè)中間狀態(tài),很短暫。 此種狀態(tài)時(shí),當(dāng)收到客戶端的ACK報(bào)文后,會(huì)進(jìn)入到ESTABLISHED狀態(tài)
ESTABLISHED : 表示連接已經(jīng)建立
FIN_WAIT_1 : 表示等待對方的FIN報(bào)文,當(dāng)socket在ESTABLISHED狀態(tài)時(shí),想主動(dòng)關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報(bào)文,此時(shí)該socket進(jìn)入到FIN_WAIT_1狀態(tài)
FIN_WAIT_2 : 主動(dòng)關(guān)閉鏈接的一方,發(fā)出FIN收到ACK以后進(jìn)入該狀態(tài),稱為半連接或半關(guān)閉狀態(tài),此時(shí)socket只能接收數(shù)據(jù),不能發(fā)。 當(dāng)對方回應(yīng)ACK后,socket即進(jìn)入到FIN_WAIT_2狀態(tài),正常情況下,對方應(yīng)馬上回應(yīng)ACK報(bào)文,所以FIN_WAIT_1狀態(tài)一般較難見到,而FIN_WAIT_2狀態(tài)可用netstat看到
TIME_WAIT : 表示收到了對方的FIN報(bào)文,并發(fā)送出了ACK報(bào)文,等2MSL后即可回到CLOSED可用狀態(tài)。 如果FIN_WAIT_1狀態(tài)下,收到對方同時(shí)帶 FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí),可以直接進(jìn)入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)
CLOSING : 這種狀態(tài)較特殊,屬于一種較罕見的狀態(tài)。 正常情況下,當(dāng)發(fā)送FIN報(bào)文后,按理來說是應(yīng)該先收到(或同時(shí)收到)對方的 ACK報(bào)文,再收到對方的FIN報(bào)文。 但是CLOSING狀態(tài)表示你發(fā)送FIN報(bào)文后,并沒有收到對方的ACK報(bào)文,反而卻也收到了對方的FIN報(bào)文。 什么情況下會(huì)出現(xiàn)此種情況呢? 如果雙方幾乎在同時(shí)close一個(gè)socket的話,那么就出現(xiàn)了雙方同時(shí)發(fā)送FIN報(bào)文的情況,也即會(huì)出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉socket連接
CLOSE_WAIT : 此種狀態(tài)表示在等待關(guān)閉。 當(dāng)對方關(guān)閉一個(gè)socket后發(fā)送FIN報(bào)文給自己,系統(tǒng)回應(yīng)一個(gè)ACK報(bào)文給對方,此時(shí)進(jìn)入CLOSE_WAIT狀態(tài)。 接下來察看是否還有數(shù)據(jù)發(fā)送給對方,若無,則可close這個(gè)socket,發(fā)送FIN報(bào)文給對方,即關(guān)閉連接。 所以在CLOSE_WAIT狀態(tài)下,需要關(guān)閉連接
LAST_ACK : 該狀態(tài)是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后,最后等待對方的ACK報(bào)文。 當(dāng)收到ACK報(bào)文后,即可以進(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)計(jì)信息和當(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)建每個(gè)連接或偵聽端口時(shí)涉及的可執(zhí)行程序。在某些情況下,已知可執(zhí)
行程序承載多個(gè)獨(dú)立的組件,這些情況下,顯示創(chuàng)建連接或偵聽端口時(shí)涉及的組
件序列。在此情況下,可執(zhí)行程序的名稱位于底部 [] 中,它調(diào)用的組件位于頂
部,直至達(dá)到 TCP/IP。注意,此選項(xiàng)可能很耗時(shí),并且在你沒有足夠權(quán)限時(shí)可
能失敗。
-e 顯示以太網(wǎng)統(tǒng)計(jì)信息。此選項(xiàng)可以與 -s 選項(xiàng)結(jié)合使用。
-f 顯示外部地址的完全限定域名(FQDN)。
-n 以數(shù)字形式顯示地址和端口號(hào)。
-o 顯示擁有的與每個(gè)連接關(guān)聯(lián)的進(jìn)程 ID。
-p proto 顯示 proto 指定的協(xié)議的連接;proto可以是下列任何一個(gè): TCP、UDP、TCPv6
或 UDPv6。如果與 -s 選項(xiàng)一起用來顯示每個(gè)協(xié)議的統(tǒng)計(jì)信息,proto 可以是下
列任何一個(gè): IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
-q 顯示所有連接、偵聽端口和綁定的非偵聽 TCP 端口。綁定的非偵聽端口不一定與
活動(dòng)連接相關(guān)聯(lián)。
-r 顯示路由表。
-s 顯示每個(gè)協(xié)議的統(tǒng)計(jì)信息。默認(rèn)情況下,
顯示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的統(tǒng)計(jì)信息;
-p 選項(xiàng)可用于指定默認(rèn)的子網(wǎng)。
-t 顯示當(dāng)前連接卸載狀態(tài)。
-x 顯示 NetworkDirect 連接、偵聽器和共享終結(jié)點(diǎn)。
-y 顯示所有連接的 TCP 連接模板。無法與其他選項(xiàng)結(jié)合使用。
interval 重新顯示選定的統(tǒng)計(jì)信息,各個(gè)顯示間暫停的間隔秒數(shù)。按 CTRL+C 停止重新顯示
統(tǒng)計(jì)信息。如果省略,則 netstat 將打印當(dāng)前的配置信息一次。
find命令:
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 顯示所有未包含指定字符串的行。
/C 僅顯示包含字符串的行數(shù)。
/N 顯示行號(hào)。
/I 搜索字符串時(shí)忽略大小寫。
/OFF[LINE] 不要跳過具有脫機(jī)屬性集的文件。
"string" 指定要搜索的文本字符串。
[drive:][path]filename 指定要搜索的文件。
如果沒有指定路徑,F(xiàn)IND 將搜索在提示符處鍵入文本或者由另一命令產(chǎn)生的文本。
2.2 TCP狀態(tài)分析流程
使用網(wǎng)絡(luò)調(diào)試助手開啟一個(gè)服務(wù)器,監(jiān)聽“127.0.0.1”和端口“6666”
此時(shí)使用nc命令 netstat -an -p tcp | find “6666” 可見端口“6666”的狀態(tài)為:
LISTENING
重開一個(gè)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”,此時(shí)的狀態(tài)為:TIME_WAIT
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
9786瀏覽量
87908 -
TCP
+關(guān)注
關(guān)注
8文章
1402瀏覽量
81000 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
493瀏覽量
28230 -
客戶端
+關(guān)注
關(guān)注
1文章
301瀏覽量
17089
發(fā)布評論請先 登錄
FPGA工程師:如何在FPGA中實(shí)現(xiàn)狀態(tài)機(jī)?

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

高效安全的狀態(tài)機(jī)設(shè)計(jì)
狀態(tài)機(jī)設(shè)計(jì)的例子
狀態(tài)機(jī)設(shè)計(jì)問題
一個(gè)簡單的狀態(tài)機(jī)設(shè)計(jì)
如何寫好狀態(tài)機(jī)
狀態(tài)機(jī)設(shè)計(jì)
高速環(huán)境下FPGA或CPLD中的狀態(tài)機(jī)設(shè)計(jì)
如何使用STATECAD進(jìn)行多狀態(tài)機(jī)設(shè)計(jì)實(shí)例分析

VHDL有限狀態(tài)機(jī)設(shè)計(jì)-ST
狀態(tài)機(jī)要實(shí)現(xiàn)哪些內(nèi)容

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

評論