在我的应用程序中,我发现偶尔会阻止对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服务器之间。
答案 0 :(得分:1)
什么可能导致TCP连接的recv缓冲区被填满?
接收方接收的速度慢于发送方正在发送。
它是如何导致我的send()调用无限期挂起的?
当接收缓冲区填满时,TCP关闭接收窗口,禁止发送方发送。发送方无法在接收窗口中发送比接收TCP通告更多的数据。
答案 1 :(得分:-1)
什么可能导致TCP连接的recv缓冲区 填补了?它是如何导致我的send()调用无限期挂起的?
如果你有send()
和recv()
一样的线程,当send()
来电被阻止时,它自然无法调用recv()
和收到的数据必须排队。因此, recv 缓冲区的填充不会导致send()
挂起 - 反之亦然。