netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
解釋:
NF 當前處理行字段總個數
$NF (與$1對應)最後一個字段的值
awk特殊字段介紹
NR 當前處理總行數。因為awk是流處理工具,一行一行處理的,所以NR在不停的自增1,表示awk開始執行程序後所讀取的數據行數
FNR 當前處理行是當前文件第幾行,其變量值小於等於NR(比如當讀取第二個文件時,FNR是從0開始重新計數,而NR不會)。
NR==FNR:用於在讀取兩個或兩個以上的文件時,判斷是不是在讀取第一個文件。
awk處理多個文件的基本語法是:
awk -F分隔符 'BEGIN { 初始化 } { 循環執行部分 } END { 結束處理 }' file_list1 file_list2
其中BEGIN和END可以省略,-F也可以使用默認,循環執行部分,是按行對文件進行處理的。
運行這個命令的結果:
CLOSE_WAIT 1
ESTABLISHED 23
FIN_WAIT2 12
TIME_WAIT 30
網絡狀態解釋
CLOSED:表示初始狀態。對服務端和C客戶端雙方都一樣。
LISTEN:表示監聽狀態。服務端調用了listen函數,可以開始accept連接了。
SYN_SENT:表示客戶端已經發送了SYN報文。當客戶端調用connect函數發起連接時,首先發SYN給服務端,然後自己進入SYN_SENT狀態,並等待服務端發送ACK+SYN。
SYN_RCVD:表示服務端收到客戶端發送SYN報文。服務端收到這個報文後,進入SYN_RCVD狀態,然後發送ACK+SYN給客戶端。
ESTABLISHED:表示連接已經建立成功了。服務端發送完ACK+SYN後進入該狀態,客戶端收到ACK後也進入該狀態。
FIN_WAIT_1:表示主動關閉連接。無論哪方調用close函數發送FIN報文都會進入這個這個狀態。
FIN_WAIT_2:表示被動關閉方同意關閉連接。主動關閉連接方收到被動關閉方返回的ACK後,會進入該狀態。
TIME_WAIT:表示收到對方的FIN報文並發送了ACK報文,就等2MSL後即可回到CLOSED狀態了。如果FIN_WAIT_1狀態下,收到對方同時帶FIN標志和ACK標志的報文時,可以直接進入TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。
CLOSING:表示雙方同時關閉連接。如果雙方幾乎同時調用close函數,那麼會出現雙方同時發送FIN報文的情況,此時就會出現CLOSING狀態,表示雙方都在關閉連接。
CLOSE_WAIT:表示被動關閉方等待關閉。當收到對方調用close函數發送的FIN報文時,回應對方ACK報文,此時進入CLOSE_WAIT狀態。
LAST_ACK:表示被動關閉方發送FIN報文後,等待對方的ACK報文狀態,當收到ACK後進入CLOSED狀態。
特別提示的是:為什麼TIME_WAIT狀態還需要等待2MSL才能回到CLOSED狀態?或者為什麼TCP要引入TIME_WAIT狀態?
《TCP/IP詳解》中如此解釋:當TCP執行一個主動關閉,並發回最後一個ACK後,該連接必須在TIME_WAIT狀態停留的時間為2倍的MSL,這樣可以讓TCP再次發送最後的ACK以防止這個ACK丟失(另一端超時重發最後的FIN)。
附注:MSL(Maximum Segment Lifetime)即最大生存時間,RFC 793中指出MSL為2分鐘,但是實現中的常用值為30秒、1分鐘或者2分鐘