概述
[root@localhost ~]# rpm -qa|grep iprouteiproute-2.6.32-31.el6.x86_64
当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。
天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。(但仍然比 netstat要快。)ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。
但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。当我们打开的socket数量很多时,netstat就会变得慢了。netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多
当服务器维持3万个socket连接,Admin需要计算具体的连接数量时,不同情况的耗时如下:
netstat -at | wc 耗时 15.60 秒ss -atr | wc 耗时 5.40 秒(未利用tcp_diag)ss -atr | wc 耗时 0.47 秒(利用tcp_diag)对比统计服务器并发连接数
time netstat -ant | grep EST | wc -ltime ss -o state established | wc -lnet-tools是一套标准的Unix网络工具,用于配置网络接口、设置路由表信息、管理ARP表、显示和统计各类网络信息等等,但是遗憾的是,这个工具自2001年起便不再更新和维护了。
netstat命令是net-tools工具集中的一员:iproute,这是一套可以支持IPv4/IPv6网络的用于管理TCP/UDP/IP网络的工具集,这套工具由Stephen Hemminger负责维护和升级,目前的大版本号是2。ss命令是iproute工具集中的一员:从某种意义上说,iproute工具集几乎可以替代掉net-tools工具集,具体的替代方案是这样的:
用途 net-tool(被淘汰) iproute2
接口 ifconfig ip addr, ip link路由表 route ip route邻居 arp ip neighVLAN vconfig ip link隧道 iptunnel ip tunnel组播 ipmaddr ip maddr统计 netstat ss解释
ss的选项既不多也不复杂,除去非功能性选项(-h/-v)外,ss共有22个选项。
每一个选项都是既支持短选项(如-s),也支持长选项(如–summary)。我们不会在这里一一介绍,因为这样既枯燥又乏味,而且不出三分钟,你就会昏昏欲睡了。所以,我们会从实际需求和实际问题出发,这样效果会好些。样例
ss列出本地哪个进程连接到x server
# ss -x src '/tmp/.X11-unix/*' -p$ ss -s
本地打开的端口:
$ ss -l$ ss -ln$ ss -lpTCP,UDP,RAW,UNIX sockets:
$ ss -t -a$ ss -u -a$ ss -w -a$ ss -x -ass dst 1.85.49.230 -n
ss src 192.168.2.10:10001 -n$ ss -lp src :80 想看当前机器的80端口被谁占用了:
$ lsof -i :80 也可以看到是谁占用了80$ ss sport = :http$ ss dport \> :1024$ ss sport \< :32000$ ss sport eq :22$ ss dport != :22$ ss state connected sport = :http$ ss \( sport = :http or sport = :https \)$ ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24多个子表达式之间可以组合,跟tcpdump一样,可以用or and not来组合。但括号要用转义符号表示。遇到 "(" 等符号需要转义,要么使用 "\" 要么使用 "'"。我们可以根据socket的状态来进行过滤,也可通过端口与ip地址进行过滤。也就是我们在命令格式里面看到的STATE-FILTER与ADDRESS-FILTER。
$ ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]首先看看STATE-FILTER,STATE-FILTER可用的过滤条件有:
LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)ESTABLISHED:代表一个打开的连接FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认FIN-WAIT-2:从远程TCP等待连接中断请求CLOSE-WAIT:等待从本地用户发来的连接中断请求CLOSING:等待远程TCP对连接中断的确认LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认CLOSED:没有任何连接状态state 后面可以接下面这些参数:
establishedsyn-sentsyn-recvfin-wait-1fin-wait-2time-waitclosedclose-waitlast-acklistenclosingall : All of the above statesconnected : All the states except for listen and closedsynchronized : All the connected states except for syn-sentbucket : Show states, which are maintained as minisockets, i.e. time-wait and syn-recv.big : Opposite to bucket state.再看看ADDRESS-FILTER,ADDRESS-FILTER用于过滤端口与地址。而且可以进行表达式组合。可用的子表达式有:
1. dst ADDRESS_PATTERN2. src ADDRESS_PATTERN3. dport RELOP PORT4. sport RELOP PORT5. autobound其中ADDRESS_PATTERN为ip地址与端口匹配,ip:port,可以用*代替。RELOP为<= >=或==。