networking - TCP 服务器发送 [ACK] 后跟 [PSH,ACK]
问题描述
我正在使用高性能 TCP 服务器,当我使用 TCP 客户端泵送高流量时,我发现服务器的处理速度不够快。经过仔细检查,我看到 TCP 服务器上的“增量时间”出现峰值。而且,我看到服务器发送一个 ACK 并在 0.8 秒后为相同的 seqno 发送 PSH,ACK。我在 pcap 中多次看到这种模式。专家可以评论为什么服务器发送一个 ACK 后跟一个 PSH,ACK 之间有延迟吗?
解决方案
简化内容ACK
和PSH
含义
ACK
将始终存在,它只是通知客户端服务器最后接收到的字节是什么。PSH
告诉客户端/服务器将字节推送到应用层(字节形成完整的消息)。
您习惯的通常情况或多或少如下:
- 操作系统有一个缓冲区,用于存储从客户端接收到的数据。
- 一旦收到一个数据包,它就会被添加到缓冲区中。
- 应用程序调用套接字接收方法并从缓冲区中取出数据
- 应用程序将数据写回套接字(响应)
- 操作系统发送带有标志的数据包
PSH,ACK
现在想象一下这些场景:
第 4 步没有发生(应用程序没有写回任何数据,或者写的时间太长)
=> 操作系统只用一个确认接收
ACK
(数据包中不会有任何数据),如果应用程序稍后决定发送一些东西,它将用PSH,ACK
.服务器发送的消息/数据太大而无法放入一个数据包中:
- 第一个数据包没有
PSH
标志,只有ACK
标志 - 最后一个数据包将带有标志
PSH,ACK
,以通知消息结束。
- 第一个数据包没有
推荐阅读
- flask - 一种检测烧瓶中会话过期的方法?
- r - R Markdown code chunk does not show math equations
- vba - Word 中的 VBA 宏用于选择和分组图像,并在其顶部带有突出显示框(形状)
- javascript - 创建一个 NEXT 和 PREVIOUS 来显示 JSON 数据的记录
- javascript - 从 JS 获取图像数组到 Django 模板
- algorithm - 给定一个比较列表,用尽可能少的额外比较对项目进行排序
- javascript - 使用颤振客户端向 node.js express api 发出 post 请求
- c - 在 C 中为未知长度的字符串实现 BST 的最佳实践是什么?
- task - 任务计划程序无法运行应用程序
- javascript - Google Apps 脚本 - 自动链接工作表