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

TCP Server sends [ACK] followed by [PSH,ACK]

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

TCP SERVER PCAP

简化 ACKPSH 的含义

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

您习惯的通常情况大致如下:

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

现在想象一下那些场景:

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

    => OS 只用 ACK 确认接收(数据包中没有任何数据),如果应用程序稍后决定发送一些东西,它将被发送PSH,ACK.

  • 服务器发送的message/data太大,一个数据包放不下:

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