![strace 日志中不存在的 TCP 数据包](https://linux22.com/image/636946/strace%20%E6%97%A5%E5%BF%97%E4%B8%AD%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%20TCP%20%E6%95%B0%E6%8D%AE%E5%8C%85.png)
有人可以给我提供有关以下情况的想法(Linux 2.6.18-348.4.1.el5):
- 在某些时候,tcpdump 显示从服务器端口发送到本地客户端的 [FIN, ACK] 数据包
- strace 日志显示此刻该端口的套接字句柄上没有执行任何套接字活动(strace 日志正确显示了该客户端的其余通信)
- 防火墙和 SELinux 已停止
- 在复杂条件下,问题 100% 可重现,需要服务器执行网络请求以对另一个客户端连接进行 Kerberos 身份验证。
哪些潜在原因可能导致 tcpdump 显示 strace 中丢失的数据包?这更像是服务器问题、TCP 设置问题还是某些防火墙服务问题?
答案1
某些因素触发了服务器端的连接关闭。最有可能是远程服务器上的应用程序关闭了连接。可能的原因是服务器上的空闲断开功能、软件错误等。
如果远程服务器位于 NAT 之后,则也可能是由于执行 NAT 的设备中的 NAT 条目过期造成的。
您应该tcpdump
在服务器上运行并查看FIN
数据包是否来自该服务器。如果是,那么罪魁祸首可能是应用程序。如果不是,那么它来自防火墙。
答案2
卡斯珀德说得对strace 不显示进程的所有线程(不知怎的,我确信附加到进程将监视所有线程)。因此 auditd 确认是我的应用程序关闭了套接字(因为发生了一些神秘的“信号 33”,并且 recv() 不能正确处理 EINTR。我会就此提出另一个问题)。