我目前正在为基于 UDP 的网络协议实现纠错。我们选择实施纠错以减少数据包重传的次数。
架构非常简单:在我们的 UDP 数据包中(在有效负载部分),我们包含一个纠错码(在这种特定情况下基于 Reed-Solomon);因此,如果 UDP 数据包在传输过程中损坏,我们的应用程序能够“修复”UDP 有效负载,而无需请求重新传输数据包。仅当数据包完全丢失或损坏太多时才需要重新传输。
主要问题是:要使这种架构正常工作,UDP 数据包即使损坏也必须传送到目的地。但是,如果数据包损坏,网络设备和操作系统本身可能会丢弃数据包。
我解决了 UDP 传输层的问题:幸运的是,UDP 的校验和是可选的,因此可以禁用它。禁用 UDP 的校验和功能使我们能够接收损坏的 UDP 数据包(因此我们可以尝试自己修复它们)。
我还解决了 IPv4 层的问题:IPv4 的校验和仅检查 IPv4 标头的完整性,而不检查有效负载。这完全没问题,因为我们的应用程序能够修复有效负载损坏,但当然不能修复 IPv4 标头损坏。
最后一个问题需要解决:数据链路层。例如,以太网帧具有确保整个帧完整性的校验和;这意味着如果 UDP 有效载荷损坏,以太网帧校验和将无效,因此网络设备或操作系统将丢弃数据包。
另一方面,我们的网络协议需要纠错功能,因为它将用于卫星通信(我想数据包不使用以太网帧传输到卫星)。但我无法找到有关“卫星帧”以及它们如何处理完整性检查的信息。
卫星通信中通常使用什么样的帧?而且,最重要的是,这些帧是只检查标头完整性(如 IPv4)还是整个数据包完整性(如以太网帧)?
非常感谢。