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
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
8958瀏覽量
85085 -
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
發(fā)布評論請先 登錄
相關(guān)推薦
評論