![大于 64k 的以太网帧](https://linux22.com/image/1578838/%E5%A4%A7%E4%BA%8E%2064k%20%E7%9A%84%E4%BB%A5%E5%A4%AA%E7%BD%91%E5%B8%A7.png)
我在千兆以太网局域网中拥有几台 PC,它们都通过单个简单的非托管 L2 交换机互连。没有互联网接入。我想构建一些实时系统,其中某台 PC 应该向另一台 PC 发送大约 1MB 的消息,具有这样的属性,该消息要么被送达,要么完全丢失(在后一种情况下,我不需要重新传输它,因为它会过时)。
更像是“来自摄像头视频的实时馈送+音频+来自传感器的一些额外数据”。我想使用以太网协议,因为我不需要复杂的互联网式路由,MAC 地址就足够了。
但维基百科说最大有效载荷仅为 46‑1500 个八位字节。我可以通过自定义软件(例如使用netmap
API)克服此限制吗?或者这是硬件定义的行为,无法更改?
答案1
1G(及以上)以太网提供巨型帧支持,帧长度可达 9000 字节。我见过一些较旧的 Intel PCI 卡(古老的东西),它们支持高达 16k 帧,但我相信这些是非标准的。
您必须将消息拆分成更小的块。最大帧长度取决于硬件(没有软件可以解决这个问题),但我认为没有任何东西支持 1M 帧。
答案2
以太网(以及 IP)的设计使数据包大小具有固定的上限长度,这样就没有人能够在传输一些任意长度的消息时长时间占用共享介质。
标准以太网帧的有效负载最多为 1500 字节。
标准 IP 数据报的长度最多为 64 千字节。(但由于互联网上存在如此多的以太网类网络链路,大多数情况下 IP 数据报都会保持在以太网的 1500 字节限制内,因为大型 IP 数据报的分段和重组效率低于仅将数据报保持在数据链路层的 MTU 内。)
如果您的应用程序处理的消息大于该值,则您必须在自己的层上自行进行消息分段/重组/验证。这就是应用程序的设计方式,也是每个人都处理它的方式,而您将逆流而上,试图破解硬件以允许 1MB 的消息。相反,您应该意识到您想要的不是那些较低层为您提供的东西,而是它们为您提供了在您的层上构建自己的解决方案所需的构建块。网络协议和技术是专门按层设计的,最低层提供该层所需的最低限度,以便上层不会因为较低层所做的超出上层需要的事情而负担过重。有一篇关于这一点的开创性论文叫做Saltzer、Reed 和 Clark 合著的《系统设计中的端到端论证》任何想深入了解这种详细程度的网络的人都应该阅读它。
我确信周围有大量的消息框架库,可以轻松地通过 TCP 或 UDP 传递任意长度的消息,其中消息框架库负责对消息进行分段、重组和验证。