C# TCP客户端带宽估计

C# TCP客户端带宽估计,c#,networking,bandwidth,tcpclient,C#,Networking,Bandwidth,Tcpclient,我想使用TcpClient创建带宽估计工具。我遇到的问题是,我希望在预定义的时间内执行测量(而不是预定义要传输的缓冲区数据长度)。如果我使用循环(重复传输小块数据),是否会降低性能(手动碎片与自动碎片)?这取决于是否禁用Nagle算法。如果你这样做了,那么是的,你将自己把事情搞得支离破碎。如果你不这样做,你就不可能实现你的目标-因为当你认为数据是。。。当然,除非连接的另一端发回最后的“确认” 我建议你用一个小样本计算出大致的速度,然后在此基础上创建一个更大的样本,预测需要多长时间。不管怎样,你都

我想使用TcpClient创建带宽估计工具。我遇到的问题是,我希望在预定义的时间内执行测量(而不是预定义要传输的缓冲区数据长度)。如果我使用循环(重复传输小块数据),是否会降低性能(手动碎片与自动碎片)?

这取决于是否禁用Nagle算法。如果你这样做了,那么是的,你将自己把事情搞得支离破碎。如果你不这样做,你就不可能实现你的目标-因为当你认为数据是。。。当然,除非连接的另一端发回最后的“确认”

我建议你用一个小样本计算出大致的速度,然后在此基础上创建一个更大的样本,预测需要多长时间。不管怎样,你都需要测量时间——这不像你要达到一个精确的预定义时间——所以它不应该有太大的区别。在某种程度上,你可以随时调整大小——我预计你最终会发送大量数据包,除非它是一个非常慢的网络,所以如果你中途决定只发送200K而不是300K,那应该不会有太大的区别


当然,这听起来像是你最初的建议——但我只是说每次通话都要发送“相当大”的数据块。。。比如说16K。(无论如何,比数据包的大小大得多。)这不会对碎片产生太大影响,但仍然允许您在运行过程中进行一些调整。我不会建议您发送非常小的数据包。

这取决于您是否禁用了Nagle算法。如果你这样做了,那么是的,你将自己把事情搞得支离破碎。如果你不这样做,你就不可能实现你的目标-因为当你认为数据是。。。当然,除非连接的另一端发回最后的“确认”

我建议你用一个小样本计算出大致的速度,然后在此基础上创建一个更大的样本,预测需要多长时间。不管怎样,你都需要测量时间——这不像你要达到一个精确的预定义时间——所以它不应该有太大的区别。在某种程度上,你可以随时调整大小——我预计你最终会发送大量数据包,除非它是一个非常慢的网络,所以如果你中途决定只发送200K而不是300K,那应该不会有太大的区别


当然,这听起来像是你最初的建议——但我只是说每次通话都要发送“相当大”的数据块。。。比如说16K。(无论如何,比数据包的大小大得多。)这不会对碎片产生太大影响,但仍然允许您在运行过程中进行一些调整。我不建议你寄很小很小的包裹。

请原谅我的提问,但我真的不明白。如果我错了,请纠正我。如果我禁用了nagle算法,我必须通过反复发送小块数据来手动分割数据。如果我不禁用nagle算法,我的数据将自动分段。如果我不禁用nagle算法,我就不太可能实现我的目标(带宽估计?),因为发送的数据可能在我认为它已被接收时并未实际接收到。我有点糊涂了。@Public敌军:我应该澄清一下。。。如果您可以让连接的另一端在接收到所有信息时为您提供一些价值—有效地使“确认”在应用程序级别可见—那么就可以了。。。就发送端的计算能力而言,效率稍低,但与网络定时相比,不太可能显著。在这里,我认为tcp是可靠的(保证接收到正确的数据)。你是说如果我禁用nagle,就不能保证发送的数据能被接收吗?@Public敌手:这是可靠的,因为当流启动时,你能正确有序地获取数据。但仅仅因为TcpClient上的“写入”已经返回,并不意味着数据已经到达另一端。(事实上,不管你是否禁用Nagle算法,这都是事实。只是没有Nagle,每次“写”都会立即发送数据包。)感谢Jon Skeet的澄清。非常感谢。请原谅我的提问,但我真的不明白。如果我错了,请纠正我。如果我禁用了nagle算法,我必须通过反复发送小块数据来手动分割数据。如果我不禁用nagle算法,我的数据将自动分段。如果我不禁用nagle算法,我就不太可能实现我的目标(带宽估计?),因为发送的数据可能在我认为它已被接收时并未实际接收到。我有点糊涂了。@Public敌军:我应该澄清一下。。。如果您可以让连接的另一端在接收到所有信息时为您提供一些价值—有效地使“确认”在应用程序级别可见—那么就可以了。。。就发送端的计算能力而言,效率稍低,但与网络定时相比,不太可能显著。在这里,我认为tcp是可靠的(保证接收到正确的数据)。你是说如果我禁用nagle,就不能保证发送的数据能被接收吗?@Public敌手:这是可靠的,因为当流启动时,你能正确有序地获取数据。但仅仅因为TcpClient上的“写入”已经返回,并不意味着数据已经到达另一端。(事实上,不管你是否禁用Nagle算法,这都是事实。只是没有Nagle,每次“写”都会立即发送数据包。)感谢Jon Skeet的澄清。非常感谢。