我在服务器上192.168.0.2
,想要进行 HTTP 调用192.168.0.1
(两个服务器都是 RPi 并运行 Linux(raspbian))。
curl -XGET http://192.168.0.1:8081/api
上的 API 192.168.0.1
(我正在调用)是我的(基于 的 Python 脚本bottle
),大多数时候都可以正常工作。HTTP 监听部分有时会莫名其妙地挂起,导致curl
上面的调用挂起,然后超时。
tcpdump
当 API 无响应时,我在 192.168.0.1(接收服务器,托管 API 的服务器)上运行,wireshark
分析显示在发起调用后立即进行了一些重新传输:
这种行为通常由什么原因造成?(如果存在“通常”的原因)。
注 1:如果需要,我将修改 API,以便它为 Web 服务器部分记录更多数据,但由于挂起的不可重现性,我怀疑这不是它的错(其他部分(线程)运行良好,并且没有任何线程崩溃)。
注2:重新启动服务器(也可能重新启动脚本本身(我不会这样做,因为我宁愿重新启动机器))可以解决问题。
答案1
带有 PSH、ACK 标志的一系列重传意味着什么(以及虚假重传)?
这种行为通常由什么原因造成?(如果存在“通常”的原因)。
PSH ACK Wireshark 跟踪
(另见ServerFault-我的连接期间的 PHA ACK)
ACK 表示发送带有 ACK 的数据包的机器正在确认从另一台机器收到的数据。在 TCP 中,一旦建立连接,双方发送的所有数据包都将包含 ACK,即使它只是重新确认已经确认的数据。
PSH 是发送方发出的指示,如果接收方机器的 TCP 实现尚未将收到的数据提供给读取数据的代码(程序或程序使用的库),则它应该在此时这样做。引用 TCP 的官方规范 RFC 793:
连接上流动的数据可以看作是八位字节流。发送用户在每个 SEND 调用中通过设置 PUSH 标志来指示是否应立即将该调用(以及任何先前调用)中的数据推送给接收用户。
发送方 TCP 可以从发送方用户处收集数据,并根据自己的方便分段发送该数据,直到推送功能发出信号,然后它必须发送所有未发送的数据。当接收方 TCP 看到 PUSH 标志时,它必须立即将数据传递给接收进程,而不必等待发送方 TCP 发送更多数据。
虚假重传
如果您看到虚假重传,则意味着发送方认为数据包已丢失并再次发送,即使接收方已为其发送了确认数据包。
可能的原因
- 服务器和客户端计算机之间的配置错误
- TCP 数据包跳转路径上任何发送方和接收方之间的配置错误
- 防火墙规则或数据包过滤器阻止数据包
附加故障排除
- 发生这种情况时检查服务器日志
- 在服务器上使用 Wireshark 运行 TCP 跟踪,以查看问题发生时这些数据包的样子