netstat与ss指令都是用来查看网络连接相关的,我们逐个介绍,希望日后工作中能够有所帮助。
一、netstat
1、netstat:默认展示所有的socket连接。稍后介绍相关信息的含义。
2、netstat -r:展示内核的路由表信息,基本用不到
# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default ip-10-0-9-1.cn- 0.0.0.0 UG 0 0 0 eth0 10.0.9.0 * 255.255.255.0 U 0 0 0 eth0 instance-data.c * 255.255.255.255 UH 0 0 0 eth0
3、netstat -s:展示所有网络连接的统计信息
#netstat -s ... Tcp: 16191169 active connections openings 10934749 passive connection openings 3346431 failed connection attempts 10319 connection resets received 19 connections established 88563173741 segments received 29491875182 segments send out 7005211 segments retransmited 14121 bad segments received. 1540388 resets sent ...
4、netstat -n:可选参数,使用数字的地址而不是host名称。
# netstat -tn Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 10.0.9.187:10050 10.0.2.200:21883 TIME_WAIT tcp 0 0 10.0.9.187:10050 10.0.2.200:50356 TIME_WAIT tcp 0 0 10.0.9.187:39730 10.4.4.246:80 ESTABLISHED tcp 0 0 10.0.9.187:10050 10.0.2.200:11943 TIME_WAIT tcp 0 0 10.0.9.187:10050 10.0.2.200:9444 TIME_WAIT
5、netstat -p:可选参数,展示PID信息。
# netstat -ntp Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 10.0.9.187:10050 10.0.2.200:13726 TIME_WAIT - tcp 0 0 10.0.9.187:39730 10.4.4.246:80 ESTABLISHED 27995/falcon-agent tcp 0 0 10.0.9.187:10050 10.0.2.200:58501 TIME_WAIT - tcp 0 0 10.0.9.187:10050 10.0.2.200:63373 TIME_WAIT - tcp 0 0 10.0.9.187:10050 10.0.2.200:34973 TIME_WAIT - tcp 0 0 10.0.9.187:10050 10.0.2.200:40180 TIME_WAIT - tcp 0 0 10.0.9.187:22 10.0.1.200:28820 ESTABLISHED 40671/sshd
6、netstat -l:可选参数,只展示处于“listening”状态的连接,通常用于判断ServerSocket服务是否正常。比较遗憾的是,对于其他“state”类型没有单独的可选参数。
# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3173/sshd tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 3416/zabbix_agentd tcp 0 0 :::8080 :::* LISTEN 5903/java tcp 0 0 :::22 :::* LISTEN 3173/sshd tcp 0 0 :::29433 :::* LISTEN 37507/java tcp 0 0 :::10050 :::* LISTEN 3416/zabbix_agentd tcp 0 0 :::45379 :::* LISTEN 37507/java tcp 0 0 :::1988 :::* LISTEN 27995/falcon-agent tcp 0 0 :::5445 :::* LISTEN 37507/java
7、netstat -a:可选参数,展示listening和non-listening状态的所有sockets。默认就是“-a”。比如“netstat -ntp”与“netstat -antp”一样。
如果我们希望获取某个外部地址的所有TCP连接、或者“ESTABLISHED”状态的连接,我们可以结合grep:"netstat -antp | grep '10.0.1.33' | grep 'ESTABLISHED' "等等。
字段值描述:
1)Recv-Q:接收队列,此socket上(已到达本地buffer)尚未进程接收的字节数。此值通常0,或者极少数情况短暂非0,如果持续大于0,则表示连接的处理进程处理效率较低或者出现瓶颈或者BUG;这种情况通常发生在集中式网络代理服务组件上,比如nginx、网关服务等,并发较高时易出现问题。有时候“拒绝服务”攻击也可能导致此问题(denial-of-service)。
2)Send-Q:发送队列,此socket上等待发送的字节数。此值通常为0,或者极少数情况短暂非0;如果此值持续大于0,则表示可能远端接收和处理能力不足、或者网络带宽受限,我们可以通过此值判断导致连接IO延迟较高的原因。究竟是处理能力不足还是带宽受限,我们可以在两端同时检测,如果远端Recv-Q很高则极大可能是处理能力不足,如果远端Recv-Q为0 可以初步判断网络带宽不足。
3)State:连接状态,TCP/UDP等各种协议有所不同。“LISTEN”表示侦听状态,等待accept新的连接(需要指定-l可选参数是才打印);“ESTABLISHED”已建立连接;“TIME_WAIT”等待关闭的连接;“CLOSE_WAIT”远端已关闭则正在等待关闭确认;“CLOSED”已关闭。贴上经典的TCP连接状态迁移图:
我们都知道,只要尚未关闭(非CLOSED)状态的连接均会占用一个FD,系统所能支持的FD个数数有限的(ulimit),达到阈值则不能再继续创建新的连接。“ESTABLISHED”和“CLOSED”两种状态我们没有必要干预;其中“TIME_WAIT”和“CLOSE_WAIT”两种中间状态,通常在服务器上出现较多,特别是HTTP类型的服务,这两种状态都潜在表示连接已不可用,但是却无法及时销毁,占用了很多的FD。比如nginx或者网关系统上,出现大量的上述状态的连接。
TIME_WAIT是连接的一端主动关闭连接(调用close(),FIN_WAIT1)时收到远端FIN响应之后处于的一种状态,此状态将会保持2MSL(默认为 2 * 60秒)时长后有操作系统自动回收并将连接设置为CLOSED状态。在此期间,SOCKET端口将一直无法释放;大家都知道,对于TCP、HTTP连接的Client端,总是占用一个本地端口,一个机器上所能支持的端口总数是有限制的(65535),所以并发的请求Server虽然你调用了close方法,但是系统级别这些连接仍然没有物理释放,当超过阈值时就无法再发送新的连接请求了,这也是我们常遇到的“不能创建连接”的问题,不过空闲一段时候后又可以继续请求。之所有TIME_WAIT(和CLOSE_WAIT)这个状态,主要是考虑哪些尚未发出或者已发出尚未达到的数据包能够良好的被处理(忽略但不会在网络层出错)。我们的解决问题的出发点,就是如何降低MSL的时长:
## 打开时间戳控制,此值为1时reuse、recycle才会生效,此处为关闭 net.ipv4.tcp_timestamps = 0 ## 开启TCP TW状态socket回收,默认开启 ## 有文章表示此值需要关闭,在多级NAT网络时,同一个源IP可能会是 ## NAT后的很多机器,这些机器的timstamp递增性无法保证,服务器会拒绝非底层请求的连接。 ##(除非都开启timestamp)或者负载均衡与WEB之间没有NAT组件 net.ipv4.tcp_tw_recycle = 1 ## tw状态是否可以被重用TCP底层协议栈支持可重用。 net.ipv4.tcp_tw_reuse = 1 ## timeout时间,MSL时长 net.ipv4.tcp_fin_timeout = 12 ## TW状态的连接数超过此值将会被清理,默认值是20000 net.ipv4.tcp_max_tw_buckets = 20000
由此可见,TIME_WAIT状态的连接过多,会有一定的影响,但是本身并不是什么过错,因为这是TCP机制的一种策略。
CLOSE_WAIT是反应在远端的一种连接状态,处于CLOSE_WAIT状态的连接通常应该不会很多,Socket接收到FIN尚未发送自己的FIN之前处于这种状态。出现大量CLOSE_WAIT的原因,通常是本地SOCKET未能良好处理连接异常错误导致。比如Socket中已经没有数据可以接收(-1)或者已经出错的情况下仍然未执行close操作导致,主要是代码异常,我们需要慎重排查。原则上,SOCKET通信(包括HTTP)在网络数据读取结束(-1)或者有IO异常时应该总是调用相应的CLOSE方法。
private String process(HttpUriRequest request) throws Exception { CloseableHttpResponse response = null; try { response = httpClient.execute(request); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode != 200) { request.abort(); throw new RuntimeException("HttpClient error, status=" + statusCode + ",message:" + statusLine.getReasonPhrase()); } HttpEntity entity = response.getEntity(); String result = null; if (entity != null) { result = EntityUtils.toString(entity, charset); } EntityUtils.consume(entity); return result; } finally { if (response != null) { response.close(); } } }
二、ss指令
ss指令很有用,跟netstat差不多,我们有时候可以综合使用这两个指令,各取所好吧。
1、ss -a :展示所有socket,基本同“netstat -a”。
2、ss -l:展示所有listen状态的socket,基本同“netstat -l”。
3、ss -o:额外展示Timer信息,基本同“netstat -o”。
4、ss -p:额外展示进程id,基本同“netstat -p”。
5、ss -4:展示IPV4的socket。
6、ss -6:展示IPV6的socket。
7、ss -t:展示TCP的socket,同“netstat -t”;-u表示udp。
8、ss -s:展示统计信息,比较有用,相对于netstat需要综合其他管道才能计算结果。
# ss -s Total: 321 (kernel 1224) TCP: 85 (estab 27, closed 48, orphaned 0, synrecv 0, timewait 48/0), ports 0 Transport Total IP IPv6 * 1224 - - RAW 0 0 0 UDP 4 4 0 TCP 37 20 17 INET 41 24 17 FRAG 0 0 0
参考:
1、https://cloud.tencent.com/developer/article/1004354
2、https://linux.die.net/man/8/netstat
3、https://ieevee.com/tech/2017/07/19/tcp-tw-recycle.html
4、http://blog.51cto.com/benpaozhe/1767612
5、http://blog.51cto.com/cangzihu/1888622
6、https://blog.csdn.net/libaineu2004/article/details/78886182
7、http://man.linuxde.net/ss
8、https://www.cnblogs.com/sunxucool/p/3449068.html
相关推荐
Linux网络状态工具netstat和ss使用详解 介绍Linux下netstat和ss的使用
cmd 和 netstat指令
代替netstat的命令ss使用教程
不过,最近有一次安装好一个 Ubuntu 发型版,发现默认没有安装 netstat,觉得非常奇怪,自己手动安装后,发现 man pages 提示,netstat 命令已经是 deprecated 了,建议使用 ss 命令代替。 This program is mostly ...
教你如何使用Netstat 更好的进行Netstat的学习
Linux 中关于网络的netstat命令,相关内容。
Linux netstat命令详解 netstat 是网络编程常用的命令
netstat -na 结果
Netstat 命令
netstat TCP状态栏排序并统计脚本
Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据
netstat 命令的详细说明,凑字数很困难,慢慢凑
netstat命令的使用 netstat命令的使用 netstat命令的使用
netstat源码实现
工欲善其事,必先利其器。 研发人员在网络编程时(无论操作...一般来说,netstat的执行结果内容比较多、比较杂,观察起来比较费力,可以配合findstr|grep|more|>等重定向指令,对结果数据进行裁剪,获取需要的内容。
netstat监控脚本netstat监控脚本netstat监控脚本netstat监控脚本
X-NetStat 可以监视本地当前网络和互联网络连接。可显示每一个当前连接的本地/远程网络地址(主机名或IP)、本地/远程端口和连接状态,支持ICMP、UDP、TCP协议。任何时候当你连接到一个网站、检查电子邮件、发送ICQ...
vb.net netstat 简单的例子,没太多技术含量
程序代码实现netstat,获取本地tcp、udp状态信息
Netstat32 - (C) 2003-2004 Salvatore Meschini - Freeware <br>You can use/distribute this program for FREE but you CAN'T modify it without my permission (just ask for it...)! Please read the legal...