我无法找到 TCP WSASend 调用完成意味着什么的规范。 WSASend 操作的完成是否需要收到 ACK 响应?
此问题与 200 毫秒 - 2 秒 ping 超时的较慢网络相关。调用 WSASend 完成回调(或使用任何完成机制)是否需要 200 毫秒 - 2 秒?或者也许只有某些数据包 Windows 才会等待 ACK,并认为 WSASend 操作对于所有其他数据包来说完成得更快?
确切的行为对缓冲区生命周期管理有很大影响,进而对性能(锁定、分配/释放和引用计数)产生重大影响。
最佳答案
WSASend 不保证以下内容:
- 数据已发送(可能已被缓冲)
- 已收到(可能已丢失)
- 接收应用程序处理了它(原则上发送者永远无法知道这一点)
不需要往返。事实上,启用 nagling 后,少量数据总是会缓冲 200 毫秒,希望应用程序能够发送更多数据。 WSASend必须快速返回,以便 nagling 有机会发挥作用。
如果您需要确认,请更改应用程序协议(protocol),以便您收到确认信息。没有其他办法可以做到这一点。
澄清一下,即使没有 nagling (TCP_NODELAY),您也不会收到发送操作的 ACK。它将被发送到网络,但远程端不知道它应该 ACK。 TCP 没有办法说“请立即确认此数据”。数据被发送并不意味着它会被接收。数据被插入黑洞后,网络可能会掉线一秒钟。
关于c++ - TCP WSASend 完成标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21093128/