什么是最大吞吐量的UDP数据包的最佳大小?

我需要通过潜在的有损networking将数据包从一台主机发送到另一台主机。 为了尽量减less数据包延迟,我不考虑TCP / IP。 但是,我希望最大化UDP吞吐量。 应该使用什么UDP数据包的最佳大小?

以下是我的一些考虑:

  • networking中交换机的MTU大小是1500.如果我使用一个大的数据包,例如8192,这将导致分段。 丢失一个分片会导致整个分组丢失,对吧?

  • 如果我使用较小的数据包,则会产生UDP和IP标头的开销

  • 如果我使用一个非常大的数据包,我可以使用的最大的数据包是什么? 我读了最大的数据报大小是65507.我应该使用什么缓冲区大小来发送这样的大小? 这有助于提高吞吐量吗?

  • 常用操作系统(例如Windows,Linux等)支持的典型最大数据报大小是多less?

更新:

数据的一些接收者是没有实现TCP / IP协议栈的embedded式系统。

我知道这个地方充满了对使用可用的东西非常溺爱的人。 但是我希望得到比仅仅关注MTU更好的答案。

备选答案:小心不要重新发明轮子。

TCP是数十年networking经验的产物。 每个或几乎所有的事物都有一个共鸣。 它有几个大多数人经常不考虑的algorithm(拥塞控制,重传,缓冲区pipe理,处理重sorting的数据包等等)。

如果你开始重新实现所有的TCPalgorithm,那么你可能会面临“临时的,非正式指定的,错误缠身的,TCP执行缓慢”的问题( 格林斯潘的第十条规则 )。

如果您还没有这样做,最好查看一下TCP / UDP的最新替代品,如SCTP或DCCP。 它们被devise用于TCP和UDP都不匹配的地方,正是为了让人们使用已经被“debugging”的协议,而不是为每个新的应用程序重新发明轮子。

find理想的数据报大小的最好方法是完成TCP本身的工作来find理想的数据包大小: pathMTU发现 。

TCP也有一个广泛使用的选项,双方告诉其他MSS(基本上,MTU减头)是什么。

另一件要考虑的事情是一些networking设备不能很好地处理碎片。 我们已经看到很多路由器丢弃分散的UDP数据包或者太大的数据包。 CesarBbuild议使用Path MTU是一个很好的build议。

最大吞吐量不仅仅受数据包大小的驱动(尽pipe这当然是有贡献的)。 最大限度地减less延迟和最大化吞吐量通常与另一个不一致。 在TCP中,您已经devise了Naglealgorithm(部分)来提高整体吞吐量。 但是,一些协议(如telnet)通常会禁用Nagle(即设置无延迟位)以提高延迟。

你有一些实时的数据限制吗? stream式audio不同于推送非实时数据(例如,logging信息),因为前者从低延迟中获益更多,而后者则受益于增加的吞吐量和可能的可靠性。 有可靠性要求吗? 如果你不能错过数据包,并且必须有一个协议来请求重传,这将会降低整体吞吐量。

还有很多其他因素会影响到TCP(正如另一个回应中所build议的),在某些时候,TCP会得到很差的实现。 这就是说,如果你想达到低延迟,并可以容忍丢失使用UDP的整体数据包大小设置为PATH MTU(一定要设置有效负载大小考虑头)可能是最佳的解决scheme(尤其是如果你可以确保UDP可以从一端到另一端。

那么,我有一个非MTU的答案给你。 使用连接的UDP套接字应该可以加快速度。 在您的UDP套接字上调用连接有两个原因。 首先是效率。 当你在一个未连接的UDP套接字上调用sendto时,内核会临时连接套接字,发送数据然后断开连接。 我读到一项研究表明,这在发送时占用了将近30%的处理时间。 调用连接的另一个原因是,您可以获取ICMP错误消息。 在一个未连接的UDP套接字上,内核不知道要传递ICMP错误的应用程序,所以它们只是被丢弃。

在c#中findmtu的最简单的解决方法是发送dontfragment标志设置为true的udp数据包。 如果抛出exception,请尝试减小数据包大小。 做到这一点,直到没有exception抛出。 你可以从1500个数据包大小开始。

IP头是> = 20个字节,但大多数是20和UDP头是8个字节。 这给你留下了1500 – 28 = 1472字节的数据。 pathMTU发现在到目的地的路上发现最小可能的MTU。 但是,这并不一定意味着当你使用最小的MTU时,你将获得最好的性能。 我认为最好的办法是做一个基准。 或者,也许你不应该在路上关心最小的MTU。 networking设备可以非常好地使用小的MTU,并且可以非常快速地传输数据包。 而且它的价值在未来可能会发生很大的变化。 所以你不能发现这个并把它保存到某个地方以便以后使用,你必须定期做。 如果我是你,我会把MTU设置为1440这样的东西,并且对应用程序进行基准testing。

呃贾森,TCP 使用UDP。 TCP使用IP,这就是为什么你经常看到它被称为TCP / IP。 UDP也使用IP,所以UDP在技术上是UDP / IP。 IP层处理端到端(跨不同的networking)的数据传输,这就是为什么它被称为网间协议。 TCP和UDP处理数据本身的分段。 较低层(如以太网或PPP)或您使用的任何其他设备处理计算机到计算机的数据传输(即在单个networking中)。

尽pipe交换机的MTU是1500,但是你可以有一些情况(如通过VPN隧道),在数据包周围包裹一些额外的头部,你可以稍微减less一些,最好在1450左右。

你能模拟networking并testing不同数据包大小的性能吗?

(Stack)是(TCP使用(UDP使用(IPv4使用(ETHERNET))))…或者“Stack”是(TCP使用(UDP使用(IPv6使用(ETHERNET))))…

所有这些头被添加到TCP中。 IPv6是愚蠢的。 每台电脑都不需要自己的IP。 IPv6只是不希望的数据包膨胀。 你有65,000多个端口,你不会全部使用它们……把它添加到ETHERNET头文件中的个人计算机MAC地址,并且你有地址的gazillions。

把重点放在(UDP使用(IPv4使用(ETHERNET)))头上,一切都会好的。 你的程序应该能够通过在UDP上接收一个65,000字节的缓冲区来设置所有NULL CHR(0),并且发送65,000个CHR(255)字节的数据包来“检查”数据包大小。 你可以看到你的UDP数据是否丢失,因为你永远不会得到它。 这将被缩短。 UDP不传输多个数据包。 你发一个,你得到一个。 如果不适合,你就会减less。 或者,如果它下降,你什么也得不到。

TCP将保持你的连接在炼狱,直到收到所有的数据。 它正在使用UDP数据包,并告诉其他计算机重新发送这些丢失的数据包。 这带来了额外的开销,并且如果任何分组丢失,丢失,短暂或者不按顺序,则会导致LAG。

UDP给你完全的控制。 如果您发送“关键”和“非关键”数据,则使用UDP,并且要使用不依赖于顺序到达的简化的数据包顺序号系统。 只使用TCP或WEBURE或SECURE实体数据,这需要持久性和100%的完整性。 否则,你只是在浪费我们的networking带宽,并增加networking的臃肿杂波。 你的数据stream越小,你将会越less。 使用TCP,并且您将保证与所有重新发送相关的附加LAG,以及添加到TCP报头上的用于“stream量控制”的膨胀报头。

严重的是,stream量控制不是很难pipe理,也不是优先级,缺less数据检测。 TCP提供什么。 这就是为什么免费赠送的原因。 它没有经验,只是一味的愚蠢和容易。 这是一双老式的拖鞋。 你需要一双好的运动鞋。 TCP是,现在仍然是一个黑客。