【发布时间】:2014-02-21 22:16:04
【问题描述】:
我知道在大多数基于 UNIX 的系统中,内核一旦收到数据包就会发送 ACK。 但想知道 Windows 操作系统中的行为是否也相同。 (Windows 7)。
【问题讨论】:
-
通常人们会期望 ack 来自 TCP 堆栈而不是客户端程序,除非可能一个粗心的客户端允许缓冲区填充到容量限制。但是您的前提不一定是正确的;无论应用程序代码在做什么,Nagle 算法都会导致对隔离数据包的确认延迟。
-
@ChrisStratton 我看不出“一个不专心的客户”与它有什么关系。套接字接收缓冲区中的数据由 TCP 确认,句号。
-
@ChrisStratton 接收缓冲区满时接收窗口变为零,所以发送方停止发送,所以不可能出现你描述的情况。这也是使应用程序的读取行为与 ACK 无关的原因。你似乎在这个简单的问题中引入了各种无关紧要的东西。
-
@user3250651 Unix 不会在内核收到数据包后立即发送 ACK。有许多限制条件,涉及延迟和合并的 ACK,这意味着它可以被推迟。但它与应用程序何时从套接字读取无关。