问题描述
我正在使用高性能TCP服务器,但是当我使用TCP客户端进行大量流量传输时,我发现服务器的处理速度不够快。经过仔细检查,我发现TCP服务器上的“增量时间”出现峰值。而且,我看到服务器发送一个ACK,然后在0.8秒后发送相同的seqno的PSH,ACK。我在pcap中多次看到此模式。专家能否评论为什么服务器要先发送ACK,然后再发送PSH,ACK,两者之间有延迟?
解决方法
为简化ACK
和PSH
的含义
-
ACK
将始终存在,它仅通知客户端服务器最后收到的字节是什么。 -
PSH
告诉客户端/服务器将字节推送到应用程序层(这些字节形成完整的消息)。
您惯常使用的场景大致如下:
- 操作系统具有一个缓冲区,用于存储从客户端接收的数据。
- 接收到数据包后,立即将其添加到缓冲区。
- 应用程序调用套接字接收方法,并将数据从缓冲区中取出
- 应用程序将数据写回套接字(响应)
- 操作系统发送带有标志
PSH,ACK
的数据包
现在想象一下这些情况:
-
步骤4不会发生(应用程序不会回写任何数据,或者写入时间太长)
=> OS仅用
ACK
确认接收(数据包中没有任何数据),如果应用程序稍后决定发送某些内容,则将使用PSH,ACK
发送。 -
服务器发送的消息/数据太大,无法放入一个数据包:
- 第一个数据包将不具有
PSH
标志,而仅具有ACK
标志 - 最后一个数据包将带有标志
PSH,ACK
,以通知消息的结尾。
- 第一个数据包将不具有