我收到代理服务器返回的零星 502。检查数据包流时,我看到 nginx 向原始服务器已发送 [FIN,ACK] 的套接字发送 POST 请求。我想了解这怎么可能以及任何潜在的解决方案。是源的问题(它仅在发送响应后 5 秒后才发送 FIN、ACK)还是代理的问题?
我的理解:
- 来自源的响应是 [PSH, ACK];
- 代理为使用该 [P.] 接收的数据发送一个 [ACK](wireshark 确认下一个 [ACK] 是针对之前收到的 [PSH-ACK]);
- 7 秒过去了(注意时间戳 btw/ [FIN, ACK] 和我们的 POST ([PSH, ACK]));
- origin 发送一个 [FIN, ACK]。当发送第一个 [FIN, ACK] 时,源 TCP 状态机应该处于 FIN_WAIT_1 状态。
- 然后我们发送另一个 POST 导致 [RST] 作为回报,因为源不期望 [PSH, ACK]。
问题:
- 这种情况的可能解释是什么?
- 如果代理 (nginx) 已经收到 FIN 并且实际上正在确认它,为什么还要发送另一个请求!(POST [PSH, ACK] 数据包中的 ack 号实际上是 [FIN,ACK] 的 SEQ_NUMBER + 1 - 所以它是在确认幻位 FIN。
- 来源仅在 5 秒后而不是立即返回 [FIN,ACK] 的可能原因是什么?读取超时/空闲超时?
我不拥有原产地 - 所以无法在那里捕获。
额外细节:
代理上的错误日志(nginx错误日志):
2017/04/17 06:51:07 [error] 123091#0: *225010841 upstream prematurely closed connection while reading response header from upstream, client: X.90.10, server: www.example.com, request: "POST /web/?a=b HTTP/1.1", upstream: "http://X.32.238:80/web/?a=b", host: "www.example.com"
此屏幕截图中显示了最后一个请求的 SEQ 和 ACK 编号: