netstat 命令是 linux 下一个非常有用的命令,顾名思义,其作用是查询当前的网络状态。

以最常用的查询 TCP 连接状态为例

netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

总结各状态大致意义如下:

CLOSED: 初始状态。
LISTEN: 服务端处于监听状态,可以接受连接。
SYN_SENT: 客户端连接并发送 SYN 报文,进入 SYN_SENT 状态,等待服务端确认。
SYN_RCVD: 服务端接受到了 SYN 报文,当收到客户端的 ACK 报文后,会进入到 ESTABLISHED 状态。
ESTABLISHED: 连接已经建立,进入数据传输状态。
FIN_WAIT_1: 建立连接后,其中一方请求终止连接,等待对方的 FIN 报文。
FIN_WAIT_2: 半连接,有一方要求关闭连接,但另外还告诉对方,我还有数据需要传输,稍后再关闭连接。
TIME_WAIT: 收到了对方的 FIN 报文,并发送出了 ACK 报文,2MSL 后即可回到 CLOSED 可用状态。
CLOSE_WAIT: 等待关闭。
CLOSING: 当发送 FIN 报文后,并未收到对方的 ACK 报文,却收到了 FIN 报文,表示双方都正在关闭连接。
LAST_ACK: 被动关闭一方在发送 FIN 报文后,最后等待对方的 ACK 报文。

其中 SYN_RECV、ESTABLISHED、TIME_WAIT 是对我们比较有意义的几个状态。

SYN_RECV

表示正在等待处理的请求数。SYN_RECV 过多或居高不下,可以理解为服务器并不能及时处理所有的请求。这时要考虑进行效率优化,或增加更多的服务器;

ESTABLISHED

表示正在进行数据传输的请求数。通常与在线人数和并发相关,可以作为服务器负载能力的一项指标。

TIME_WAIT

表示处理完毕,等待超时结束的请求数。若 TIME_WAIT 过多,可调整内核参数进行优化,若仍无效,则需注意是否遭到了恶意攻击。若有大量的 SYN_RECEIVED、TIME_WAIT、FIN_WAIT_1 等状态存在,而 ESTABLISHED 很少,则可初步判断存在 DDOS 攻击。

关于 TIME_WAIT

主动关闭的一方在发送最后一个 ACK 报文后,就会进入 TIME_WAIT 状态,停留 2MSL(max segment lifetime)。

TCP/IP 协议中如此设计,主要有两个原因:

1. 防止上一次连接中的包,迷路后重新出现,影响新连接。

经过 2MSL,上一次连接中所有的重复包都会消失。

2. 可靠的关闭 TCP 连接。

主动关闭方发送的最后一个 ACK(FIN) 报文,有可能丢失,这时被动方会重新发送 FIN 报文, 如果这时主动方处于 CLOSED 状态 ,就会响应 RST 报文而不是 ACK 报文。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用太多资源,除非受到恶意攻击。

优化 TIME_WAIT

通过调整内核参数,可以缓解 TIME_WAIT 过多的情况。首先打开配置文件:

vi /etc/sysctl.conf

修改以下配置:

# 表示开启 SYN cookies。当出现 SYN 等待队列溢出时,启用 cookies 来处理,可防范少量 SYN 攻击,默认为 ,表示关闭;
net.ipv4.tcp_syncookies = # 表示开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为 ,表示关闭;
net.ipv4.tcp_tw_reuse = # 表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 ,表示关闭;
net.ipv4.tcp_tw_recycle = # 修改系統默认的 TIMEOUT 时间
net.ipv4.tcp_fin_timeout =

然后执行以下命令让参数生效:

/sbin/sysctl -p

关于netstat的更多相关文章

  1. Linux下用netstat查看网络状态、端口状态(转)

    转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步.  ...

  2. Linux命令:ps,netstat,top

    ps ps用于查看当前运行的进程.如果想查看动态的进程信息,可以使用top命令.查看详细命令帮助使用man ps. ps最常用的选项组合就是ps aux: # ps aux USER PID %CPU ...

  3. linux之netstat命令

    netstat用于显示各种网络相关的信息,如网络连接,路由表接口状态(interface statistics), masquerade连接,多播成员(Multicast Memberships)等等 ...

  4. netstat相关

    1. netstat基本参数: 参数 说明 输出 -a 列出所有连接. 列出 tcp, udp 和 unix 协议下所有套接字的所有连接.然而这些信息还不够详细,管理员往往需要查看某个协议或端口的具体 ...

  5. PROC 文件系统调节参数介绍(netstat -us)

    转自:http://www.cnblogs.com/super-king/p/3296333.html /proc/net/* snmp文件 Ip: ip项 Forwarding        : 是 ...

  6. netstat

    netstat再解读 C:\Users\Administrator>netstat -nb 活动连接 协议 本地地址 外部地址 状态 TCP ESTABLISHED [mysqld.exe] T ...

  7. netstat监控大量ESTABLISHED连接与Time_Wait连接问题

    问题描述: 在不考虑系统负载.CPU.内存等情况下,netstat监控大量ESTABLISHED连接与Time_Wait连接. # netstat -n | awk '/^tcp/ {++y[$NF] ...

  8. 运维之netstat

    实用命令实例   1. 列出所有端口 (包括监听和未监听的)   列出所有端口 netstat -a # netstat -a | more Active Internet connections ( ...

  9. netstat命令

    netstat命令会罗列出当前所有的网络连接.连接统计以及路由表信息.默认情况下,netstat命令将罗列出本地计算机所有开启的端口情况,以及它所连接的外部计算机情况. 端口就像一所房子的房门一样.数 ...

  10. 查linux端口连接情况用命令netstat

    查linux端口连接情况用命令netstat netstat -apn |grep cdnbest 或netstat –apn | grep 3320

随机推荐

  1. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

  2. Python读取xml报错解析--ExpatError: not well-formed (invalid token)

    xml文件内容如代码所示存入的名字为login.xml: <?xml version="1.0" encoding="utf-8"?> <in ...

  3. cutpFTP设置步骤

    cutpFTP设置步骤 平常时为了方便两台电脑之间传送数据,我们可以使用cutpftp这个工具实现,而且cutpftp还具有定时传送的功能,非常方便使用.以下是使用该工具的“同步文件夹”功能同步两台电 ...

  4. wifi 4次握手

    转自:http://zhaoxiaobu.blog.51cto.com/878176/407130/ 不管是用WEP加密,还是用WPA,一般如果我们要和AP建立一个连接,要经过两个阶段认证(Authe ...

  5. JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)

    1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...

  6. C#委托(Action、Func、predicate)

    Predicate 泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. public delegate boo ...

  7. Installing MySQL Server on CentOS

    MySQL is an open-source relational database. For those unfamiliar with these terms, a database is wh ...

  8. 数据库字典 sql

    SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case when a.colorder=1 then isnull(f.v ...

  9. I/O复用模型之epoll学习

    简介: epoll是linux下多路复用I/O接口select/poll的增强版,它能够显著提高程序在大量并发连接中只有少量活跃的情况下的系统cpu利用率,原因是它会复用文件描述符集合来传递结果而不用 ...

  10. linux下java环境配置

    非常简单的三行命令就搞定了! $ sudo add-apt-repository ppa:webupd8team/java$ sudo apt-get update$ sudo apt-get ins ...