TCP连接的高Recv-Q的原因是什么?

时间:2015-12-05 17:26:41

标签: sockets tcp amqp netstat

在我的应用程序中,我发现偶尔会阻止对TCP连接的send()调用。每当发生这种情况时,TCP netstat输出的TCP连接的Recv-Q非常高:

tcp   314238      0 10.8.8.21:47302         10.8.8.11:5672          ESTABLISHED
tcp   313276      0 10.8.8.21:47294         10.8.8.11:5672          ESTABLISHED

什么可能导致TCP连接的recv缓冲区被填满?它是如何导致send()调用无限期挂起的?

P.S。这可能相关也可能不相关,此TCP连接位于我的应用程序和RabbitMQ服务器之间。

2 个答案:

答案 0 :(得分:1)

  

什么可能导致TCP连接的recv缓冲区被填满?

接收方接收的速度慢于发送方正在发送。

  

它是如何导致我的send()调用无限期挂起的?

当接收缓冲区填满时,TCP关闭接收窗口,禁止发送方发送。发送方无法在接收窗口中发送比接收TCP通告更多的数据。

答案 1 :(得分:-1)

  

什么可能导致TCP连接的recv缓冲区   填补了?它是如何导致我的send()调用无限期挂起的?

如果你有send()recv()一样的线程,当send()来电被阻止时,它自然无法调用recv()和收到的数据必须排队。因此, recv 缓冲区的填充不会导致send()挂起 - 反之亦然。