首页 > 解决方案 > TCP 服务器发送 [ACK] 后跟 [PSH,ACK]

问题描述

我正在使用高性能 TCP 服务器,当我使用 TCP 客户端泵送高流量时,我发现服务器的处理速度不够快。经过仔细检查,我看到 TCP 服务器上的“增量时间”出现峰值。而且,我看到服务器发送一个 ACK​​ 并在 0.8 秒后为相同的 seqno 发送 PSH,ACK。我在 pcap 中多次看到这种模式。专家可以评论为什么服务器发送一个 ACK​​ 后跟一个 PSH,ACK 之间有延迟吗?

TCP 服务器 PCAP

标签: networkingtcpwiresharkpcaptcpdump

解决方案


简化内容ACKPSH含义

  • ACK将始终存在,它只是通知客户端服务器最后接收到的字节是什么。
  • PSH告诉客户端/服务器将字节推送到应用层(字节形成完整的消息)。

您习惯的通常情况或多或少如下:

  1. 操作系统有一个缓冲区,用于存储从客户端接收到的数据。
  2. 一旦收到一个数据包,它就会被添加到缓冲区中。
  3. 应用程序调用套接字接收方法并从缓冲区中取出数据
  4. 应用程序将数据写回套接字(响应)
  5. 操作系统发送带有标志的数据包PSH,ACK

现在想象一下这些场景:

  • 第 4 步没有发生(应用程序没有写回任何数据,或者写的时间太长)

    => 操作系统只用一个确认接收ACK(数据包中不会有任何数据),如果应用程序稍后决定发送一些东西,它将用PSH,ACK.

  • 服务器发送的消息/数据太大而无法放入一个数据包中:

    • 第一个数据包没有PSH标志,只有ACK标志
    • 最后一个数据包将带有标志PSH,ACK,以通知消息结束。

推荐阅读