从下面这个图来看,netstat和ss都是网络相关的监控,netstat在协议栈中每一层都可以做监控统计:TCP、路由表、网络接口、协议等,但是在Linux中,netstat已经不为推荐,取而代之的是ss。

 

1)netstat参数和使用

常用参数-anplt

-a 显示所有活动的连接以及本机侦听的TCP、UDP端口

-l 显示监听的server port

-n 直接使用IP地址,不通过域名服务器

-p 正在使用Socket的程序PID和程序名称

-r 显示路由表

-t 显示TCP传输协议的连线状况

-u 显示UDP传输协议的连线状况

-w 显示RAW传输协议的连线状况

在Linux下,raw格式的数据通常可以通过/proc/net/dev获得。在Windows平台,netstat信息可以通过IP Helper API的GetTcpTable和GetUdpTable函数获得。

2)ss(socket statistics)参数和使用

常用参数和netstat类似,如-anp

-a显示所有的sockets

-l显示正在监听的

-n显示数字IP和端口,不通过域名服务器

-p显示使用socket的对应的程序

-t只显示TCP sockets

-u只显示UDP sockets

-4 -6 只显示v4或v6V版本的sockets

-s打印出统计信息。这个选项不解析从各种源获得的socket。对于解析/proc/net/top大量的sockets计数时很有效

-0 显示PACKET sockets

-w 只显示RAW sockets

-x只显示UNIX域sockets

-r尝试进行域名解析,地址/端口

 

统计信息:

 

ss还可以使用IP地址筛选如ss src xxxxIP:port,以及使用端口筛选ss dport OP PORT,OP支持的运算符有le ge eq ne lt gt。

3)原理对比

ss比netstat快的主要原因是,netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多。

当服务器的socket连接数量非常大时(如上万个),无论是使用netstat命令还是直接cat /proc/net/tcp执行速度都会很慢,相比之下ss可以节省很多时间。ss快的秘诀在于,它利用了TCP协议栈中tcp_diag,这是一个用于分析统计的模块,可以获得Linux内核中的第一手信息。如果系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍微慢但仍然比netstat要快。

根据博客http://www.cnblogs.com/wangkangluo1/archive/2012/05/15/2500844.html的测试

同样的大量socket连接情况下,netstat和ss获取同样的统计数据时的耗时,ss明显比netstat少很多。我们也可以简单测试一下在少数socket情况下(基本无差别):

time netstat -atn以及time ss -atn对比

 

netstat属于net-tools工具集,ss属于ipoute工具集。替换方案如下: