本博文爲老男孩linu培訓機構早期的培訓教案,特分享以供大家學習參考。
全部系列分爲五篇文章,本博文爲第一篇:
目錄:
一、生產服務器netstat tcp連接狀態................................................................................ 2
1.1生產服務器某個業務LVS負載均衡上連接狀態數量............................................... 2
1.2生產服務器某個業務web上連接狀態數量............................................................ 3
1.3 生產服務器某個業務db上連接狀態數量.............................................................. 3
二、tcp連接狀態的描述說明(netstat輸出)........................................................................ 4
2.1 執行netstat -n查看輸出結果共6列..................................................................... 4
2.2 通過man netstat查看netstat輸出結果信息......................................................... 4
2.3netstat第六列State的狀態信息......................................................................... 5
2.4netstat第六列State狀態信息轉換圖表.............................................................. 6
2.4.1 狀態參考圖一................................................................................................... 7
2.4.2 狀態參考圖二................................................................................................... 9
2.4.3 狀態參考圖三................................................................................................. 10
2.4.4 客戶端的狀態變化描述............................................................................ 10
2.4.5 服務器的狀態變化描述............................................................................ 10
2.4.6 其他的狀態變化描述總結......................................................................... 11
更多目錄見博文結尾。
一、生產服務器netstat tcp連接狀態
1.1生產服務器某個業務LVS負載均衡上連接狀態數量
[oldboy@LVS-1-1 ~]$ netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 9137
CLOSE_WAIT 207
FIN_WAIT1 547
ESTABLISHED 597
FIN_WAIT2 74
SYN_RECV 70
CLOSING 55
LAST_ACK 8
[root@lvs_nginx~]#netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 422
CLOSE_WAIT 590
FIN_WAIT1 56
FIN_WAIT2 28
ESTABLISHED 1731
1.2生產服務器某個業務web上連接狀態數量
[root@web1 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 418
FIN_WAIT1 7
FIN_WAIT2 3
ESTABLISHED 1097
LAST_ACK 2
[root@web2 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 250
FIN_WAIT1 2
FIN_WAIT2 3
ESTABLISHED 1032
LAST_ACK 2
[root@old_web ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 342
CLOSE_WAIT 618
FIN_WAIT1 37
FIN_WAIT2 3
ESTABLISHED 1681
SYN_RECV 1
[root@K32_50718 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 4146
FIN_WAIT1 352
FIN_WAIT2 1112
ESTABLISHED 8451
SYN_RECV 186
CLOSING 9
LAST_ACK 102
1.3 生產服務器某個業務db上連接狀態數量
[root@web_slave ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 263
FIN_WAIT1 1
FIN_WAIT2 48
ESTABLISHED 918
二、tcp連接狀態的描述說明(netstat輸出)
2.1 執行netstat -n查看輸出結果共6列
[root@OLDBOY ~]# netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local AddressForeign AddressState
tcp00 10.0.0.183:5058410.0.0.181:22ESTABLISHED
2.2 通過man netstat查看netstat輸出結果信息
[root@oldboy ~]# man netstat
OUTPUT
Active Internet connections (TCP, UDP, raw)
Proto
The protocol (tcp, udp, raw) used by the socket.
第一列爲socket使用的協議。
Recv-Q
The count of bytes not copied by the user program connected to this socket.
第二列爲接到的但是還沒處理的字節數。
Send-Q
The count of bytes not acknowledged by the remote host.
第三列爲已經發送的但是沒有被遠程主機確認收到的字節數。
Local Address
Address and port number of the local end of the socket.Unless the --numeric(-n)
optionisspecified,thesocketaddress is resolved to its canonical host name
(FQDN), and the port number is translated into the corresponding service name.
第四列爲 本地的地址及端口。
Foreign Address
Address and port number of the remote endofthesocket.Analogousto"Local Address."
第五列爲外部的地址及端口。
State
Thestateofthesocket.Sincethere are no states in raw mode and usually no
states used in UDP, this column may be left blank. Normally this can be one of sev-
eral values:
第六列爲socket的狀態,通常僅僅有tcp的狀態,狀態值可能有ESTABLISHED,SYN_SENT,SYN_RECV FIN_WAIT1,FIN_WAIT2,TIME_WAIT等,詳見下文。其中,最重要的是第六列。
2.3 netstat第六列State的狀態信息
如果我們執行man netstat可以找到如下的幫助信息
State
Thestateofthesocket.Sincethere are no states in raw mode and usually no
states used in UDP, this column may be left blank. Normally this can be one of sev-
eral values:
第六列爲socket的狀態,通常僅僅有tcp的狀態,狀態值可能有ESTABLISHED,SYN_SENT,SYN_RECV FIN_WAIT1,FIN_WAIT2,TIME_WAIT等,詳見下文。其中,最重要的是第六列。
ESTABLISHED
The socket has an established connection.
socket已經建立連接,表示處於連接的狀態,一般認爲有一個ESTABLISHED認爲是一個服務的併發連接。這個連接狀態在生產場景很重要,要重點關注。
SYN_SENT
The socket is actively attempting to establish a connection.
socket正在積極嘗試建立一個連接,即處於發送後連接前的一個等待但未匹配進入連接的狀態。
SYN_RECV
A connection request has been received from the network.
已經從網絡上收到一個連接請求。
FIN_WAIT1
The socket is closed, and the connection is shutting down.
socket已關閉,連接正在或正要關閉。
FIN_WAIT2
Connectionisclosed,andthesocket is waiting for a shutdown from the remote end.
連接已關閉,並且socket正在等待遠端結束。
TIME_WAIT
The socket is waiting after close to handle packets still in the network.
socket正在等待關閉處理仍在網絡上的數據包,這個連接狀態在生產場景很重要,要重點關注。
CLOSED The socket is not being used.| socket不在被佔用了。
CLOSE_WAIT
The remote end has shutdown, waiting for the socket to close.
遠端已經結束,等待socket關閉。
LAST_ACK
The remote end has shut down, and the socket is closed. Waiting for acknowl-edgement.|
遠端已經結束,並且socket也已關閉,等待acknowl-edgement。
LISTEN Thesocketislisteningforincoming connections.Such sockets are not
included in the output unless you specify the --listening (-l) or --all (-a)
option.
socket正在監聽連接請求。
CLOSING
Both sockets are shut down but we still don’t have all our data sent.
sockets關閉,但是我們仍舊沒有發送數據。
UNKNOWN
The state of the socket is unknown
未知的狀態。
2.4 netstat第六列State狀態信息轉換圖表
TCP的狀態圖,這是一個看起來比較複雜的狀態遷移圖,因爲它包含了兩個部分---服務器的狀態遷移和客戶端的狀態遷移,如果從某一個角度出發來看這個圖,就會清晰許多,這裏面的服務器和客戶端都不是絕對的,發送數據的就是客戶端,接受數據的就是服務器。
2.4.1 狀態參考圖一
見後續博文
2.4.2 狀態參考圖二
見後續博文
2.4.3 狀態參考圖三
見後續博文
2.4.4 客戶端的狀態變化描述
通過狀態參考圖三,客戶端的狀態可以用如下的流程來表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程序正常的情況下應該有的流程,在建立連接時,當客戶端收到SYN報文的ACK以後,客戶端就打開了數據交互地連接。而結束連接則通常是客戶端主動結束的,客戶端結束應用程序以後,需要經歷FIN_WAIT_1,FIN_WAIT_2等狀態,這些狀態的遷移就是前面提到的結束連接的四次握手。
2.4.5 服務器的狀態變化描述
通過狀態參考圖三,服務器的狀態可以用如下的流程來表示:
CLOSED->LISTEN->SYN_RECVD->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立連接的時候,服務器端是在第三次握手之後才進入數據交互狀態,而關閉連接則是在關閉連接的第二次握手以後(注意不是第四次)。而關閉以後還要等待客戶端給出最後的ACK包才能進入初始的狀態。
2.4.6 其他的狀態變化描述總結
針對服務器和客戶端兩方面的總結如下
1)LISTEN->SYN_SENT,對於這個解釋就很簡單了,服務器有時候也要打開連接的嘛。
2)SYN_SENT->SYN_RECVD,服務器和客戶端在SYN_SENT狀態下如果收到SYN數據報,則都會發送SYN的ACK數據報並把自身狀態調整到SYN_RECVD,準備進入ESTABLISHED
3)SYN_SENT->CLOSED,在發送超時的情況下,會返回到CLOSED狀態。
4)SYN_RECVD->LISTEN,如果受到RST包,會返回到LISTEN狀態。
5)SYN_RECVD->FIN_WAIT_1,這個遷移是說,可以不用到ESTABLISHED狀態,而可以直接跳轉到FIN_WAIT_1狀態並等待關閉。