zoukankan      html  css  js  c++  java
  • TCP状态统计

    一、netstat命令说明

    netstat常见参数
    -a (all)显示所有选项,默认不显示LISTEN相关
    -t (tcp)仅显示tcp相关选项
    -u (udp)仅显示udp相关选项
    -n 拒绝显示别名,能显示数字的全部转化成数字。
    -l 仅列出有在 Listen (监听) 的服務状态
    
    -p 显示建立相关链接的程序名
    -r 显示路由信息,路由表
    -e 显示扩展信息,例如uid等
    -s 按各个协议进行统计
    -c 每隔一个固定时间,执行该netstat命令。
    
    提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

    二、统计TCP状态

    统计TCP状态:netstat -ant | awk 'NR>=3 {++State[$6]} END {for (key in State) print key,State[key]}'
                    ss -ant | awk 'NR>=2 {++State[$1]} END {for (key in State) print key,State[key]}'
    
    首先是netstat内容输出:
    [vagrant@localhost ~]$ netstat -ant
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State
    tcp        0      0 0.0.0.0:39198               0.0.0.0:*                   LISTEN
    tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
    tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
    tcp        0      0 10.0.2.15:22                10.0.2.2:58263              ESTABLISHED
    tcp        0      0 :::51041                    :::*                        LISTEN
    tcp        0      0 :::111                      :::*                        LISTEN
    tcp        0      0 :::22                       :::*                        LISTEN
    tcp        0      0 ::1:25                      :::*                        LISTEN
    
    
    命令注释:netstat -n | awk '/^tcp/ {++state[$NF]} END {for(a in state) print a, state[a]}'
    
    /^tcp/
    滤出tcp开头的记录,屏蔽udp, socket等无关记录。
    
    state[]
    相当于定义了一个名叫state的数组
    
    NF
    The number of fields in the current input record.(表示输入数据的字段总数,如上所示的记录,NF等于6)
    
    $NF
    表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
    
    state[$NF]
    表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
    
    ++state[$NF]
    表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
    
    END
    表示在最后阶段要执行的命令
    
    for(key in state)
    遍历数组
    
    print key,"	",state[key]
    打印数组的键和值,中间可以用	制表符分割,美化一下。
    
    NR>=3
    The total number of input records seen so far.(NR表示已输入数据行数目,即表示从第二行开始处理,NR和NF都是内建变量)
    
    
    同理ss工具下的awk语句应该修改成:ss -ant | awk 'NR>=2 {++State[$1]} END {for (key in State) print key,State[key]}'
    [root@localhost ~]# ss -ant
    State       Recv-Q Send-Q                         Local Address:Port                                        Peer Address:Port
    LISTEN      0      50                                         *:3306                                                   *:*
    LISTEN      0      128                                        *:6379                                                   *:*
    LISTEN      0      128                                        *:80                                                     *:*
    LISTEN      0      128                                        *:22                                                     *:*
    LISTEN      0      100                                127.0.0.1:25                                                     *:*
    ESTAB       0      0                                  10.0.2.15:22                                              10.0.2.2:58352
    ESTAB       0      0                                  10.0.2.15:22                                              10.0.2.2:57127
    LISTEN      0      128                                       :::80                                                    :::*
    LISTEN      0      32                                        :::21                                                    :::*
    LISTEN      0      128                                       :::22                                                    :::*
    LISTEN      0      100                                      ::1:25                                                    :::*

    三、统计每个IP的连接数

    统计每个IP的连接数:netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c| sort -rn
                          ss -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c| sort -rn
    
    ---------------------------------------------------(netstat -n in CentOS6)----------------------------------------------------
    Proto Recv-Q Send-Q Local Address               Foreign Address             State
    tcp        0      0 10.0.2.15:22                10.0.2.2:58262              ESTABLISHED
    tcp        0      0 10.0.2.15:22                10.0.2.2:58263              ESTABLISHED
    
    ---------------------------------------------------(ss -n in CentOS7)---------------------------------------------------------
    Netid State      Recv-Q Send-Q                       Local Address:Port                                      Peer Address:Port
    tcp   ESTAB      0      0                                10.0.2.15:22                                            10.0.2.2:58352
    tcp   ESTAB      0      0                                10.0.2.15:22                                            10.0.2.2:57127
    
    
    netstat -n                  :以数字形式显示地址信息
    awk '/^tcp/ {print $5}'     :筛选以tcp开头的行,并打印5th filed.
    awk -F: '{print $1}'        :以冒号为字段分隔符,打印第一个字段(-F fs 指定行中分隔数据字段的字段分隔符)
    uniq -c                     :去除重复项目,-c 进行计数
    sort -rn                    :进行排序,-r 反向排序 -n 使用纯数字进行排序
  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/echo1937/p/6646208.html
Copyright © 2011-2022 走看看