2015-12-05 143 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在其接收窗口中發佈的數據更多的數據。

相關問題