ss是Socket Statistics的缩写。ss命令用来显示处于活动状态的套接字信息。它可以显示和netstat类似的内容。可以显示类似的内容是不是可以看做代替netstat呢?
在Linux CentOS7 中ss命令是iproute软件包的一部分,默认已经安装。
为什么使用ss
netstat从proc文件系统获取所需要的信息。当服务器的socket连接数量变得非常大时,执行速度都会很慢。当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。
天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。
当然这些都不是我们关注的重点,下面我讲解如何使用ss命令查看各种信息。具体使用语法如下:
语法:
ss(选项)
选项:
-h:显示帮助信息;
-V:显示指令版本信息;
-n:不解析服务名称,以数字方式显示;
-a:显示所有的套接字;
-l:显示处于监听状态的套接字;
-o:显示计时器信息;
-m:显示套接字的内存使用情况;
-p:显示使用套接字的进程信息;
-i:显示内部的TCP信息;
-4:只显示ipv4的套接字;
-6:只显示ipv6的套接字;
-t:只显示tcp套接字;
-u:只显示udp套接字;
-d:只显示DCCP套接字;
-w:仅显示RAW套接字;
-x:仅显示UNIX域套接字。
列出已建立的连接
默认情况下,如果我们运行ss命令而没有指定其他选项,它将显示所有已建立连接的打开的非侦听套接字的列表,例如TCP,UDP或UNIX套接字。
查看TCP/UDP连接
使用-t(TCP)参数查看TCP连接,而使用-u(UDP)参数查看UDP socket,我们还可以使用-l选项专门列出当前正在侦听连接的套接字,而不是列出所有的套接字。
在后面的例子中,你会看到我将结合多种选择,以快速过滤掉,从而达到我们的目的。
显示进程
查看到某个连接后,怎么知道是哪个进程的连接呢?我们可以用-p选项打印出拥有套接字的进程或PID号。
ss -pl
拖动滚动条到最后可以看到,-p参数显示了这条连接的进程信息,可以看到,该进程是gnome-shell,进程id为2237,并且这条连接的文件描述符为22。
users:((“gnome-shell”,pid=2237,fd=22))
查看TCP相关定时器信息
我们知道在TCP中,有很多定时器,和netstat一样,可以使用-o参数显示定时器相关信息:
例如上面显示的keepalive定时器剩余时间:
timer:(keepalive,63min,0)
显示统计信息
我们可以使用-s选项快速查看统计数据。
这使我们能够快速看到已建立连接的总数,及各种类型的套接字的计数和IPv4或IPv6的使用情况。
基于状态的过滤器
我们可以指定一个套接字的状态,只打印这个状态下的套接字。例如,我们可以指定包括已建立:
established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, closed-wait, last-ack监听和关闭等状态。
以下示例显示了所有建立的TCP连接。
根据端口号进行过滤
可以通过过滤还可以列出小于(lt),大于(gt),等于(eq),不等于(ne),小于或等于(le),或大于或等于(ge)的所有端口。
例如,以下命令显示端口号为200或以下的所有侦听端口:
为了进行比较,可以执行相反的操作,并查看大于200的所有端口:
查看socket详细信息
如果想要查看连接更加详细信息呢?比如收到多少数据?上一个ACK是什么时候?mss是多大?拥塞窗口大小是多少?这些信息在分析理解TCP的时候非常有帮助,而查看这些信息只需要使用-i(information)参数即可:
根据IP或端口过滤socket信息
你可以使用grep命令来过滤出你需要的信息,但是ss本身提供一些参数用来过滤信息。例如,可以通过ifconfig命令查看本地ip为192.168.43.229的连接:
src后面跟本地ip:port,而也可以使用dst根据远端ip来过滤信息。
总结
本文介绍了ss命令一些实用的用法。如果你想使用ss命令快速检查有关套接字的各种信息,建议你查阅ss的相关帮助手册。
参考:Linux命令大全
公众号:程序猿编码欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:
百度网盘
网友评论