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 的使用的主要内容,如果未能解决你的问题,请参考以下文章