`
QING____
  • 浏览: 2232882 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

netstat与ss指令学习

 
阅读更多

    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

  • 大小: 56.7 KB
  • 大小: 28.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics