我通过asio::tcp::socket
发送TCP数据包。
我的问题是,虽然每次发送的数据大约是 800字节且最大数据包大小 1500字节,但数据会以超过5个数据包的形式发送。< / p>
(我检查sniffsmart软件中的数据包和数据)
为什么会这样?!
我应该如何解决或跟踪这个?
答案 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选项。你可以检查一下,我现在不记得了。