CentOS7.9后端节点HTTP POST请求超时问题求助(TCP接收端异常ACK行为)
CentOS7.9后端节点HTTP POST请求超时问题求助(TCP接收端异常ACK行为)
各位大佬好,最近碰到一个很诡异的问题,想请大家帮忙分析下:
我们的客户端和服务端节点都是CentOS7.9/X86_64环境,HTTP POST请求的超时情况出现了明显差异:
- 直接向服务端发送请求时,只有约0.2%的概率会超时;
- 但通过客户端节点上的NGINX代理转发请求时,超时率直接飙升到了20%左右!
我已经确认过,只有这一台后端节点存在这个问题,其他后端节点哪怕在更高吞吐量下,请求成功率都是100%。
为了定位问题,我在后端节点执行了tcpdump抓包,并用Wireshark分析后发现,成功和失败请求的TCP交互行为差异很大:
- 成功请求的正常TCP交互:TCP接收端会对每个较大的TCP payload正常回复ACK,也就是按报文分段进行确认。
- 失败请求的异常TCP交互:TCP接收端对每个TCP报文只确认1398字节的payload——这个数值是MSS减去TCP/IP头后的最小payload(计算方式:
1410 - 66 = 1398)。
更关键的是,TCP发送端在60秒内重传了8次报文,但接收端再也没有回复任何ACK,最终HTTP服务因为60秒读超时关闭了连接。
另外我还做了验证:因为是在服务端节点本地抓的包,所以报文应该不是在网络链路中丢失的,大概率是在内核TCP栈里丢失了。同时在客户端节点抓包发现,客户端很快就能收到服务端返回的每个ACK(也就是前面提到的1398字节的确认包)。
有没有大佬遇到过类似的情况?麻烦帮忙指点下排查方向,提前感谢大家!
备注:内容来源于stack exchange,提问作者qdongxu
相关产品推荐
相关产品推荐

