首页 > 解决方案 > TCP:Linux 内核停止代表我的程序套接字处理 ACK

问题描述

我有一个长时间运行的进程正在侦听 TCP 套接字并在 Linux 下运行。经过几周的运行,它神秘地停止了处理入站连接。经过调查,我发现对于每个连接,远程端都会发送一个 SYN 数据包,我的系统会以 SYN/ACK 响应该数据包。然后远端发送一个ACK来完成三次握手并尝试发送数据。

然而,我的一端从不 ACK 任何这些数据包,而是继续重新传输 SYN/ACK,远程端以重复的 ACK 响应,但我的端再次忽略它。过程重复了一段时间,最后我方发出了 RST。

如果不是因为数据包捕获是在运行我的进程的同一台机器上进行的,我会认为网络上存在数据包丢失并且从未收到远程 ACK,内核的行为就好像这是真的,但很明显ACK 将如wireshark 所示到达。

除了表现得好像它没有看到 ACK 之外,我在 Wireshark 中看到的唯一其他奇怪之处(附截图)是我的出站 TCP 数据包有错误的校验和,但我相信这只是因为我正在使用 PCAP系统和校验和计算稍后完成。

重新启动该过程使一切再次正常工作。

我的问题是什么可能导致这种情况发生,我可以在我的程序中进行哪些更改以防止这种情况发生?这似乎是内核内部的低级别问题,我不确定用户空间中可能出现什么问题

Wireshark 截图

标签: linuxtcpnetwork-programming

解决方案


推荐阅读