为最大吞吐量,UDP数据包的最佳大小是多少?

时间:2008-11-09 16:11:53

标签: c++ windows linux network-programming udp

我需要通过可能有损耗的网络将数据包从一个主机发送到另一个主机。为了最小化数据包延迟,我不考虑TCP / IP。但是,我希望最大化吞吐量uisng UDP。应该使用的UDP数据包的最佳大小是什么?

以下是我的一些注意事项:

  • 网络中交换机的MTU大小为1500.如果我使用大数据包,例如8192,则会导致碎片。丢失一个片段会导致丢失整个数据包,对吗?

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

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

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

更新:

数据的某些接收器是未实现TCP / IP堆栈的嵌入式系统。

我知道这个地方到处都是那些非常喜欢使用可用内容的人。但我希望能有更好的答案,而不仅仅关注MTU。

9 个答案:

答案 0 :(得分:20)

替代答案:小心不要重新发明轮子。

TCP是数十年网络经验的产物。每一件事或几乎每件事都有共鸣。它有几种大多数人不经常考虑的算法(拥塞控制,重传,缓冲管理,处理重新排序的数据包等)。

如果你开始重新实现所有的TCP算法,你可能会遇到一个(paraphasing Greenspun's Tenth Rule)“临时的,非正式指定的,错误的,缓慢的TCP实现”。

如果还没有这样做,最好先查看一些最新的TCP / UDP替代方案,如SCTP或DCCP。它们被设计用于TCP和UDP都不匹配的利基,正是为了让人们使用已经“调试”的协议而不是为每个新应用重新发明轮子。

答案 1 :(得分:14)

找到理想数据报大小的最佳方法是完成TCP本身的工作,以找到理想的数据包大小:Path MTU discovery

TCP还有一个广泛使用的选项,双方都告诉对方他们的MSS(基本上是MTU减去标题)是什么。

答案 2 :(得分:3)

另一件需要考虑的事情是,某些网络设备无法很好地处理碎片。我们已经看到许多路由器丢弃了碎片化的UDP数据包或太大的数据包。 CesarB建议使用路径MTU是一个很好的建议。

最大吞吐量不仅仅受数据包大小的影响(当然这有助于实现)。最小化延迟和最大化吞吐量通常与其他方面不一致。在TCP中,您可以使用Nagle算法(部分)来提高整体吞吐量。然而,一些协议(例如,telnet)经常禁用Nagle(即,设置无延迟位)以便改善延迟。

您对数据有实时约束吗?流式音频不同于推送非实时数据(例如,记录信息),因为前者从低等待时间中获益更多,而后者则受益于增加的吞吐量和可能的可靠性。有可靠性要求吗?如果你不能错过数据包并且必须有一个协议来请求重传,这将降低整体吞吐量。

有许多其他因素会影响到这一点(正如另一个响应中所建议的那样),在某些时候你会得到一个糟糕的TCP实现。话虽这么说,如果你想实现低延迟并且可以容忍使用UDP并且整体数据包大小设置为PATH MTU(确保将有效负载大小设置为头部)可能是最佳解决方案(特别是如果你可以确保UDP可以从一端到另一端。

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

IP标头> = 20个字节,但大部分是20个,UDP标头是8个字节。这为您的数据留下1500 - 28 = 1472字节。 PATH MTU发现在到达目的地的路上找到最小的MTU。但这并不一定意味着,当您使用最小的MTU时,您将获得最佳性能。我认为最好的方法是做一个基准。或许你根本不应该关心路上最小的MTU。网络设备可以很好地使用小MTU并且还非常快速地传输分组。它的价值可能在未来发生很大的变化。因此,您无法发现并将其保存在以后使用的地方,您必须定期执行此操作。如果我是你,我会将MTU设置为1440,并对应用程序进行基准测试......

答案 6 :(得分:2)

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

答案 7 :(得分:1)

即使交换机上的MTU为1500,您也可能遇到一些情况(如通过VPN隧道传输)在数据包周围包含一些额外的标头 - 您可能会做得更好,以便稍微减少它们,然后转到1450左右。

您可以使用不同的数据包大小模拟网络和测试性能吗?

答案 8 :(得分:-15)

“堆栈”是(TCP使用(UDP使用(IPv4使用(以太网))))... 要么 “堆栈”是(TCP使用(UDP使用(IPv6使用(以太网))))...

所有这些标头都添加在TCP中。 IPv6只是愚蠢。每台计算机都不需要自己的IP。 IPv6只是不受欢迎的数据包膨胀。你有65,000多个端口,你不会全部使用它们......将它添加到ETHERNET标题中的单个机器MAC地址,你就有了大量的地址。

专注于(UDP使用(IPv4使用(以太网)))标题,一切都会好的。您的程序应该能够“检查”数据包大小,通过UDP接收65,000字节缓冲区,设置为全NULL CHR(0),并发送65,000个CHR(255)字节数据包。您可以看到您的UDP数据是否丢失,因为您永远无法获得它。它会被缩短。 UDP不传输多个数据包。你送一个,你得到一个。如果它不适合你就会得到更少。如果它被丢弃,你什么也得不到。

TCP会将您的连接保持在炼狱状态,直到收到所有数据。它使用UDP数据包,并告诉另一台计算机重新发送丢失的数据包。这带来了额外的开销,如果任何数据包丢失,丢失,短路或无序,都会导致LAG。

UDP为您提供完全控制权。如果发送“严重”和“非严重”数据,请使用UDP,并希望使用减少的数据包订单号系统,该系统不依赖于顺序到达。仅对TCP或SECURE固态数据使用TCP,这需要持久性和100%完整性。否则,你只是在浪费我们的网络带宽,并在网络上添加臃肿的混乱。数据流越小,沿途的松散程度就越小。使用TCP,您将保证与“流控制”中添加到TCP标头的所有重新发送和膨胀标头相关的附加LAG。

说真的,流量控制不是很难管理,也不是优先级,缺少数据检测。 TCP什么都没提供。这就是免费赠送的原因。它没有经验丰富,只是盲目愚蠢而且容易。这是一双旧拖鞋。你需要一双好的运动鞋。 TCP曾经是,现在仍然是一个黑客攻击。