本篇文章給大家分享的是有關(guān)如何解析LINUX netstat連接狀態(tài)及進(jìn)行TCP狀態(tài)轉(zhuǎn)換,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋紙箱等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身制作品質(zhì)網(wǎng)站。LINUX netstat連接狀態(tài)解析及TCP狀態(tài)轉(zhuǎn)換
水平有限如果有誤請(qǐng)指出。
我們經(jīng)常在netstat -anlp 中能夠看到端口連接狀態(tài)一項(xiàng)
gaopeng@bogon:~$ netstat -anlp|grep 10050
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 2502/server
tcp 0 0 192.168.190.81:48008 192.168.190.81:10050 ESTABLISHED 2510/client
tcp 0 0 192.168.190.81:10050 192.168.190.81:48008 ESTABLISHED 2502/server
又比如
gaopeng@bogon:~$ netstat -anlp|grep 10050
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 1 0 192.168.190.81:48008 192.168.190.81:10050 CLOSE_WAIT 2510/client
tcp 0 0 192.168.190.81:10050 192.168.190.81:48008 FIN_WAIT2 -
比如這里的LISTEN,ESTABLISHED,CLOSE_WAIT,FIN_WAIT2 那么這些真正的含義是什么?
下面是一個(gè)TCP狀態(tài)轉(zhuǎn)換圖(非常重要的一張圖):
圖中實(shí)線為主動(dòng)方,虛線為被動(dòng)方,比如SERVER-CLIENT端,CLIENT端請(qǐng)求斷開連接那么他就是主動(dòng)方
下面是各種狀態(tài)的說明(截取自刑文鵬LINUX系統(tǒng)編程講義)
CLOSED: 這個(gè)沒什么好說的了,表示初始狀態(tài)。
LISTEN: 這個(gè)也是非常容易理解的一個(gè)狀態(tài),表示服務(wù)器端的某個(gè)SOCKET處于監(jiān)聽狀態(tài),可以接受連接了。
SYN_RCVD: 這個(gè)狀態(tài)表示接受到了SYN報(bào)文,在正常情況下,這個(gè)狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時(shí)的三次
握手會(huì)話過程中的一個(gè)中間狀態(tài),很短暫,基本 上用netstat你是很難看到這種狀態(tài)的,除非你特意寫了一個(gè)客戶
端測(cè)試程序,故意將三次TCP握手過程中最后一個(gè)ACK報(bào)文不予發(fā)送。因此這種狀態(tài) 時(shí),當(dāng)收到客戶端的ACK報(bào)文
后,它會(huì)進(jìn)入到ESTABLISHED狀態(tài)。
SYN_SENT: 這個(gè)狀態(tài)與SYN_RCVD遙想呼應(yīng),當(dāng)客戶端SOCKET執(zhí)行CONNECT連接時(shí),它首先發(fā)送SYN報(bào)文,因此也隨即
它會(huì)進(jìn)入到了SYN_SENT狀 態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個(gè)報(bào)文。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN
報(bào)文。
ESTABLISHED:這個(gè)容易理解了,表示連接已經(jīng)建立了。
FIN_WAIT_1: 這個(gè)狀態(tài)要好好解釋一下,其實(shí)FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對(duì)方的FIN報(bào)
文。而這兩種狀態(tài)的區(qū)別 是:FIN_WAIT_1狀態(tài)實(shí)際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí),它想主動(dòng)關(guān)閉連接,向
對(duì)方發(fā)送了FIN報(bào)文,此時(shí)該SOCKET即 進(jìn)入到FIN_WAIT_1狀態(tài)。而當(dāng)對(duì)方回應(yīng)ACK報(bào)文后,則進(jìn)入到FIN_WAIT_2狀
態(tài),當(dāng)然在實(shí)際的正常情況下,無論對(duì)方何種情況下,都應(yīng)該馬 上回應(yīng)ACK報(bào)文,所以FIN_WAIT_1狀態(tài)一般是比較
難見到的,而FIN_WAIT_2狀態(tài)還有時(shí)常??梢杂胣etstat看到。
FIN_WAIT_2:上面已經(jīng)詳細(xì)解釋了這種狀態(tài),實(shí)際上FIN_WAIT_2狀態(tài)下的SOCKET,表示半連接,也即有一方要求
close連接,但另外還告訴對(duì)方,我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你,稍后再關(guān)閉連接。
TIME_WAIT: 表示收到了對(duì)方的FIN報(bào)文,并發(fā)送出了ACK報(bào)文,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果
FIN_WAIT_1狀態(tài)下,收到了對(duì)方同時(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)比較特殊,實(shí)際情況中應(yīng)該是很少見,屬于一種比較罕見的例外狀態(tài)。正常情況下,當(dāng)你發(fā)送
FIN報(bào)文后,按理來說是應(yīng)該先收到(或同時(shí)收到)對(duì)方的 ACK報(bào)文,再收到對(duì)方的FIN報(bào)文。但是CLOSING狀態(tài)表
示你發(fā)送FIN報(bào)文后,并沒有收到對(duì)方的ACK報(bào)文,反而卻也收到了對(duì)方的FIN報(bào)文。什 么情況下會(huì)出現(xiàn)此種情況
呢?其實(shí)細(xì)想一下,也不難得出結(jié)論:那就是如果雙方幾乎在同時(shí)close一個(gè)SOCKET的話,那么就出現(xiàn)了雙方同時(shí)
發(fā)送FIN報(bào) 文的情況,也即會(huì)出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接。
我寫了一個(gè)socket 簡(jiǎn)單的server和client 小程序什么也不做,只是為了測(cè)試連接狀態(tài),綁定端口10050,測(cè)試都是在一臺(tái)機(jī)器190.81上做的
綁定網(wǎng)卡為本機(jī)全部網(wǎng)卡 INADDR_ANY 宏
我們現(xiàn)在來分析一下
1、正常連接情況
gaopeng@bogon:~$ netstat -anlp|grep 10050
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 2502/server
tcp 0 0 192.168.190.81:48008 192.168.190.81:10050 ESTABLISHED 2510/client
tcp 0 0 192.168.190.81:10050 192.168.190.81:48008 ESTABLISHED 2502/server
2、服務(wù)端ctrl+c SIGNT信號(hào)默認(rèn)處置方式
gaopeng@bogon:~$ netstat -anlp|grep 10050
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 1 0 192.168.190.81:48008 192.168.190.81:10050 CLOSE_WAIT 2510/client
tcp 0 0 192.168.190.81:10050 192.168.190.81:48008 FIN_WAIT2 -
服務(wù)端ctrl+c SIGNT信號(hào)默認(rèn)處置方式
主動(dòng)方 server端
被動(dòng)方 client端
很明顯這個(gè)時(shí)候處于主動(dòng)方發(fā)送了FIN報(bào)文給被動(dòng)方請(qǐng)求關(guān)閉連接,
被動(dòng)方受到FIN報(bào)文返回一個(gè)ACK報(bào)文給被動(dòng)方,同時(shí)被動(dòng)方給主動(dòng)方發(fā)送一個(gè)FIN報(bào)文請(qǐng)求關(guān)閉連接,但是主動(dòng)方
由于SIGINT已經(jīng)進(jìn)城終止,已經(jīng)不能接收到這個(gè)FIN報(bào)文,所以這個(gè)時(shí)候主動(dòng)方SERVER連接處于FIN_WAIT2狀態(tài)
已經(jīng)不能相應(yīng)被動(dòng)方過來的FIN報(bào)文,同時(shí)被動(dòng)方CLIENT端由于服務(wù)端不能接受FIN報(bào)文處于CLOSE_WAIT狀態(tài)。
3、
gaopeng@bogon:~$ netstat -anlp|grep 10050
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 2568/server
tcp 1 0 192.168.190.81:10050 192.168.190.81:48010 CLOSE_WAIT 2568/server
tcp 0 0 192.168.190.81:48010 192.168.190.81:10050 FIN_WAIT2 -
客戶端ctrl+c SIGNT信號(hào)默認(rèn)處置方式
被動(dòng)方 server端
主動(dòng)方 client端
這個(gè)情況和上面相反,不在描述。
下面是連接3次握手和斷開連接4次握手截圖:
以上就是如何解析LINUX netstat連接狀態(tài)及進(jìn)行TCP狀態(tài)轉(zhuǎn)換,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。