LINUX netstat連線狀態解析及TCP狀態轉換
LINUX netstat連線狀態解析及TCP狀態轉換
水平有限如果有誤請指出。
我們經常在netstat -anlp 中能夠看到埠連線狀態一項
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 那麼這些真正的含義是什麼?
下面是一個TCP狀態轉換圖(非常重要的一張圖):
圖中實線為主動方,虛線為被動方,比如SERVER-CLIENT端,CLIENT端請求斷開連線那麼他就是主動方
下面是各種狀態的說明(擷取自刑文鵬LINUX系統程式設計講義)
CLOSED: 這個沒什麼好說的了,表示初始狀態。
LISTEN: 這個也是非常容易理解的一個狀態,表示伺服器端的某個SOCKET處於監聽狀態,可以接受連線了。
SYN_RCVD: 這個狀態表示接受到了SYN報文,在正常情況下,這個狀態是伺服器端的SOCKET在建立TCP連線時的三次
握手會話過程中的一箇中間狀態,很短暫,基本 上用netstat你是很難看到這種狀態的,除非你特意寫了一個客戶
端測試程式,故意將三次TCP握手過程中最後一個ACK報文不予傳送。因此這種狀態 時,當收到客戶端的ACK報文
後,它會進入到ESTABLISHED狀態。
SYN_SENT: 這個狀態與SYN_RCVD遙想呼應,當客戶端SOCKET執行CONNECT連線時,它首先傳送SYN報文,因此也隨即
它會進入到了SYN_SENT狀 態,並等待服務端的傳送三次握手中的第2個報文。SYN_SENT狀態表示客戶端已傳送SYN
報文。
ESTABLISHED:這個容易理解了,表示連線已經建立了。
FIN_WAIT_1: 這個狀態要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態的真正含義都是表示等待對方的FIN報
文。而這兩種狀態的區別 是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連線,向
對方傳送了FIN報文,此時該SOCKET即 進入到FIN_WAIT_1狀態。而當對方回應ACK報文後,則進入到FIN_WAIT_2狀
態,當然在實際的正常情況下,無論對方何種情況下,都應該馬 上回應ACK報文,所以FIN_WAIT_1狀態一般是比較
難見到的,而FIN_WAIT_2狀態還有時常常可以用netstat看到。
FIN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連線,也即有一方要求
close連線,但另外還告訴對方,我暫時還有點資料需要傳送給你,稍後再關閉連線。
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連線。
我寫了一個socket 簡單的server和client 小程式什麼也不做,只是為了測試連線狀態,繫結埠10050,測試都是在一臺機器190.81上做的
繫結網路卡為本機全部網路卡 INADDR_ANY 巨集
我們現在來分析一下
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、服務端ctrl+c SIGNT訊號預設處置方式
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 -
服務端ctrl+c SIGNT訊號預設處置方式
主動方 server端
被動方 client端
很明顯這個時候處於主動方傳送了FIN報文給被動方請求關閉連線,
被動方受到FIN報文返回一個ACK報文給被動方,同時被動方給主動方傳送一個FIN報文請求關閉連線,但是主動方
由於SIGINT已經進城終止,已經不能接收到這個FIN報文,所以這個時候主動方SERVER連線處於FIN_WAIT2狀態
已經不能相應被動方過來的FIN報文,同時被動方CLIENT端由於服務端不能接受FIN報文處於CLOSE_WAIT狀態。
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訊號預設處置方式
被動方 server端
主動方 client端
這個情況和上面相反,不在描述。
下面是連線3次握手和斷開連線4次握手截圖:
作者微信:
水平有限如果有誤請指出。
我們經常在netstat -anlp 中能夠看到埠連線狀態一項
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 那麼這些真正的含義是什麼?
下面是一個TCP狀態轉換圖(非常重要的一張圖):
圖中實線為主動方,虛線為被動方,比如SERVER-CLIENT端,CLIENT端請求斷開連線那麼他就是主動方
下面是各種狀態的說明(擷取自刑文鵬LINUX系統程式設計講義)
CLOSED: 這個沒什麼好說的了,表示初始狀態。
LISTEN: 這個也是非常容易理解的一個狀態,表示伺服器端的某個SOCKET處於監聽狀態,可以接受連線了。
SYN_RCVD: 這個狀態表示接受到了SYN報文,在正常情況下,這個狀態是伺服器端的SOCKET在建立TCP連線時的三次
握手會話過程中的一箇中間狀態,很短暫,基本 上用netstat你是很難看到這種狀態的,除非你特意寫了一個客戶
端測試程式,故意將三次TCP握手過程中最後一個ACK報文不予傳送。因此這種狀態 時,當收到客戶端的ACK報文
後,它會進入到ESTABLISHED狀態。
SYN_SENT: 這個狀態與SYN_RCVD遙想呼應,當客戶端SOCKET執行CONNECT連線時,它首先傳送SYN報文,因此也隨即
它會進入到了SYN_SENT狀 態,並等待服務端的傳送三次握手中的第2個報文。SYN_SENT狀態表示客戶端已傳送SYN
報文。
ESTABLISHED:這個容易理解了,表示連線已經建立了。
FIN_WAIT_1: 這個狀態要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態的真正含義都是表示等待對方的FIN報
文。而這兩種狀態的區別 是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連線,向
對方傳送了FIN報文,此時該SOCKET即 進入到FIN_WAIT_1狀態。而當對方回應ACK報文後,則進入到FIN_WAIT_2狀
態,當然在實際的正常情況下,無論對方何種情況下,都應該馬 上回應ACK報文,所以FIN_WAIT_1狀態一般是比較
難見到的,而FIN_WAIT_2狀態還有時常常可以用netstat看到。
FIN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連線,也即有一方要求
close連線,但另外還告訴對方,我暫時還有點資料需要傳送給你,稍後再關閉連線。
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連線。
我寫了一個socket 簡單的server和client 小程式什麼也不做,只是為了測試連線狀態,繫結埠10050,測試都是在一臺機器190.81上做的
繫結網路卡為本機全部網路卡 INADDR_ANY 巨集
我們現在來分析一下
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、服務端ctrl+c SIGNT訊號預設處置方式
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 -
服務端ctrl+c SIGNT訊號預設處置方式
主動方 server端
被動方 client端
很明顯這個時候處於主動方傳送了FIN報文給被動方請求關閉連線,
被動方受到FIN報文返回一個ACK報文給被動方,同時被動方給主動方傳送一個FIN報文請求關閉連線,但是主動方
由於SIGINT已經進城終止,已經不能接收到這個FIN報文,所以這個時候主動方SERVER連線處於FIN_WAIT2狀態
已經不能相應被動方過來的FIN報文,同時被動方CLIENT端由於服務端不能接受FIN報文處於CLOSE_WAIT狀態。
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訊號預設處置方式
被動方 server端
主動方 client端
這個情況和上面相反,不在描述。
下面是連線3次握手和斷開連線4次握手截圖:
作者微信:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2138360/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【演算法】狀態之美,TCP/IP狀態轉換探索演算法TCP
- TCP連線狀態異常記錄TCP
- 統計TCP連線數和狀態TCP
- 雲端計算運維學習---Linux監控tcp連線數及狀態運維LinuxTCP
- Linux基礎命令---netstat顯示網路狀態Linux
- 程式的狀態與轉換
- Processing 狀態機應用研究(線性轉換)
- Java執行緒狀態轉換Java執行緒
- 淺談 Java執行緒狀態轉換及控制Java執行緒
- PostgreSQL的idle in transaction連線狀態SQL
- TCP連線的TIME_WAIT和CLOSE_WAIT 狀態解說TCPAI
- Oracle DG資料庫狀態轉換Oracle資料庫
- Java執行緒狀態及切換Java執行緒
- JAVA 執行緒狀態及轉化(轉)Java執行緒
- jProfiler遠端連線Linux監控jvm、tomcat執行狀態LinuxJVMTomcat
- React 4 種狀態型別及 N 種狀態管理React型別
- 檢視使用 MySQL Shell 的連線狀態MySql
- 執行緒的狀態轉換以及基本操作執行緒
- 玩轉Spring狀態機Spring
- KMP+狀態轉移KMP
- HTTP方法及狀態碼HTTP
- 在 TIME_WAIT 狀態的 TCP 連線,收到 SYN 後會發生什麼?AITCP
- TCP TIME_WAIT狀態最佳化TCPAI
- TCP為什麼是有狀態的?TCP
- java狀態模式例項解析Java模式
- ijkplayer 播放器狀態解析播放器
- React hooks 狀態管理方案解析ReactHook
- MTS方式連線V$SESSION中的SERVER狀態SessionServer
- win10中word怎麼切換改寫狀態_win10怎樣切換插入狀態和改寫狀態Win10
- 工作流從無狀態切換到有狀態的好處
- 前端狀態管理與有限狀態機前端
- 偏向鎖狀態轉移原理
- 原來還能這樣看Java執行緒的狀態及轉換Java執行緒
- Linux程式狀態——top,ps中看到程式狀態D,S的含義Linux
- 網路連線狀態檢視工具:Internet Status for MacMac
- Internet Status Mac網路連線狀態檢視工具Mac
- VirtualBox 本地網路連線無線狀態下連線虛擬機器虛擬機
- React 狀態管理:狀態與生命週期React
- [從0到1編寫伺服器]TCP連線建立與斷開狀態變化伺服器TCP