linux netstat tcp(全连接半连接)详解

  1. 功能介绍(参考 LINUX MAN命令 大家可以自己去看一下 这里只是列出常用的部分说明)
    显示网络连接状态(如:LISTEN、ESTABLISHED、TIME_WAIT),路由地址,应用使用协议(如:TCP、UDP),IP和端口使用情况等其他网络信息。

  2. 常用参数
    –route , -r:显示内核路由表
    –all , -a:显示所有套接字
    -l, --listening:只显示正在侦听的套接字
    –numeric , -n:显示数字形式地址而不是去解析主机、端口或用户名(注意 如果不使用这个参数的话 netstat命令的输出回很慢 因为它会把数字形式的地址通过网络去解析主机、端口或用户名然后再展示)
    –groups , -g:显示IPv4 和 IPv6的IGMP组播组成员关系信息
    –interface=iface , -i: 显示所有网络接口列表或者是指定的 iface
    –statistics , -s: 显示每种协议的统计信息
    -c, --continuous:将使 netstat 不断地每秒输出所选的信息
    -p, --program:显示套接字所属进程的PID和名称
    –protocol=family , -A:指定要显示哪些连接的地址族(也许在底层协议中可以更好地描述)。 family 以逗号分隔的地址族列表,比如 inet, unix, ipx, ax25,netrom, 和 ddp。 这样和使用 --inet, --unix (-x), --ipx, --ax25, --netrom, 和 --ddp 选项效果相同。地址族 inet 包括raw, udp 和tcp 协议套接字。
    -e, --extend:显示附加信息。使用这个选项两次来获得所有细节

  3. 举例

    netstat -anp | more  列出所有端口并展示PID 和应用名称
    
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:8008            0.0.0.0:*               LISTEN      7037/nginx: worker  
    tcp        0      0 0.0.0.0:8104            0.0.0.0:*               LISTEN      7037/nginx: worker  
    tcp        0      0 0.0.0.0:808             0.0.0.0:*               LISTEN      7037/nginx: worker  
    tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN      7037/nginx: worker  
    tcp        0      0 0.0.0.0:9001            0.0.0.0:*               LISTEN      7037/nginx: worker  
    tcp        0      0 0.0.0.0:8041            0.0.0.0:*               LISTEN      10258/nginx: master  
    
    netstat -ne | more 展示其他相关属性 例如User
    
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode     
    tcp        0      0 10.10.151.199:58218     10.9.106.44:6379        ESTABLISHED 0          247408949 
    tcp        0      0 10.10.151.199:44732     10.9.109.91:11211       ESTABLISHED 1001       254160642 
    tcp        0      0 10.10.151.199:55368     10.9.109.91:11211       ESTABLISHED 1001       254170734 
    tcp        0      0 10.10.151.199:51250     10.9.106.44:6379        ESTABLISHED 0          246984680 
    tcp        0      0 10.10.151.199:22        10.10.123.101:60782     ESTABLISHED 0          251455650 
    tcp        0      0 10.10.151.199:22        10.10.123.101:46285     ESTABLISHED 0          253605784
    
    netstat -nu | more 展示UDP连接情况 t代表tcp
    
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    udp        0      0 10.10.170.211:38608     10.10.255.1:53          ESTABLISHED
    udp        0      0 10.10.170.211:55056     10.10.255.1:53          ESTABLISHED
    udp        0      0 10.10.170.211:39151     10.10.255.2:53          ESTABLISHED
    
    netstat -r 显示路由相关信息
    
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    default         gateway         0.0.0.0         UG        0 0          0 eth0
    10.10.0.0       0.0.0.0         255.255.0.0     U         0 0          0 eth0
    
    netstat -l | more 显示监听端口
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:8008            0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:8104            0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:omirr           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN 
    
     netstat -s | grep TCP | more   显示TCP协议的统计信息
     
     105128896 TCP sockets finished time wait in fast timer
     39460900 TCP sockets finished time wait in slow timer
     TCPLostRetransmit: 287
     3358476 other TCP timeouts
     TCPLossProbes: 78189
     TCPLossProbeRecovery: 34923
    

    各列的含义
    Proto: 套接字使用的协议
    Recv-Q: 连接此套接字的用户程序未拷贝的字节数
    Send-Q:远程主机未确认的字节数
    Local Address: 套接字的本地地址(本地主机名)和端口号。除非给定-n 选项,否则套接字地址按标准主机名(FQDN)进行解析,而端口号则转换到相应的服务名。
    Foreign Address:套接字的远程地址(远程主机名)和端口号
    State:套接字的状态。因为在RAW协议中没有状态,而且UDP也不用状态信息,所以此行留空。通常它为以下几个值之一:ESTABLISHED、SYN_SENT、SYN_RECV、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSED、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN(就是TCP协议里面的服务器的网络状态 后面有详细讲解TCP哈 )
    User:套接字属主的名称或UID
    PID/Program name: 以斜线分隔的处理套接字程序的PID及进程名。-p使此栏目被显示。你需要sudo权限来查看不是你拥有的套接字的信息。对IPX套接字还无法获得此信息。

  4. TCP三次握手
    过程如下:
    服务器准备接收客户端请求 此时服务器处于LISTEN(监听)状态
    客户端发出请求 此时客户端进入SYN-SENT(同步已发送)状态
    服务器接收请求后确认建立连接 向客户端发送确认 此时服务器处于SYN_RCVD(同步收到)
    客户端收到确认后还需要向服务器确认 此时进入ESTABLISHED(已建立连接)状态
    linux netstat tcp(全连接半连接)详解_第1张图片

    如图所示:
    syns queue: 半连接队列用来存储 SYN_RCVD状态的未完成连接的信息 服务端第一次收到客户端请求时将连接信息放在队列中
    accept queue: 全连接队列用来存储ESTABLISH状态的已完成连接的信息 第三步服务器收到客户端确认时会把半连接队列中的信息放到全连接当中

    cat /proc/sys/net/ipv4/tcp_max_syn_backlog 查看系统设置半队列长度
    256
    
    cat /proc/sys/net/core/somaxconn  查看系统设置全队列长度
    128
    
    cat /proc/sys/net/ipv4/tcp_abort_on_overflow  查看全连接队列溢出后OS如何处理 0 丢掉客户端传来的请求 1 返回客户端reset 取消握手
    0
    
    cat /proc/sys/net/ipv4/tcp_synack_retries  全连接溢出后 服务器重新和客户端连接尝试次数
    5
    

    全连接队列的大小取决于:min(backlog,somaxconn)。backlog 是在 Socket 创建的时候传入的,Somaxconn 是一个 OS 级别的系统参数。
    半连接队列的大小取决于:max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的 OS 会有些差异。

    netstat -s | grep SYNs   查看半连接溢出量
    17484 SYNs to LISTEN sockets dropped
    
    netstat -s | grep TCPBacklogDrop 查看全连接溢出量
    TCPBacklogDrop: 181071
    
    ss -lnt |more  展示每一个端口对应的全连接队列大小 Send-Q  Recv-Q表示有多少等待连接数
    State      Recv-Q Send-Q                    Local Address:Port                                   Peer     Address:Port              
    LISTEN     0      128                                   *:8008                                              *:*                  
    LISTEN     0      128                                   *:8104                                              *:*                  
    LISTEN     0      128                                   *:808                                               *:*                  
    LISTEN     0      128                                   *:8009                                              *:*                  
    LISTEN     0      128                                   *:9001                                              *:*     
    

    在出现全连接和半连接溢出的情况是 会导致客户端访问时间(网络时间+排队时间+重试时间+服务时间)过长 而服务器真正服务的时候又很短 所以适当合理的控制一下全连接队列的大小 可以帮助我们避免全连接队列溢出的情况

参考文章:
https://mp.weixin.qq.com/s/eZU573-o-KVmVyU11esb4A
https://www.cnxct.com/something-about-phpfpm-s-backlog/
https://blog.csdn.net/feeltouch/article/details/83155607
http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/

你可能感兴趣的:(Nginx,网络)