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