我找不到TCP WSASend调用完成的含义的规范。完成WSASend操作是否需要接收ACK响应?

此问题与ping超时为200ms-2s的较慢网络有关。调用WSASend完成回调需要200ms-2s(或使用任何完成机制)吗?或者,也许仅在某些数据包上,Windows会等待ACK并认为WSASend操作对所有其他数据包的完成要快得多?

确切的行为在缓冲区生命周期管理方面有很大的不同,进而对性能(锁定,分配/取消分配和引用计数)产生重大影响。

最佳答案

WSASend不保证以下各项:

  • 数据已发送(可能已被缓冲)
  • 已收到(可能已丢失)
  • 接收方应用程序对其进行了处理(发送者原则上无法知道)

  • 它不需要往返。实际上,启用nagling后,始终会为200ms缓存少量数据,以希望应用程序发送更多数据。 WSASend必须迅速返回,以便打na工作。

    如果需要确认,请更改应用程序协议(protocol),以便获得确认。没有其他方法可以做到这一点。

    需要说明的是,即使不进行任何设置(TCP_NODELAY),也不会为您的发送操作获得ACK。它将被发送到网络,但是远程不知道它应该确认。 TCP无法说“请立即确认此数据”。正在发送的数据并不意味着它将永远被接收。将数据推送到黑洞后,网络可能会丢失一秒钟。

    10-06 05:42