Recv-Q 和 Send-Q 的使用

Posted

技术标签:

【中文标题】Recv-Q 和 Send-Q 的使用【英文标题】:Use of Recv-Q and Send-Q 【发布时间】:2016-07-27 18:40:02 【问题描述】:

netstat 输出中的 Recv-Q 和 Send-Q 列有什么用?如何在现实场景中使用它?

在我的系统上,两列始终显示为零。这是什么意思?

【问题讨论】:

【参考方案1】:

来自我的手册页:

Recv-Q

已建立:用户程序未复制的字节数 连接到这个套接字。

Listening:从 Kernel 2.6.18 开始,此列包含当前的 syn 积压。

发送-Q

已建立:远程未确认的字节数 主持人。

侦听:自 Kernel 2.6.18 起,此列包含最大大小 同步积压。

如果您将其设置为 0,这仅表示您的应用程序,在连接的两端,以及它们之间的网络,都运行良好。实际的瞬时值可能与 0 不同,但以一种瞬息万变的方式,您没有机会实际观察到它。

可能与 0 不同的实际场景示例(在已建立的连接上,但我想你会明白的):

我最近在一个 Linux 嵌入式设备上工作,该设备与一个(设计不佳的)第三方设备通信。在这个第三方设备上,应用程序有时明显卡住了,没有读取它在 TCP 连接上接收到的数据,导致它的 TCP 窗口下降到 0 并停留在那里数十秒(通过wireshark 在镜像端口上观察到的现象) 2 台主机)。在这种情况下:

Recv-Q: 在第三方设备上运行 netstat(我没有 意思是做)可能显示 Recv-Q 增加,达到某个屋顶值 另一方(我)停止发送数据,因为窗口得到 降至 0,因为应用程序不读取可用的数据 它的套接字,这些数据在 TCP 实现中保持缓冲 操作系统,不去卡住的应用程序 -> 从接收器 方面,应用程序问题。

Send-Q:my 端运行 netstat(我没有尝试,因为 1/ 问题从wireshark 很清楚,是上面的第一个案例 并且 2/ 这不是 100% 可重现的)可能显示非零 send-Q,if对方在OS层面的TCP实现有 被卡住并停止确认我的数据-> 来自发件人 方面,接收 TCP 实现(通常在操作系统级别)问题。

请注意,上面描述的 Send-Q 场景也可能是发送方问题(我的一方)如果我的 Linux TCP 实现行为不端,并在 TCP 窗口下降到 0 后继续发送数据: 接收方没有更多空间容纳这些数据 -> 不确认。

另请注意,Send-Q 问题可能不是由接收方引起的,而是由发送方和接收方之间的某个路由问题引起的。一些数据包在两台主机之间“动态”,但尚未确认。 另一方面,Recv-Q 问题肯定是在主机上: 数据包已收到,已确认,但尚未从应用程序读取。

编辑:

在现实生活中,正如您可以合理预期的那样,使用非蹩脚的主机和应用程序,我敢打赌,Send-Q 问题大部分时间是由发送之间的一些路由问题/网络性能不佳引起的和接收方。永远不要忘记数据包的“on the fly”状态:

数据包可能在发送方和接收方之间的网络上,

(或收到但尚未发送ACK,见上文)

或者 ACK 可能在接收方和发送方之间的网络上。

发送数据包然后进行 ACK 需要 RTT(往返时间)。

【讨论】:

您是否知道对于较新的ss 命令和较旧的netstat 命令的定义是否相同?我猜他们是,但我为 ss 提供的手册页并没有说明他们的意思。也许如果它们相同,我们可以更新上面的 Q。谢谢【参考方案2】:

接受的答案@jbm。

Listening:从 Kernel 2.6.18 开始,此列包含当前的 syn 积压。 Listening:从 Kernel 2.6.18 开始,此列包含 syn backlog 的最大大小。

它们不是同步积压,它们是监听积压。

【讨论】:

以上是关于Recv-Q 和 Send-Q 的使用的主要内容,如果未能解决你的问题,请参考以下文章

ss命令和Recv-Q和Send-Q状态

netstat Recv-Q和Send-Q详解

在 Windows 中获取 Recv-Q/Send-Q?

Recv-Q&Send-Q

Linux netstat命令详解

1024个读出线程的测试结果