你们好,又碰面了,我是大家的同事全栈君。

一、介绍

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:显示套插口当前的状态。

linux 命令 netstat_netstat输出信息详解_netstat命令使用方法

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四次挥手

如图:

linux 命令 netstat_netstat命令使用方法_netstat输出信息详解

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

netstat输出信息详解_netstat命令使用方法_linux 命令 netstat

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

netstat输出信息详解_linux 命令 netstat_netstat命令使用方法

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

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复