2

我正在通过asio::tcp::socket.

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

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

这是为什么?!

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

4

3 回答 3

4

编辑:像 TCP 这样的流协议中的数据包数量取决于您的网络配置。但是,此答案优化了套接字的使用,因此程序在传输数据包的数量方面不会增加任何开销。

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

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

m_socket.set_option(tcp::no_delay(true));
于 2012-12-24T08:00:34.093 回答
1

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

于 2012-12-24T09:39:20.990 回答
0

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

于 2012-12-24T06:24:59.887 回答