一直用 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状态?