linux - TCP:Linux 内核停止代表我的程序套接字处理 ACK
问题描述
我有一个长时间运行的进程正在侦听 TCP 套接字并在 Linux 下运行。经过几周的运行,它神秘地停止了处理入站连接。经过调查,我发现对于每个连接,远程端都会发送一个 SYN 数据包,我的系统会以 SYN/ACK 响应该数据包。然后远端发送一个ACK来完成三次握手并尝试发送数据。
然而,我的一端从不 ACK 任何这些数据包,而是继续重新传输 SYN/ACK,远程端以重复的 ACK 响应,但我的端再次忽略它。过程重复了一段时间,最后我方发出了 RST。
如果不是因为数据包捕获是在运行我的进程的同一台机器上进行的,我会认为网络上存在数据包丢失并且从未收到远程 ACK,内核的行为就好像这是真的,但很明显ACK 将如wireshark 所示到达。
除了表现得好像它没有看到 ACK 之外,我在 Wireshark 中看到的唯一其他奇怪之处(附截图)是我的出站 TCP 数据包有错误的校验和,但我相信这只是因为我正在使用 PCAP系统和校验和计算稍后完成。
重新启动该过程使一切再次正常工作。
我的问题是什么可能导致这种情况发生,我可以在我的程序中进行哪些更改以防止这种情况发生?这似乎是内核内部的低级别问题,我不确定用户空间中可能出现什么问题
解决方案
推荐阅读
- excel - 在 VBA 中创建指向特定 powerpoint 幻灯片的单个超链接而不覆盖
- laravel - Laravel Auth 简单 API 总是返回 Unauthorized 401 错误
- javascript - Discord.js 错误 [TOKEN_INVALID]:提供了无效的令牌
- docker - 如何在不知道原始入口点的情况下运行 Docker 预入口点命令?
- c# - 如何在 c# 控制器中将对象作为字符串列表传递?
- javascript - 如何返回输入的动态值?
- c# - ASP.NET Core 3.1 MVC 中的种子数据库 AspNetUserRoles 表
- deep-learning - pytorch 到 Onnx(OCR 模型)
- database - 递归地从文档中获取值
- ansible - ansible - 显示警告“条件语句不应包含 jinja2 模板分隔符”