你们好,又碰面了,我是大家的同事全栈君。
一、介绍
Netstat是控制台命令,是一个监控TCP/IP网路的特别有用的工具,它可以显示路由表、实际的网路联接以及每一个网路插口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP合同相关的统计数据红旗linux6.0教程,通常用于检验本机各端口的网路联接情况。
二、输出信息描述
执行netstat后输出如下:
netstat的输出结果可以分为两个部份
1、ActiveInternetconnections有源TCP联接,其中”Recv-Q”和”Send-Q”指接收队列和发送队列。这种数字通常都应当是0。倘若不是则表示软件包正在队列中堆积。此类情况只能在特别少的情况看见。
2、ActiveUNIXdomainsockets有源Unix域套插口(和网路套接字一样,而且只能用于本机通讯,性能可以提升一倍)。
列名解释:
Proto:显示联接使用的合同。
RefCnt:表示联接到本套插口上的进程号。
Types:显示套插口的类型。
State:显示套插口当前的状态。
Path:表示联接到套插口的其它进程使用的路径名。
三、netstat常见参数
-a(all)显示所有选项linux 命令 netstat,默认不显示LISTEN相关。-t(tcp)仅显示tcp相关选项。-u(udp)仅显示udp相关选项。-n拒绝显示别称,能显示数字的全部转化成数字。-l仅列举有在Listen(窃听)的服务状态。
-p显示完善相关链接的程序名-r显示路由信息,路由表-e显示扩充信息,比如uid等-s按各个合同进行统计-c每隔一个固定时间,执行该netstat命令。
LISTEN和LISTENING的状态只有用-a或则-l就能看见。
四、netstat网路状态解读
一个正常的TCP联接,就会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手
如图:
SYN:(同步序列编号,SynchronizeSequenceNumbers)该标志仅在三次握手构建TCP联接时有效。表示一个新的TCP联接恳求。
ACK:(确认编号,AcknowledgementNumber)是对TCP恳求的确认标志,同时提示对端系统早已成功接收所有数据。
FIN:(结束标志,FINish)拿来结束一个TCP回话.但对应端口仍处于开放状态,打算接收后续数据。
LISTEN:首先服务端须要打开一个socket进行窃听,状态为LISTEN,Thesocketislisteningforincomingconnections.侦听来自远方TCP端口的联接恳求。
SYN_SENT:顾客端通过应用程序调用connect进行activeopen.于是顾客端tcp发送一个SYN以恳求构建一个联接,然后状态置为SYN_SENT,Thesocketisactivelyattemptingtoestablishaconnection.在发送联接恳求后等待匹配的联接恳求。
SYN_RECV:服务端应发出ACK确认顾客端的SYN,同时自己向顾客端发送一个SYN,然后状态置为SYN_RECV,
Aconnectionrequesthasbeenreceivedfromthenetwork.在收到和发送一个联接恳求后等待对联接恳求的确认。
ESTABLISHED:代表一个打开的联接,双方可以进行或早已在数据交互了,Thesockethasanestablishedconnection.代表一个打开的联接,数据可以传送给用户。
FIN_WAIT1:主动关掉(activeclose)端应用程序调用close,于是其TCP发出FIN恳求主动关掉联接,然后步入FIN_WAIT1状态。Thesocketisclosed,andtheconnectionisshuttingdown.等待远程TCP的联接中断恳求,或以前的联接中断恳求的确认。
CLOSE_WAIT:被动关掉(passiveclose)端TCP接到FIN后,就发出ACK以回应FIN恳求(它的接收也作为文件结束符传递给下层应用程序),并步入CLOSE_WAIT,Theremoteendhasshutdown,waitingforthesockettoclose.等待从本地用户发来的联接中断恳求。
FIN_WAIT2:主动关掉端接到ACK后,就步入了FIN-WAIT-2linux 命令 netstat,Connectionisclosed,andthesocketiswaitingforashutdownfromtheremoteend.从远程TCP等待联接中断恳求。
LAST_ACK:被动关掉端一段时间后,接收到文件结束符的应用程序将调用CLOSE关掉联接。这造成它的TCP也发送一个FIN,等待对方的ACK.就步入了LAST-ACK,Theremoteendhasshutdown,andthesocketisclosed.Waitingforacknowledgement.等待原先发向远程TCP的联接中断恳求的确认。
TIME_WAIT:在主动关掉端接收到FIN后,TCP就发送ACK包,并步入TIME-WAIT状态。Thesocketiswaitingafterclosetohandlepacketsstillinthenetwork.等待足够的时间以确保远程TCP接收到联接中断恳求的确认。
CLOSING:比较稀少,Bothsocketsareshutdownbutwestilldon’thaveallourdatasent.等待远程TCP对联接中断的确认。
CLOSED:被动关掉端在接受到ACK包后,就步入了closed的状态。联接结束,Thesocketisnotbeingused.没有任何联接状态。
TIME_WAIT状态的产生只发生在主动关掉联接的一方。主动关掉方在接收到被动关掉方的FIN恳求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2更改为TIME_WAIT,而必须再等2倍的MSL(MaximumSegmentLifetime,MSL是一个数据报在internetwork中能存在的时间)时间过后双方能够把状态都改为CLOSED以关掉联接。目前RHEL里保持TIME_WAIT状态的时间为60秒。
Linux的相关keepalive参数
1、tcp_keepalive_time–INTEGER
HowoftenTCPsendsoutkeepalivemessageswhenkeepaliveisenabled.(Default:2hours)
一个联接须要TCP开始发送keepalive侦测数据包之前的空闲时间,以秒为单位。
2、tcp_keepalive_probes–INTEGER
HowmanykeepaliveprobesTCPsendsout,untilitdecidesthattheconnectionisbroken.(Defaultvalue:9)
发送TCPkeepalive侦测数据包的最大数目,默认是9.假如发送9个keepalive侦测包后对端一直没有响应,就关闭这个联接。
3、tcp_keepalive_intvl–INTEGER
Howfrequentlytheprobesaresendout.Multipliedbytcp_keepalive_probesitistimetokillnotrespondingconnection,afterprobesstarted.Defaultvalue:75seci.e.connectionwillbeabortedafter~11minutesofretries.
发送两个TCPkeepalive侦测数据包的间隔时间,默认是75秒。
五、常用netstat相关命令
1、列出所有端口#netstat-a
2、列出所有tcp端口#netstat-at
3、列出所有udp端口#netstat-au
4、只显示窃听端口#netstat-l
5、只列举所有窃听tcp端口#netstat-lt
6、只列举所有窃听udp端口#netstat-lu
7、列出所有窃听UNIX端口#netstat-lx
8、显示所有端口的统计信息#netstat-s
9、显示TCP或UDP端口的统计信息#netstat-st或-su
10、输出中显示PID和进程名称#netstat-p
11、netstat输出中不显示主机linux命令ls,端口和用户名(host,portoruser)
当你不想让主机,端口和用户名显示,使用netstat-n。将会使用数字取代这些名称。
同样可以加速输出,由于不用进行比对查询。
#netstat-an
倘若只是不想让这三个名称中的一个被显示,使用以下命令
# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users
12、持续输出netstat信息#netstat-c
13、找出程序运行的端口#netstat-ap|grep‘:80’
14、查看联接某服务端口最多的的IP地址(前20个)
#netstat -nat | grep "10.1.62.23:443" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
15、TCP各类状态列表
#netstat-nat|awk‘{print$6}’
统计数目
#netstat-nat|awk‘{print$6}’|sort|uniq-c
排序
#netstat-nat|awk‘{print$6}’|sort|uniq-c|sort-rn
#netstat-n|awk‘/^tcp/{++S}END{for(ainS)printa,S}’
16、直接统计tcp数目窃听的数目
#netstat-ant|wc-l