【问题标题】:What does boost::asio::write guarantee (ACK, Checksum)?boost::asio::write 保证(ACK,校验和)是什么?
【发布时间】:2013-01-18 04:37:36
【问题描述】:

我对@9​​87654322@ 和相关的写入函数有疑问。通过阅读 TCP 上的 Wikipedia article,我了解到 TCP 包含确认消息和校验和。不幸的是,我在 boost::asio 参考资料中找不到任何相关信息。据我了解 boost::asio 使用 TCP 的操作系统实现,它应该包含这两个功能。

我的问题是函数boost::asio::writeboost::asio::async_write 在使用boost::asio::ip::tcp::socket 调用时保证什么。那么如果函数返回/回调函数被正确调用是什么意思。我可以想象一些可能性:

  1. 基本上没什么,只是程序告诉操作系统发送数据而已,仅此而已。
  2. 数据正在进行中,这意味着操作系统确认它已发送数据。
  3. 数据已到达,表示收到对方的确认消息。
  4. 数据已到达且未损坏,与 3. 相同,加上校验和相加。

如果不是 4. 有没有办法使用 boost::asio 来强制执行(我的意思是在 boost::asio 中,而不是自己实现)?

【问题讨论】:

    标签: c++ boost tcp boost-asio


    【解决方案1】:

    它是#1,它应该是这样的。无法保证数据会被发送。

    你认为你想要#4,但你真的不想要。远程对等点的网络堆栈接收到正确数据这一事实可能与您的应用程序无关。您确实想知道数据是否被正确接收和处理,这超出了 TCP 的范围,但在 TCP 之上很容易实现。 (我建议阅读 OSI Model 以了解 TCP 可以做什么。基本上,您希望确保您的数据到达正确的应用程序,或者更多,而 TCP 只确保它到达作为运行应用程序的计算机。)

    要执行您想要的操作,请通过 TCP 链接发送带内确认。您还可以将 SHA-2 或其他数据的哈希值放入确认中。您也可以等到数据处理完毕后再发送确认,例如,等到数据写入磁盘并调用fsync()

    【讨论】:

      【解决方案2】:

      将报告本地检测到的错误。也会报连接错误。 如果您使用 TCP,则会报告 tcp-ack 失败,但可能在稍后的 read 或 write 调用中(当通知 os tcp-hack 失败时)。

      所以你不能确定当你发出一个 write 时它是否真的被收到了。没有写入错误意味着操作系统目前知道您正在使用的 tcp 连接上没有错误,并且他在内部缓冲了您的数据以将其传输到 tcp 对等方。

      【讨论】:

      • 此回复与 Dietrich Epp 的回复不符。该处理程序仅在操作系统收到后才调用一次,因此不会报告 ACK 失败。
      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2015-03-31
      • 2018-05-02
      相关资源
      最近更新 更多