【发布时间】:2017-05-09 20:53:06
【问题描述】:
怎么会这样:
- 两台机器之间有一个 TCP 套接字
- 在一些成功的双向通信之后,发送方应用程序在写入套接字时卡住,而接收方在读取时卡住了
-
netstat报告发送方套接字的高 Send-Q(几兆字节)(即使等待几个小时后值也不会改变) -
netstat报告接收器上套接字的 Recv-Q 为零 -
tcpdump报告套接字上的唯一活动是周期性(每两分钟)的 ACK,没有来自发送方的数据,以及没有来自接收方的数据的即时 ACK 响应
为什么发送方机器不尝试将排队的数据发送给接收方?
【问题讨论】:
-
你没有发布任何代码,所以没有什么可做的。尝试检查当前 TCP 窗口大小的周期性 ACK(可能是 TCP keepalive)的内容。
-
是的,它必须是 TCP keepalive。每次发送方窗口大小为 40822,接收方窗口大小为 31883。
-
在接收端闻起来像一个错误,没有消耗来自套接字的所有字节。但是你没有发布任何代码,所以没有办法知道。
-
我测试了这个假设,但是当接收器应用程序无法使用传入数据时,接收器套接字上的 Recv-Q 保持在远高于预期的零以上。我没有小的或可重复的测试用例,我怀疑这个问题只发生在网络暂时丢失一些 IP 数据包时。我不寻求有关应用程序代码的帮助,因为鉴于数据位于发送方内核缓冲区中,它似乎没有错,但寻求帮助以了解似乎不可能的 Linux 内核状态。
-
@OrivejDesh 你能找到这个的根本原因吗?