2015-12-05 135 views
2

在我的申请,我发现我的send()一个TCP连接上电话偶尔封锁。每当出现这种情况,TCP连接的Recv-Q是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缓冲区被填满?它是如何导致我的呼叫无限期地挂起?

p.s.这可能也可能不相关,这个TCP连接在我的应用程序和RabbitMQ服务器之间。

+0

的Recv缓冲器将填满,当你的应用程序不会从插座的同时阅读。但它不应该影响从您的结束发送。你能检查对面发生了什么吗? BTW这里的Recv-Q的一些有用的提示和情景和发送-Q具有非零值:http://stackoverflow.com/questions/36466744/use-of-recv-q-and-send-q – ffeast

+0

@ffeast当然这会影响发送。 TCP将关闭接收窗口,于是发送者必须停止发送。 RFC 793. – EJP

回答

-1

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

前提是你有相同的线程调用send()recv(),当它被挡在send()调用,它自然不会去调用recv()和接收到的数据必须排队。因此,它不是的recv缓冲器的填充造成send()挂起 - 这是另一种方式圆。

+0

OP中没有关于发送和接收在同一个进程中发生的事情,更不用说同一个线程。最后一句完全不正确:发送缓冲区已满不能导致'recv()'挂起。 – EJP

+0

@EJP - OP中没有关于发送和接收在不同进程中发生的事情。此外,我没有明确限定我的回答对执行与_Provided是...... _我所描述的情况相同的线程的情况下,不发送缓冲区已满引起'的recv()'挂,但挂的'送()'导致'recv()'不被调用。也许你会考虑这个解释来重新阅读我的答案。 – Armali

0

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

接收机接收除发送者慢正在发送。

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

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

相关问题