netstat的输出中Recv-Q和Send-Q列的用途是什么?在实际情况下如何使用它?

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

最佳答案

从我的手册页:



如果您将其设置为0,则仅表示连接两侧的应用程序以及它们之间的网络都正常。实际的即时值可能不同于0,但是以一种 transient ,逃逸的方式,您没有机会实际观察到它。

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

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

  • Recv-Q:在第三方设备上运行netstat(我没有
    的意思)可能会显示Recv-Q有所增加,直至达到一定的屋顶值(value)
    另一端(我)停止发送数据的位置,因为该窗口
    降至0,因为应用程序不会读取以下位置上的可用数据
    它的套接字,并且这些数据保留在TCP实现中的缓冲中
    操作系统,而不是从接收器转到卡住的应用程序->
    方面,应用程序问题。
  • 发送-Q:在我的一边运行netstat(我没有尝试过,因为
    1/这个问题从wireshark很明显,并且是上面的第一种情况
    和2/这不是100%可复制的)可能显示为非零
    Send-Q,如果操作系统级别的另一端TCP实现具有
    被卡住并停止确认我的数据->来自发件人
    方面,收到TCP实现(通常在OS级别)问题。

  • 请注意,如果我的Linux TCP实现行为异常并且在TCP窗口降至0后仍继续发送数据,则上述Send-Q场景也可能是发送方的问题(我这边):接收方没有更多空间此数据->不确认。

    还请注意,Send-Q问题可能不是由接收方引起的,而是由发送方和接收方之间某处的路由问题引起的。有些数据包在2个主机之间“运行中”,但尚未确认。另一方面,Recv-Q问题明确地在主机上发生:已接收,已确认但尚未从应用程序读取的数据包。

    编辑:

    在现实生活中,如您合理预期的那样,如果主机和应用程序不灵活,我敢打赌,Send-Q问题大部分时间是由于发送方和接收方之间的某些路由问题/网络性能不佳引起的。永远不要忘记数据包的“运行中”状态:
  • 数据包可能在发送方和接收方之间的网络上
  • (或已收到,但尚未发送ACK,请参见上文)
  • 或ACK可能在接收方和发送方之间的网络上。

  • 发送数据包然后进行确认需要RTT(往返)。

    关于linux - 使用Recv-Q和Send-Q,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36466744/

    10-15 14:06