Netstat 中 Recv-Q和Send-Q状态


原文链接: Netstat 中 Recv-Q和Send-Q状态

1.使用netstat命令,用来显示各种网络信息,比如网络连接、端口号、协议、状态、进程ID等信息;

   使用lsof命令,用来显示当前系统打开文件的信息,因为包括端口和网络状态在linux和mac中都属于文件,所以系统也为它们分配了文件描述法fd。

2.在Linux上面使用的方法通常为:netstat -nltp,参数含义为:查询TCP协议写Listen的信息

    -a (all)显示所有选项,默认不显示LISTEN相关
   -t (tcp)仅显示tcp相关选项
   -u (udp)仅显示udp相关选项
   -n 拒绝显示别名,能显示数字的全部转化成数字。
   -l 仅列出有在 Listen (监听) 的服務状态

   -p 显示建立相关链接的程序名
   -r 显示路由信息,路由表
   -e 显示扩展信息,例如uid等
   -s 按各个协议进行统计
   -c 每隔一个固定时间,执行该netstat命令

3.但是在Mac上执行该命令,会报如下的错误

4.在Mac上正确使用的方法是:即-f需要加上地址族,-p需要加上协议TCP或者UDP等

     netstat [-AaLlnW] [-f address_family | -p protocol]
     netstat [-gilns] [-v] [-f address_family] [-I interface]
     netstat -i | -I interface [-w wait] [-c queue] [-abdgqRtS]
     netstat -s [-s] [-f address_family | -p protocol] [-w wait]
     netstat -i | -I interface -s [-f address_family | -p protocol]
     netstat -m [-m]
     netstat -r [-Aaln] [-f address_family]
     netstat -rs [-s] 

   a)如果需要查询inet,netstat -anvf inet

   b)如果需要查询TCP, netstat -anvp tcp

   b)如果需要查询UDP,netstat -anvp udp

实时监控网络状态:

watch -n 1 netstat -ant

执行命令查看当前网络状态时候发现,执行了命令 netstat -anp

b1发现recv-q 和 send-q 状态不是很正常,对这2个参数不了解,特意学习了一下,简单总结如下:

recv-Q 表示网络接收队列
表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()
如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。

send-Q 表示网路发送队列
对方没有收到的数据或者说没有Ack的,还是本地缓冲区.
如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。

这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。

从图中可以看到是大量的 send-Q ,可以判定是发送数据给目的地址的时候出现了阻塞的问题,导致了包堆积在本地缓存中,不能成功发出去。那么问题就产生在了客户端,根据公司的业务逻辑发现是客户端发送的TCP长连接数量过多。验证办法,尝试减少客户端和服务的长连接.查看效果

alt text

alt text

alt text

alt text

alt text

alt text

`