我找不到TCP WSASend调用完成的含义的规范。完成WSASend操作是否需要接收ACK响应?
此问题与ping超时为200ms-2s的较慢网络有关。调用WSASend完成回调需要200ms-2s(或使用任何完成机制)吗?或者,也许仅在某些数据包上,Windows会等待ACK并认为WSASend操作对所有其他数据包的完成要快得多?
确切的行为在缓冲区生命周期管理方面有很大的不同,进而对性能(锁定,分配/取消分配和引用计数)产生重大影响。
最佳答案
WSASend不保证以下各项:
它不需要往返。实际上,启用nagling后,始终会为200ms缓存少量数据,以希望应用程序发送更多数据。 WSASend必须迅速返回,以便打na工作。
如果需要确认,请更改应用程序协议(protocol),以便获得确认。没有其他方法可以做到这一点。
需要说明的是,即使不进行任何设置(TCP_NODELAY),也不会为您的发送操作获得ACK。它将被发送到网络,但是远程不知道它应该确认。 TCP无法说“请立即确认此数据”。正在发送的数据并不意味着它将永远被接收。将数据推送到黑洞后,网络可能会丢失一秒钟。