netstat的替代者-ss命令详解

栏目: 服务器 · 发布时间: 5年前

内容简介:之前在介绍netstat的时候说过,netstat是一个非常实用的socket查看命令。但是有人留言它已经被ss(Socket Statistics)替代了,那么这个所谓替代netstat的命令,到底怎么用呢?为什么它能替代netstat?值得注意的是,netstat从proc文件系统(可参考

之前在介绍netstat的时候说过,netstat是一个非常实用的socket查看命令。但是有人留言它已经被ss(Socket Statistics)替代了,那么这个所谓替代netstat的命令,到底怎么用呢?为什么它能替代netstat?

为什么使用ss

值得注意的是, 几乎所有的 linux 系统都默认支持netstat命令,而并不一定支持ss ,从这一点来说,netstat通常还是不二选择。但是不得不承认的是,ss命令更加快捷高效。

netstat从proc文件系统(可参考 linux中不可错过的信息宝库 )获取所需要的信息,而ss利用netlink机制,与内核通信,通过TCP 协议栈中 tcp_diag 模块获取第一手的内核信息。当然这些都不是我们关注的重点,我们来看看ss命令到底如何使用。

查看TCP/UDP连接

使用-t(TCP)参数查看TCP连接,而使用-u(UDP)参数查看UDP socket:

$ ss -t
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
ESTAB       0      0                                          192.168.0.103:56296                                                   113.107.216.82:https                
ESTAB       0      0                                          192.168.0.103:56540                                                  185.199.108.153:https                
ESTAB       0      0                                              127.0.0.1:socks                                                        127.0.0.1:44452                
ESTAB       0      0                                              127.0.0.1:42150                                                        127.0.0.1:9614

其中state显示了当前连接的状态,例如结果的第一行是ESTABLISHED状态,Local Address:port代表本地连接的ip和端口号。 另外使用-n参数显示数字形式的ip和端口

查看socket进程信息

查看到某个连接后,怎么知道是哪个进程的连接呢?使用-p(processes)即可,例如:

$ ss -tp
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
ESTAB       0      0                                              127.0.0.1:42150                                                        127.0.0.1:9614                  users:(("chrome",pid=2578,fd=347))
ESTAB       0      0                                              127.0.0.1:41910                                                        127.0.0.1:9614                  users:(("chrome",pid=2578,fd=383))

拖动滚动条到最后可以看到,-p参数显示了这条连接的进程信息,例如,对于第一条结果,可以看到,该进程是chrome,进程id为2578,并且这条连接的文件描述符为383。

users:(("chrome",pid=2578,fd=383))

查看处于特定状态的socket

我们知道,对于TCP连接来讲,在不同的阶段它的状态不同,常见状态有

  • ESTABLISHED 已建立
  • CLOSED 已关闭
  • LISTENING 正在监听
  • FIN-WAIT-2 等待连接关闭
  • TIME-WAIT 等待足够时间,确保服务器正常关闭该连接
  • ……

这里还有很多其他状态,我们会留到介绍TCP的时候展开。

如何查看处于特定状态的连接呢?例如,要查看处于LISTENING状态的连接:

$ ss -t state LISTENING
Recv-Q Send-Q                                          Local Address:Port                                                           Peer Address:Port                
0      5                                                   127.0.1.1:domain                                                                    *:*                    
0      128                                                 127.0.0.1:5941                                                                      *:*                    
0      5                                                   127.0.0.1:ipp                                                                       *:*

使用state选项即可查看。当然对于LISTENING状态,也可以使用-l参数。

除此之外,还有以下参数,用于查看某类状态,例如:

  • all 所有类型
  • connected 除closed和listen状态以外已连接的状态
  • synchronized 除了syn-sent外的状态

查看TCP相关定时器信息

我们知道在TCP中,有很多定时器,和netstat一样,可以使用-o参数显示定时器相关信息:

$ ss -to
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
ESTAB       0      0                                              127.0.0.1:44660                                                        127.0.0.1:socks                 timer:(keepalive,4min42sec,0)
ESTAB       0      0                                          192.168.0.103:60306                                                    203.208.41.37:https                 timer:(keepalive,9.956ms,0)
ESTAB       0      0

例如上面显示的keepalive定时器剩余时间:

timer:(keepalive,9.956ms,0)

查看socket详细信息

如果想要查看连接更加详细信息呢?比如收到多少数据?上一个ACK是什么时候?mss是多大?拥塞窗口大小是多少?这些信息在分析理解TCP的时候非常有帮助,而查看这些信息只需要使用-i(information)参数即可:

$ ss -ti  #(内容很长,省略了很多信息,可执行尝试)
cubic wscale:7,7 rto:204 rtt:2.302/4.528 ato:40 mss:23488 cwnd:10 bytes_acked:1560 bytes_received:3907 segs_out:18 segs_in:20 send 816.3Mbps lastsnd:1384 lastrcv:1384 lastack:1384 pacing_rate 1632.1Mbps rcv_rtt:546 rcv_space:43690

由于显示的内容比较多,这里就不贴出来了,可自行尝试,里面展示了TCP很多关键信息。

查看socket内存使用情况

使用-m(memory)参数可以查看连接使用内存信息:

$ ss -tm  #只显示内存部分信息
skmem:(r0,rb374400,t0,tb46080,f0,w0,o0,bl0)

由于信息较多,这里只显示内存部分,括号内从左到右分别代表:

  • 接收报文分配的内存
  • 接收报文可分配的内存
  • 发送报文分配的内存
  • 发送报文可分配的内存
  • socket使用的缓存
  • 为将要发送的报文分配的内存
  • 保存socket选项使用的内存
  • 连接队列使用的内存

根据IP或端口过滤socket信息

你可以使用grep命令(可参考《 Linux下的文本查找技巧 》)来获取你需要的信息,但是ss本身提供一些参数用来过滤信息。例如,查看本地ip为192.168.0.103的连接:

$ ss -t src 192.168.0.103
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
ESTAB       0      0                                          192.168.0.103:44528                                                  185.199.109.153:https  
$ ss -t src 192.168.0.103:35418
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
ESTAB       0      0                                          192.168.0.103:35418                                                  111.230.120.127:https

src后面跟本地ip:port,而也可以使用dst根据远端ip来过滤信息。

同样还可以根据协议类型(端口)来过滤,例如查看https socket信息:

$ ss -t '( dport = :https or sport = :https )'
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
ESTAB       0      0                                          192.168.0.103:44528                                                  185.199.109.153:https                
ESTAB       0      0                                          192.168.0.103:35418                                                  111.230.120.127:https     
$ ss -t dport = :https
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
CLOSE-WAIT  32     0                                          192.168.0.103:46626                                                   123.58.182.252:https
$ ss -t sport \> :44550   #显示本地端口大于44550的连接
State       Recv-Q Send-Q                                     Local Address:Port                                                      Peer Address:Port                
ESTAB       390    0                                              127.0.0.1:46468                                                        127.0.0.1:socks                
ESTAB       0      0                                              127.0.0.1:46382                                                        127.0.0.1:socks                
ESTAB       0      0                                              127.0.0.1:46490                                                        127.0.0.1:socks

其中dport,指定本地协议,sport指定远端协议。

显示socket统计信息

使用-s(summary)查看整体统计信息。

$ ss -s
Total: 1379 (kernel 2907)
TCP:   68 (estab 58, closed 1, orphaned 0, synrecv 0, timewait 1/0), ports 0

Transport Total     IP        IPv6
*	  2907      -         -        
RAW	  1         0         1        
UDP	  13        8         5        
TCP	  67        47        20       
INET	  81        55        26       
FRAG	  0         0         0

从统计结果中可以看到,共有67个TCP连接。

总结

本文介绍了ss命令一些实用的用法,为后面介绍网络编程相关内容打下基础,更多ss用法可查看帮助手册。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

七周七语言

七周七语言

Bruce A.Tate / 巨成、戴玮、白明 / 人民邮电出版社 / 2012-5-8 / 59.00元

内容简介: 从计算机发展史早期的Cobol、Fortran到后来的C、Java,编程语言的家族不断壮大。除了这些广为人知的语言外,还涌现了Erlang、Ruby等后起之秀,它们虽被喻为小众语言,但因其独特性也吸引了为数不少的追随者。 Bruce A. Tate是软件行业的一名老兵,他有一个宏伟目标:用一本书的篇幅切中要害地探索七种不同的语言。本书就是他的成果。书中介绍了Ruby、Io、......一起来看看 《七周七语言》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具