您的位置:首页 > 运维架构 > Linux

详解linux netstat输出的网络连接状态信息

2013-08-22 11:02 731 查看
本博文为老男孩linu培训机构早期的培训教案,特分享以供大家学习参考。
全部系列分为五篇文章,本博文为第一篇:
目录:
一、生产服务器netstat tcp连接状态................................................................................ 21.1生产服务器某个业务LVS负载均衡上连接状态数量............................................... 21.2生产服务器某个业务web上连接状态数量............................................................ 31.3 生产服务器某个业务db上连接状态数量.............................................................. 3二、tcp连接状态的描述说明(netstat输出)........................................................................ 42.1 执行netstat -n查看输出结果共6列..................................................................... 42.2 通过man netstat查看netstat输出结果信息......................................................... 42.3netstat第六列State的状态信息......................................................................... 52.4netstat第六列State状态信息转换图表.............................................................. 62.4.1 状态参考图一................................................................................................... 72.4.2 状态参考图二................................................................................................... 92.4.3 状态参考图三................................................................................................. 102.4.4 客户端的状态变化描述............................................................................ 102.4.5 服务器的状态变化描述............................................................................ 102.4.6 其他的状态变化描述总结......................................................................... 11 更多目录见博文结尾。

一、生产服务器netstat tcp连接状态

1.1生产服务器某个业务LVS负载均衡上连接状态数量

[oldboy@LVS-1-1 ~]$ netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'TIME_WAIT 9137CLOSE_WAIT 207FIN_WAIT1 547ESTABLISHED 597FIN_WAIT2 74SYN_RECV 70CLOSING 55LAST_ACK 8[root@lvs_nginx~]#netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 422
CLOSE_WAIT 590
FIN_WAIT1 56
FIN_WAIT2 28
ESTABLISHED 1731

1.2生产服务器某个业务web上连接状态数量

[root@web1 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 418
FIN_WAIT1 7
FIN_WAIT2 3
ESTABLISHED 1097
LAST_ACK 2

[root@web2 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 250
FIN_WAIT1 2
FIN_WAIT2 3
ESTABLISHED 1032
LAST_ACK 2

[root@old_web ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 342
CLOSE_WAIT 618
FIN_WAIT1 37
FIN_WAIT2 3
ESTABLISHED 1681
SYN_RECV 1[root@K32_50718 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'TIME_WAIT 4146FIN_WAIT1 352FIN_WAIT2 1112ESTABLISHED 8451SYN_RECV 186CLOSING 9LAST_ACK 102

1.3 生产服务器某个业务db上连接状态数量

[root@web_slave ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
TIME_WAIT 263
FIN_WAIT1 1
FIN_WAIT2 48
ESTABLISHED 918

二、tcp连接状态的描述说明(netstat输出)

2.1 执行netstat -n查看输出结果共6列

[root@OLDBOY ~]# netstat -n Active Internet connections (w/o servers)Proto Recv-Q Send-Q Local AddressForeign AddressStatetcp00 10.0.0.183:5058410.0.0.181:22ESTABLISHED

2.2 通过man netstat查看netstat输出结果信息

[root@oldboy ~]# man netstat OUTPUTActive Internet connections (TCP, UDP, raw)ProtoThe protocol (tcp, udp, raw) used by the socket.第一列为socket使用的协议。Recv-QThe count of bytes not copied by the user program connected to this socket.第二列为接到的但是还没处理的字节数。Send-QThe count of bytes not acknowledged by the remote host.第三列为已经发送的但是没有被远程主机确认收到的字节数。Local AddressAddress and port number of the local end of the socket.Unless the --numeric(-n)optionisspecified,thesocketaddress is resolved to its canonical host name(FQDN), and the port number is translated into the corresponding service name.第四列为 本地的地址及端口。Foreign AddressAddress and port number of the remote endofthesocket.Analogousto"Local Address."第五列为外部的地址及端口。StateThestateofthesocket.Sincethere are no states in raw mode and usually nostates used in UDP, this column may be left blank. Normally this can be one of sev-eral values:第六列为socket的状态,通常仅仅有tcp的状态,状态值可能有ESTABLISHED,SYN_SENT,SYN_RECV FIN_WAIT1,FIN_WAIT2,TIME_WAIT等,详见下文。其中,最重要的是第六列。

2.3 netstat第六列State的状态信息

如果我们执行man netstat可以找到如下的帮助信息StateThestateofthesocket.Sincethere are no states in raw mode and usually nostates used in UDP, this column may be left blank. Normally this can be one of sev-eral values:第六列为socket的状态,通常仅仅有tcp的状态,状态值可能有ESTABLISHED,SYN_SENT,SYN_RECV FIN_WAIT1,FIN_WAIT2,TIME_WAIT等,详见下文。其中,最重要的是第六列。ESTABLISHEDThe socket has an established connection.socket已经建立连接,表示处于连接的状态,一般认为有一个ESTABLISHED认为是一个服务的并发连接。这个连接状态在生产场景很重要,要重点关注。SYN_SENTThe socket is actively attempting to establish a connection. socket正在积极尝试建立一个连接,即处于发送后连接前的一个等待但未匹配进入连接的状态。SYN_RECVA connection request has been received from the network.已经从网络上收到一个连接请求。FIN_WAIT1The socket is closed, and the connection is shutting down. socket已关闭,连接正在或正要关闭。FIN_WAIT2Connectionisclosed,andthesocket is waiting for a shutdown from the remote end.连接已关闭,并且socket正在等待远端结束。TIME_WAITThe socket is waiting after close to handle packets still in the network.socket正在等待关闭处理仍在网络上的数据包,这个连接状态在生产场景很重要,要重点关注。CLOSED The socket is not being used.| socket不在被占用了。CLOSE_WAITThe remote end has shutdown, waiting for the socket to close.远端已经结束,等待socket关闭。LAST_ACKThe remote end has shut down, and the socket is closed. Waiting for acknowl-edgement.|远端已经结束,并且socket也已关闭,等待acknowl-edgement。LISTEN Thesocketislisteningforincoming connections.Such sockets are notincluded in the output unless you specify the --listening (-l) or --all (-a)option.socket正在监听连接请求。CLOSINGBoth sockets are shut down but we still don’t have all our data sent.sockets关闭,但是我们仍旧没有发送数据。UNKNOWNThe state of the socket is unknown未知的状态。

2.4 netstat第六列State状态信息转换图表

TCP的状态图,这是一个看起来比较复杂的状态迁移图,因为它包含了两个部分---服务器的状态迁移和客户端的状态迁移,如果从某一个角度出发来看这个图,就会清晰许多,这里面的服务器和客户端都不是绝对的,发送数据的就是客户端,接受数据的就是服务器。

2.4.1 状态参考图一
见后续博文

2.4.2 状态参考图二

见后续博文

2.4.3 状态参考图三

见后续博文

2.4.4 客户端的状态变化描述

通过状态参考图三,客户端的状态可以用如下的流程来表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程序正常的情况下应该有的流程,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。

2.4.5 服务器的状态变化描述

通过状态参考图三,服务器的状态可以用如下的流程来表示:
CLOSED->LISTEN->SYN_RECVD->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。

2.4.6 其他的状态变化描述总结

针对服务器和客户端两方面的总结如下1)LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。2)SYN_SENT->SYN_RECVD,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都会发送SYN的ACK数据报并把自身状态调整到SYN_RECVD,准备进入ESTABLISHED 3)SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。4)SYN_RECVD->LISTEN,如果受到RST包,会返回到LISTEN状态。5)SYN_RECVD->FIN_WAIT_1,这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。

本文未完待续。更多博文内容:
本系列博文完整内容共5篇:
第一篇:详解linux netstat输出的网络连接状态信息
http://oldboy.blog.51cto.com/2561410/1184139
第二篇:庖丁解牛获取连接状态数的awk数组命令
http://oldboy.blog.51cto.com/blog/2561410/1184165
第三篇:awk数组命令经典生产实战应用拓展
http://oldboy.blog.51cto.com/blog/2561410/1184177
第四篇:老男孩培训第八节课前awk考试题案例(门户面试题解答)
http://oldboy.blog.51cto.com/2561410/1184206
第五篇:linux生产服务器有关网络状态的优化措施(告一段落)
http://oldboy.blog.51cto.com/2561410/1184228

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息