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
网友评论