是什么决定了boost :: asio中TCP数据包的数量?

时间:2012-12-24 06:19:25

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

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

我的问题是,虽然每次发送的数据大约是 800字节且最大数据包大小 1500字节,但数据会以超过5个数据包的形式发送。< / p>

(我检查sniffsmart软件中的数据包和数据)

为什么会这样?!

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

3 个答案:

答案 0 :(得分:4)

EDIT :TCP等流协议中的数据包数量取决于您的网络配置。然而,这个答案优化了套接字的使用,以便程序在传输数据包数量方面不会增加任何开销。

如果您尝试获取更大的数据包,则应尝试立即将所有数据放在套接字上。您可能自己将其分为多个数据包。由于TCP的Nagle's算法,TCP栈将立即向对等体发送可用数据。因此,如果您在多个场合将数据放在套接字上,则其余数据将转到下一个数据包。

或者您可以关闭Nagle的算法:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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