带有 PSH、ACK 标志的重传序列是什么意思(以及虚假的重传返回)?

WoJ*_*WoJ 7 networking linux wireshark tcpdump

我在服务器上192.168.0.2,想对192.168.0.1(两台服务器都是 RPis 并运行 Linux (raspbian))进行 HTTP 调用。

curl -XGET http://192.168.0.1:8081/api
Run Code Online (Sandbox Code Playgroud)

API 192.168.0.1(我正在调用)是我的(基于 的 Python 脚本bottle)并且大部分时间都在工作。HTTP 侦听部分有时会莫名其妙地挂起,导致curl上面的调用挂起,然后超时。

tcpdump当 API 无响应时,我在 192.168.0.1(接收服务器,托管 API 的服务器)上运行,wireshark分析显示在调用启动后立即进行了一些重传:

在此处输入图片说明

这种行为的原因通常是什么?(如果有“通常”的原因)。

注 1:如果需要,我将修改 API 以便它为 Web 服务器部分记录更多数据,但由于挂起的不可再现性,我怀疑这是它的错(其他部分(线程)工作得很好并且没有任何线程崩溃)。

注意 2:重新启动服务器(也可能重新启动脚本本身(我不这样做,因为我宁愿重新启动机器))解决了这个问题。

Vom*_*yle 8

带有 PSH、ACK 标志的重传序列是什么意思(以及虚假的重传返回)?

这种行为的原因通常是什么?(如果有“通常”的原因)。

PSH ACK Wireshark 跟踪

(另请参阅ServerFault - 我的连接期间的 PHA ACK

ACK 意味着发送带有 ACK 数据包的机器正在确认它已从另一台机器接收到的数据。在 TCP 中,一旦建立连接,任何一方发送的所有数据包都将包含一个 ACK​​,即使它只是重新确认已经确认的数据。

PSH 是发送者的一个指示,如果接收机器的 TCP 实现尚未将它接收到的数据提供给正在读取数据的代码(程序或程序使用的库),那么它应该在那时这样做。引用 RFC 793,TCP 的官方规范:

在连接上流动的数据可以被认为是八位字节流。发送用户在每个 SEND 调用中指示是否应通过设置 PUSH 标志立即将该调用(以及任何之前的调用)中的数据推送到接收用户。

允许发送 TCP 从发送用户收集数据,并在其方便时将数据分段发送,直到推送功能收到信号,然后它必须发送所有未发送的数据。当接收 TCP 看到 PUSH 标志时,在将数据传递给接收进程之前,它不能等待来自发送 TCP 的更多数据。


虚假重传

如果您看到虚假重传,则意味着发送方认为数据包丢失并再次发送,即使接收方为其发送了确认数据包。


可能的原因

  • 服务器和客户端机器之间的错误配置
  • TCP 数据包的跳跃路径上任何发送方和接收方之间的配置错误
  • 防火墙规则或数据包过滤器阻止数据包

附加故障排除

  • 发生这种情况时也检查服务器日志
  • 在服务器上使用 Wireshark 运行 TCP 跟踪,以查看出现问题时这些数据包的情况