首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SS命令和Netstat命令比较

SS命令和Netstat命令比较

作者头像
洗尽了浮华
发布2018-01-23 11:14:47
2.2K0
发布2018-01-23 11:14:47
举报
文章被收录于专栏:散尽浮华散尽浮华

在早期运维工作中,查看服务器连接数一般都会用netstat命令。其实,有一个命令比netstat更高效,那就是ss(Socket Statistics)命令! ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。 ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。原因如下: 1)当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。 2)而ss快的秘诀在于它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢(但仍然比 netstat要快)。

为了验证ss比netstat更快更高效,可以如下做几个实验看看效果: 几乎所有的Linux系统都会默认包含netstat命令,但并非所有系统都会默认包含ss命令。 netstat命令是net-tools工具集中的一员,这个工具一般linux系统会默认安装的;ss命令是iproute工具集中的一员; net-tools是一套标准的Unix网络工具,用于配置网络接口、设置路由表信息、管理ARP表、显示和统计各类网络信息等等,但是遗憾的是,这个工具自2001年起便不再更新和维护了。 iproute,这是一套可以支持IPv4/IPv6网络的用于管理TCP/UDP/IP网络的工具集

如果没有ss命令,可以如下安装: [root@wang ~]# yum install iproute iproute-doc

当服务器维持30000个socket连接时,使用netstat和ss命令统计连接数的耗时情况如下: [root@wang ~]# netstat -at | wc -l     //耗时15.60秒 [root@wang ~]# ss -atr | wc -l          //耗时5.40秒(未利用tcp_diag) [root@wang ~]# ss -atr | wc -l         //耗时0.47秒(利用tcp_diag)

ss -a 查看机器的socket连接数 ss -l 查看机器的端口情况 ss -s 查看机器的网络连接数

1)查看当前服务器的网络连接统计。 在服务器产生大量sockets连接时,一般常会使用这个命令做宏观统计。 [root@wang ~]# ss -s

Total: 318 (kernel 419)
TCP:   62 (estab 16, closed 18, orphaned 0, synrecv 0, timewait 17/0), ports 198

Transport Total     IP        IPv6
*	  419       -         -        
RAW	  0         0         0        
UDP	  18        18        0        
TCP	  44        44        0        
INET	  62        62        0        
FRAG	  0         0         0  

2)查看所有打开的网络端口 如果使用-pl参数的话,则会列出具体的程序名称 [root@wang ~]# ss -l State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:rquotad *:* LISTEN 0 128 *:46700 *:* LISTEN 0 100 *:sun-as-jmxrmi *:* LISTEN 0 128 *:40591 *:* LISTEN 0 128 *:sunrpc *:* LISTEN 0 128 *:webcache *:* ........ 3)想查看这台服务器上所有的socket连接 如果只想查看TCP sockets,那么使用-ta选项; 如果只想查看UDP sockets,那么使用-ua选项; 如果只想查看RAW sockets,那么使用-wa选项; 如果只想查看UNIX sockets,那么使用-xa选项。 [root@wang ~]# ss -a ...... ESTAB 0 0 101.201.114.106:54957 111.205.224.15:https TIME-WAIT 0 0 10.25.91.53:58645 10.44.183.73:11212 TIME-WAIT 0 0 10.25.91.53:35920 10.171.60.171:11212 TIME-WAIT 0 0 10.25.91.53:http 100.109.192.96:17837 ESTAB 0 0 101.201.114.106:57479 139.196.38.174:56516 TIME-WAIT 0 0 127.0.0.1:cslistener 127.0.0.1:42728

--------------------------netstat中的各种状态------------------------------

CLOSED         初始(无连接)状态。
LISTEN         侦听状态,等待远程机器的连接请求。
SYN_SEND       在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV       在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED    完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1     在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2     在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT      在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING        在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT     在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK       在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。

主动连接端可能的状态有:    CLOSED        SYN_SEND        ESTABLISHED
主动关闭端可能的状态有:    FIN_WAIT_1    FIN_WAIT_2      TIME_WAIT
被动连接端可能的状态有:    LISTEN        SYN_RECV        ESTABLISHED
被动关闭端可能的状态有:    CLOSE_WAIT    LAST_ACK        CLOSED

在Linux下,如果连接数比较大,可以使用效率更高的ss来替代netstat。
查看tomcat的并发数:netstat -an|grep 10050|awk '{count[$6]++} END{for (i in count) print(i,count[i])}'
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-12-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档