TCP 服务器发送 [ACK] 后跟 [PSH,ACK]

use*_*514 7 networking tcp tcpdump pcap wireshark

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

TCP 服务器 PCAP

Ayo*_*ich 6

简化含义ACKPSH含义

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

您习惯的通常场景或多或少如下:

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

现在想象一下这些场景:

  • 步骤 4 不会发生(应用程序不会写回任何数据,或者写入时间太长)

    => 操作系统仅使用 确认接收ACK(数据包中不会包含任何数据),如果应用程序稍后决定发送某些内容,则会使用 发送PSH,ACK

  • 服务器发送的消息/数据太大,无法容纳在一个数据包中:

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

  • 包含消息最后部分的 tcp 段始终设置 PSH 标志?是的 (2认同)
  • 是否存在最后接收到的报文段包含前一条消息的部分和新消息的字节的情况?我还没有看到它在实践中发生。 (2认同)