netstat 和 ss中,Recv-Q和Send-Q的含义

先看看文档,man netstat中有Recv-Q和Send-Q的含义;man ss中没有Recv-Q和Send-Q的含义

https://man7.org/linux/man-pages/man8/netstat.8.html

https://man7.org/linux/man-pages/man8/ss.8.html

man netstat是这么说的

   Recv-Q
       Established: The count of bytes not copied by the user program connected to this socket.
       Listening: Since Kernel 2.6.18 this column contains the current syn backlog.

   Send-Q
       Established: The count of bytes not acknowledged by the remote host.
       Listening: Since Kernel 2.6.18 this column contains the maximum size of the syn backlog.

 

先说我的结论

一:Established时

netstat和ss 都

Recv-Q:“OS持有的,尚未交付给应用的 数据的 字节数

Send-Q:“已经发送给对端应用,但,对端应用尚未ack的 字节数。此时,这些数据依然要由OS持有”

 

二:Listen时

ss的Recv-Q:“已建立成功(状态为ESTABLISHED),但,尚未交付给应用的” tcp连接的数量

该值最大为:Send-Q+1,即:min(backlog, somaxconn)+1。

之所以加1,是因为OS内核在判断队列是否已满时,用的是>(应该用>=),这导致当已创建成功的连接数量正好等于min(backlog, somaxconn)时,还会再多创建一个tcp连接,最终结果就是:min(backlog, somaxconn)+1

见:https://segmentfault.com/a/1190000019252960

ss的Send-Q:listen时,backlog的大小。其值为min(backlog, somaxconn)

 

netstat的Recv-Q :含义同ss的Recv-Q

netstat的Send-Q: 尽管文档中说是"Since Kernel 2.6.18 this column contains the maximum size of the syn backlog",但,实验中看不出来

 

我们做下面实验验证下。使用的条件如下

  1. uname -a
    Linux vm204 5.4.0-47-generic #51~18.04.1-Ubuntu SMP Sat Sep 5 14:35:50 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
  2. http接口直接sleep 3600s
  3. tomcat只有1个处理线程
  4. tomcat的acceptCount==5
  5. tomcat的maxConnections==7
  6. 利用JMeter,发送9个请求
    @RequestMapping("/greeting")
    public @ResponseBody
    String greeting(HttpServletResponse rsp, @RequestParam(name = "cost") long cost) {
        try {
                Thread.sleep(cost * 1000L);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
        LOG.info(format);
        return format;
    }

 

此时,看到的情况


最大连接数量为:

maxConnections + ( min(acceptCount, somaxconn) + 1 ) == 7 + ( min(5, 4096) + 1 ) == 7+ ( 5+1 ) == 13

 

即:从上图可以看到:

我们只要求建立 9 个连接(JMeter使用9个线程做请求),由于maxConnections==7,于是tomcat只能收到 7 个连接

  1. 还有9-7==2个连接,已经创建成功但由OS代为持有,所以:netstat和ss 的Recv-Q都显示2
  2. tomcat的backlog为5(即:acceptCount为5),所以:ss 的Send-Q显示5(netstat的Send-Q,实验不出来)

OK,上面是Listen状态时,Recv-Q和Send-Q的含义

Established状态时的实验见这里:netstat输出中Established时Recv-Q

### Linux `netstat`命令中的 `-o` 选项 在Linux环境中执行带有 `-o` 参数的 `netstat` 命令会增加输出信息,特别是关于每个连接的状态计时器的信息。此功能对于监控TCP连接状态特别有用,能够帮助管理员了解特定连接保持当前状态的时间长度。 当使用 `-o` 选项时,`netstat` 的输出将会包含额外的一列名为 `Timer` 或者类似的字段[^1]。这一列提供了有关套接字定时器的信息,有助于理解连接何时会被关闭或重新打开。例如: ```bash [root@test ~]# netstat -ntopo Proto Recv-Q Send-Q Local Address Foreign Address State Timer tcp 0 0 192.168.1.1:22 192.168.1.100:54321 ESTABLISHED on (0.00/0/0) ``` 在这个例子中,最后一列表明了该连接处于活动状态,并且给出了与这个状态关联的超时时间。如果连接是非活动的,则可能会看到不同的定时器值,比如 `keepalive`, `retransmit` 等等,这取决于具体的场景配置[^2]。 值得注意的是,在某些较新的Linux发行版中,官方建议逐渐转向使用更现代的工具如 `ss` 来替代传统的 `netstat` 工具集,因为这些新工具通常提供更好的性能支持更多的特性[^3]。 #### 使用实例 为了展示如何实际应用 `-o` 选项,下面是一个简单的命令及其可能产生的部分输出: ```bash [root@test ~]# netstat -tnop | head -n 3 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd off (0.00/0/0) ``` 这里可以看到不仅有标准的五元组(协议、接收队列大小、发送队列大小、本地地址端口组合、远程地址端口组合),还有进程ID/名称以及最重要的定时器信息。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值