![为什么我的 Http 代理在收到客户端的 [SYN] 数据包后不回复 [SYN,ACK]?](https://linux22.com/image/24079/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%20Http%20%E4%BB%A3%E7%90%86%E5%9C%A8%E6%94%B6%E5%88%B0%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%20%5BSYN%5D%20%E6%95%B0%E6%8D%AE%E5%8C%85%E5%90%8E%E4%B8%8D%E5%9B%9E%E5%A4%8D%20%5BSYN%2CACK%5D%EF%BC%9F.png)
我有一个在 Linux (RHEL 5.5) 上运行的 http 代理,在收到来自客户端的 [SYN] 数据包后,它间歇性地不回复 [SYN,ACK] 数据包。此问题可以通过重新启动代理来恢复。我针对代理进程运行了 gstack,但是每个线程的堆栈没有表明任何问题(挂起)。在此问题期间,只有不到 100 个连接处于“SYN_RECV”状态。
有任何想法吗?对于这样的问题,我应该从哪里开始调试呢?
任何建议将不胜感激。
答案1
缺少SYN、ACK通常表明服务器软件没有accept
连接。这可能是由于多种原因造成的,很可能是某种资源耗尽。您可以尝试strace
服务器进程查看它是否在accept
系统调用中,或者等效地在文件描述符中对服务器套接字执行一些select
操作以供选择。poll
答案2
看起来像是防火墙问题。如果 TCP 连接收到第一个 SYN + ACK 响应,则很可能您的数据包没有发送到代理服务器。
检查服务器端和客户端。