【问题标题】:What determines the number of TCP packets in boost::asio?什么决定了 boost::asio 中 TCP 数据包的数量?
【发布时间】:2012-12-10 15:57:45
【问题描述】:

我正在通过asio::tcp::socket 发送 TCP 数据包。

我的问题是,虽然我每次发送的数据约为 800 字节,并且最大数据包大小为 1500 字节,但数据发送超过 5 个数据包。

(我在sniffsmart软件中查看了数据包的数量和数据)

这是为什么呢?!

我应该如何解决或跟踪这个问题?

【问题讨论】:

    标签: c++ windows tcp boost-asio packet


    【解决方案1】:

    编辑:流式传输协议(如 TCP)中的数据包数量取决于您的网络配置。然而,这个答案优化了套接字的使用,因此程序不会增加传输数据包数量的开销。

    如果您想获得更大的数据包,您应该尝试一次将所有数据放在套接字上。您可能自己将其分成多个数据包。由于 TCP 的Nagle's 算法,TCP 堆栈会立即将可用数据发送给对等方。因此,如果您多次将数据放在套接字上,其余数据将转到下一个数据包。

    或者你可以像这样关闭 Nagle 的算法:

    m_socket.set_option(tcp::no_delay(true));
    

    【讨论】:

    • 这无论如何都不能保证 1500 的数据包长度。
    • 我的问题是尺寸小于最大数据包大小的数据在多个数据包中发送,在这种情况下,这个答案很合适。
    • 虽然这个答案在某种意义上是正确的,但 TCP 仍然是一个基于流的协议,您应该中继 send() 到 @987654324 的 1-1 匹配@ 调用。
    • @Chad 你是对的。我添加了一个编辑来澄清这个问题的目的。
    • @wiggily 关闭 Nagle 的算法 no_delay 应该设置为 true
    【解决方案2】:

    TCP 是一个流。您无法控制某些数据包将包含哪些内容。您可以打开/关闭 Nagle 算法,这会影响传输速度,但您无法自行控制数据包的大小。此外,这些数据包可以在途中被任何路由器拆分/加入。所以它本质上是流,你不能改变它。

    【讨论】:

      【解决方案3】:

      TCP 是一种流数据。 send() 仅将数据放入发送缓冲区,系统 TCP 堆栈实现决定如何将数据放入网络。这就是为什么您通过嗅探看到的数据包与您的 send() 调用不匹配的原因。如果您真的希望发送数据包与发送()匹配,我记得有一个 TCP 选项。你可以查一下,我现在记不太清了。

      【讨论】:

      • 我发送的数据大约是500字节,800字节是网络上的数据大小,但它仍然发送多个数据包
      • 先解析地址,获取物理地址,再建立TCP连接等。连接是 TCP 中最繁重的操作。你是在建立连接后测量这个吗?
      猜你喜欢
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多