一直用 ifconfig 命令查看 CentOS 中的網路連接,包括 IP 位址、MAC 位址、網路連接狀態等。升級到 CentOS 7 之後 ifconfig 就找不到了,原來這個指令已經被廢棄,改用 ip 指令。同樣的事情也發生在 RHEL 7、Oracle Linux 7、Scientific Linux 7 的 minimal 版本中。
在 CentOS 7 minimal 系統中,可以用 “ip addr”、“ip link”查看網路連接及其狀態,使用“ip –s link”還可以查看統計資訊。
如果還是想使用 ifconfig 的話就需要自己安裝了。先得知道 ifconfig 指令是哪個軟體包提供的,
yum provides ifconfig
或者,
yum whatprovides ifconfig
可以查詢到對應的軟體包為 net-tools,安裝它,
yum install net-tools
安裝好了就可以用 ifconfig –a 查看網路狀態了。
當然這樣的方法也適用於查詢其它想用但是又找不到對應指令的安裝軟體包的情況。
將 Linode VPS 也部署成 CentOS 7 了,才發現 Linode 上的 CentOS 7 已經定製過,包含了常用的但是在 7 版中已經廢棄的指令,如 ifconfig、netstat、iptables 等。
如果是centos 7以下版本可以使用netstat
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狀態?