zoukankan      html  css  js  c++  java
  • netstat

    原文链接:https://www.jellythink.com/archives/472

    netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,同时还可用于检验本机各端口的网络连接情况。服务器有时候接收到的数据包导致数据出错或故障,不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么我们就应该使用netstat查一查为什么会出现这些情况了。

    常用选项说明如下:

    • -a:显示所有选项,默认不显示LISTEN相关
    • -t:仅显示tcp相关选项
    • -u:仅显示udp相关选项
    • -n:拒绝显示别名,能显示数字的全部转化成数字
    • -l:仅列出有在Listen(监听)的服务状态
    • -p:显示建立相关连接的程序名
    • -r:显示路由信息,路由表
    • -e:显示扩展信息,例如uid等
    • -s:按各个协议进行统计
    • -c:每隔一个固定时间,执行该netstat命令
    • -i:显示网卡接口信息

    LISTEN和LISTENING的状态只有用-a或者-l才能看到

    命令:netstat -a
    说明:列出所有连接
    输出:

    输出主要包含两部分:

    • Active Internet connections (servers and established),称为有源TCP链接,包括TCP和UDP等的详细状态;
    • Active UNIX domain sockets (servers and established),称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍);

    有源TCP连接字段详解:

    有源TCP连接字段详解:

    • Proto:当前连接的协议;如TCP、UDP;
    • Recv-Q:网络接收队列;
    • Send-Q:网络发送队列;接收队列和发送队列一般都应该是0,如果不是则表示数据包正在队列中堆积,但是这种情况比较少见;
    • Local Address:本机的ip:port(注意此处127.0.0.1默认显示主机名,0.0.0.0默认显示*,端口可能显示别名。若强制显示数字,加-n参数)
    • Foreign Address:对端ip:port;与Local Address规则相同
    • State:当前套接字的网络状态,有以下几种状态:
      • 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:没有任何连接状态

    命令:netstat -antp
    说明:以数字的形式显示所有的TCP连接,并显示对应程序所监听的端口号
    输出:

     命令:netstat -anup
    说明:以数字的形式显示所有的UDP连接,并显示对应程序所监听的端口号
    输出:

     命令:netstat -st
    说明:统计TCP协议相关的网络统计数据

    命令:netstat -rn
    说明:打印内核路由信息
    输出:

    输出内容详解:

    • Destination:目标网络或目标主机
    • Gateway:网关地址,如果没有就显示星号
    • Genmask:网络掩码,0.0.0.0表示默认路由
    • Flags:标志位,有以下常用取值:
      • U:表示该路由是启动的
      • H:目标是一部主机(IP)而非网域
      • G:需要透过外部的主机(gateway)来转递封包
    • Iface:网络接口名

    命令:netstat -ie
    说明:显示网络接口信息
    输出:

    命令:netstat -a|grep 6379

    说明:查看某个端口是否被占用

    如果你遇到“Address already in use”的错误,那么你就需要好好看看是不是端口已经被占用了。-a(all)参数用于列出所有监听和非监听状态的连接。

    这里我们可以看到,有一个tcp连接使用了6379端口,并且当前处于LISTEN状态

    命令:netstat -ap|grep 6379

    说明:查找占用端口的进程

    前面虽然知道已经有进程使用了6379端口,但是不知道是哪个进程,因此为了知道进程信息,需要使用-p(program)参数:

     这个时候就可以看到是进程id为10011的redis-server进程占用了6379端口

    命令:netstat -ent

    说明:查看用户和连接的iNode

     可以看到在使用-e参数后,多了最后两列,分别是user和Inode。而使用id命令可以知道该user到底是谁:

    常用脚本

    • 统计TCP各个状态数量
      netstat -n | awk '/^tcp/{++state[$NF]}; END{for(key in state) print key, "	", state[key]}'

      通过上面的脚本,我们可以快速的统计中当前TCP每个状态的数量,通过这个数量,我们就可以大致知道服务器TCP连接当前的健康状态。

    • 统计连接某服务端口最多的IP地址

      netstat -nat | grep ":80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20
  • 相关阅读:
    CS round--36
    Vijos 1002 过河 dp + 思维
    汇编模拟36选7
    1137
    E. Mike and Foam 容斥原理
    Even-odd Boxes hackerrank 分类讨论
    112. 作业之地理篇 最小费用最大流模板题
    1550: Simple String 最大流解法
    Sam's Numbers 矩阵快速幂优化dp
    java.sql.SQLSyntaxErrorException: ORA-01722: 无效数字
  • 原文地址:https://www.cnblogs.com/lvchengda/p/12768146.html
Copyright © 2011-2022 走看看