netstat

作者: ArthurIsUsed | 来源:发表于2020-05-20 17:21 被阅读0次

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的

-a 显示所有socket,包括正在监听的。
-c 每隔1秒就重新显示一遍,直到用户中断它。
-i 显示所有网络接口的信息,格式同“ifconfig -e”。
-n 以网络IP地址代替名称,显示出网络连接情形。
-r 显示核心路由表,格式同“route -e”。
-t 显示TCP协议的连接情况。
-u 显示UDP协议的连接情况。
-v 显示正在进行的工作。
-p 显示对应的服务程序名

当我们使用 netstat -apn 查看网络连接的时候,会发现很多类似的内容,可以查看这个端口是属于哪个程序的,使用lsof -i:PortID

[root@i-n39rov87 ~]# lsof -i:37580
COMMAND   PID     USER   FD   TYPE     DEVICE   SIZE/OFF   NODE   NAME
nginx   23921     root   28u  IPv4  153736674        0t0    TCP   *:37580 (LISTEN)
nginx   29813   nobody   28u  IPv4  153736674        0t0    TCP   *:37580 (LISTEN)
nginx   29814   nobody   28u  IPv4  153736674        0t0    TCP   *:37580 (LISTEN)
nginx   29815   nobody   28u  IPv4  153736674        0t0    TCP   *:37580 (LISTEN)
nginx   29816   nobody   28u  IPv4  153736674        0t0    TCP   *:37580 (LISTEN)

根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.

time_wait表示系统在等待客户端的相应,是正常的。一段时间后它会自动转换到另一状态,或结束。你可以缩短等待时间。你后面那个问提是正常的。

[root@i-n39rov87 ~]# netstat -anpt | grep 28.2 | grep 'TIME_WAIT' | wc -l
1751
[root@i-n39rov87 ~]# netstat -n | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
TIME_WAIT 778
ESTABLISHED 5

TIME_WAIT过多解决

决的办法,在 /etc/sysctl.conf加入下面几个参数

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000 ## 端口分配范围
net.ipv4.tcp_max_tw_buckets = 5000 ## 设置"time_wait"的桶最多容纳5000个
  • net.ipv4.tcp_tw_reuse = 1
    ◇:表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  • net.ipv4.tcp_tw_recycle = 1
    ◇:表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  • net.ipv4.tcp_fin_timeout = 30
    ◇:表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
  • net.ipv4.tcp_keepalive_time = 1200
    ◇:表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
  • net.ipv4.ip_local_port_range = 1024 ? ?65000
    ◇:表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
  • net.ipv4.tcp_max_syn_backlog = 8192
    ◇:表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
  • net.ipv4.tcp_max_tw_buckets = 5000
    ◇:表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000
  • 查看28.2nginx服务器
[root@i-n39rov87 ~]# cat /etc/sysctl.conf | grep tcp
net.ipv4.tcp_syncookies = 1

TCP4次断开


而四次握手关闭连接示意图中,TCP协议中,关闭TCP连接的是Server端(当然,关闭都可以由任意一方发起),当Server端发起关闭连接请求时,向Client端发送一个FIN报文,Client端收到FIN报文时,很可能还有数据需要发送,所以并不会立即关闭SOCKET,所以先回复一个ACK报文,告诉Server端,“你发的FIN报文我收到了”。当Client端的所有报文都发送完毕之后,Client端向Server端发送一个FIN报文,此时Client端进入关闭状态,不在发送数据。

Server端收到FIN报文后,就知道可以关闭连接了,但是网络是不可靠的,Client端并不知道Server端要关闭,所以Server端发送ACK后进入TIME_WAIT状态,如果Client端没有收到ACK则Server段可以重新发送。Client端收到ACK后,就知道可以断开连接了。Server端等待了2MSL(Max Segment Lifetime,最大报文生存时间)后依然没有收到回复,则证明Client端已正常断开,此时,Server端也可以断开连接了。2MSL的TIME_WAIT等待时间就是由此而来。

我们知道了TIME_WAIT的由来,TIME_WAIT 状态最大保持时间是2 * MSL,在1-4分钟之间,所以当系统并发过大,Client-Server连接数过多,Server端会在1-4分钟之内积累大量处于TIME_WAIT状态的无法释放的socket连接,导致服务器效率急剧下降,甚至耗完服务器的所有资源,最终导致No buffer space available (maximum connections reached?): connect

nmap scan

  • scan tcp protocol, 扫描哪些端口打开的
[root@kmb2b-b2c1 logs]# nmap 172.20.28.2 -p 1-65535

Starting Nmap 5.51 ( http://nmap.org ) at 2018-09-05 16:30 CST
Nmap scan report for 172.20.28.2
Host is up (0.00024s latency).
Not shown: 65524 closed ports
PORT        STATE     SERVICE
22/tcp      open      ssh
53/tcp      open      domain
80/tcp      open      http
81/tcp      open      hosts2-ns
82/tcp      open      xfer
111/tcp     open      rpcbind
443/tcp     open      https
10050/tcp   open      unknown
36077/tcp   open      unknown
37580/tcp   open      unknown
52262/tcp   open      unknown
MAC Address: 52:54:1E:B2:7E:AA (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 2.17 seconds
  • can udp-protocol, nmap -sU 10.0.1.161 -Pn
    ◇:-sU:表示udp scan , udp端口扫描
    ◇:-Pn:不对目标进行ping探测(不判断主机是否在线)(直接扫描端口)
  • nmap -sP 扫描某个网段的主机是否存活
Host is up (0.00063s latency).
MAC Address: 52:54:14:62:17:C9 (Unknown)
Nmap done: 256 IP addresses (36 hosts up) scanned in 1.69 seconds
[root@kmb2b-b2c1 logs]# nmap -sP 172.20.28.0/24

相关文章

  • Netstat & telnet

    Netstat 查看当前哪些端口在监听:netstat -ltnp l – tells netstat to on...

  • Linux常用命令

    netstat -ntpl //查看端口 netstat -lnpt //查看监听的端口 netstat -l...

  • netstat

    列出所有连接$ netstat -a 禁用反向域名解析,加快查询下速度$ netstat -antActive I...

  • netstat

    用来打印网络链接 路由表 接口统计、伪装连接和多播成员资格 语法 netstat (选项) 选项 -v 显示指令执...

  • netstat

    输出信息含义 执行netstat后,其输出结果为 Active Internet connections (w/o...

  • netstat

  • netstat

    常见参数 -a (all)显示所有选项,默认不显示LISTEN相关 -t (tcp)仅显示tcp相关选项 -u (...

  • netstat

    netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设...

  • netstat

    -r 列出路由表-n 不使用主机名与服务名称-a 列出所有连接状态-t 仅列出tcp数据包的连接-u 仅列出udp...

  • netstat

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Stati...

网友评论

      本文标题:netstat

      本文链接:https://www.haomeiwen.com/subject/zzpnohtx.html