【发布时间】:2012-12-10 15:57:45
【问题描述】:
我正在通过asio::tcp::socket 发送 TCP 数据包。
我的问题是,虽然我每次发送的数据约为 800 字节,并且最大数据包大小为 1500 字节,但数据发送超过 5 个数据包。
(我在sniffsmart软件中查看了数据包的数量和数据)
这是为什么呢?!
我应该如何解决或跟踪这个问题?
【问题讨论】:
标签: c++ windows tcp boost-asio packet
我正在通过asio::tcp::socket 发送 TCP 数据包。
我的问题是,虽然我每次发送的数据约为 800 字节,并且最大数据包大小为 1500 字节,但数据发送超过 5 个数据包。
(我在sniffsmart软件中查看了数据包的数量和数据)
这是为什么呢?!
我应该如何解决或跟踪这个问题?
【问题讨论】:
标签: c++ windows tcp boost-asio packet
编辑:流式传输协议(如 TCP)中的数据包数量取决于您的网络配置。然而,这个答案优化了套接字的使用,因此程序不会增加传输数据包数量的开销。
如果您想获得更大的数据包,您应该尝试一次将所有数据放在套接字上。您可能自己将其分成多个数据包。由于 TCP 的Nagle's 算法,TCP 堆栈会立即将可用数据发送给对等方。因此,如果您多次将数据放在套接字上,其余数据将转到下一个数据包。
或者你可以像这样关闭 Nagle 的算法:
m_socket.set_option(tcp::no_delay(true));
【讨论】:
send() 到 @987654324 的 1-1 匹配@ 调用。
TCP 是一个流。您无法控制某些数据包将包含哪些内容。您可以打开/关闭 Nagle 算法,这会影响传输速度,但您无法自行控制数据包的大小。此外,这些数据包可以在途中被任何路由器拆分/加入。所以它本质上是流,你不能改变它。
【讨论】:
TCP 是一种流数据。 send() 仅将数据放入发送缓冲区,系统 TCP 堆栈实现决定如何将数据放入网络。这就是为什么您通过嗅探看到的数据包与您的 send() 调用不匹配的原因。如果您真的希望发送数据包与发送()匹配,我记得有一个 TCP 选项。你可以查一下,我现在记不太清了。
【讨论】: