数据包丢失和数据包重复

Posted

技术标签:

【中文标题】数据包丢失和数据包重复【英文标题】:Packet Loss and Packet duplication 【发布时间】:2012-10-04 00:26:24 【问题描述】:

我正在尝试找出问题之间的区别。有谁知道“数据包复制”是什么意思?是不是和TCP检测到丢包重传一样?

【问题讨论】:

【参考方案1】:

没有。在TCP 中,“数据包”的传递是可靠的(我认为在这种情况下术语数据应该更好,因为它是一个面向流的协议)。

丢包和重复是与不可靠协议数据报相关的问题,如UDP。在 UDP 中,当您发送数据报时,它可能会重复到达、乱序甚至根本不到达。

检测到丢包时是否和重发包一样 TCP?

是和不是。假设 TCP 在内部使用 ack 机制来检测丢失的数据,并自动重新传输它们。所以丢失的数据对用户来说是透明的,由协议自己处理。

有人知道什么是“数据包复制”吗?

在某些情况下,IP 数据包可能会在到达目的地的路径上重复出现。例如,路由器可以决定通过 2 个不同的网络接口转发传入流量。在这种情况下,两个 IP 数据包都可能到达目的地。

TCP处理重复的IP数据包问题,所以你不用关心它们。

UDP 不处理它们。当您收到数据报时,不能保证您之前没有收到相同的数据报。你应该检查一下。

【讨论】:

交付永远无法保证,您只是合理地知道交付发生或失败。 @PherricOxide:你是对的。我把它改成了可靠的,听起来应该更好吧? @Heisenbug:您知道任何现实世界的路由器解决方案可能决定通过两个不同的网络接口转发传入流量吗?我们正在寻求这样的解决方案... @s-n-ushakov 例如。支持 TEE 目标的 iptables 可以做到这一点 说 TCP 是“可靠的”,没有限定,是错误的。它不是,因为它不可能,并且假设它是危险的。由于没有意识到这一点,现实世界的协议被破坏了。 TCP 保证每个数据包只会到达一次并保证顺序(因此在这种情况下答案是正确的),但是如果连接中断,您不知道究竟到达了什么。您只知道在某种程度上所做的一切(已确认的内容),但是由于操作系统没有向应用程序报告这一点,它无论如何也没多大用处。【参考方案2】:

有两种情况可能意味着重复数据包:有效负载(正在发送的数据)的重复或有效负载和标头的完全重复。 TCP 将尝试重新发送它没有收到 ACK(来自接收器的数据包到达正常的确认)的数据。但是,这会导致著名的“two Generals”问题,您永远无法确定数据实际到达,或者您只是因为 ACK 数据包丢失而没有收到 ACK。接收者可能已经收到了数据包,并回复了一个 ACK​​,但随后 ACK 丢失了。在这种情况下,发送方将假定该数据包从未收到,并发送另一个具有相同有效负载的数据包。由于这种情况,像 TCP 这样的协议需要处理多次发送的数据。在这种情况下,答案是“是”,它们是一样的。

第二件事重复数据包可能意味着实际 100% 重复数据包(有效负载和标头)。这可能是由于软件、硬件错误或路由问题或配置错误而发生的。在这种情况下不,这与 TCP 故意发送具有重复有效负载的新数据包以检测数据包丢失有点不同。在这种情况下,发送方只发送了一个数据包,但它在途中被路由器或硬件接口复制到了某个地方。

【讨论】:

你知道 TCP 或任何其他协议是如何处理两个将军问题的吗? TCP就是这样处理重复数据包的?

以上是关于数据包丢失和数据包重复的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC 是不是为您处理数据包丢失和数据包接收确认等,或者您是不是需要为此编写自己的解决方案?

使用 esp32 接入点流式传输 UDP 数据包会导致大量数据包丢失

串行数据包丢失 - QTSerialPort

Java ServerSocket 和使用 ObjectIOStreams 的套接字会丢失数据包吗?

“丢失”的 UDP 数据包(JBoss + DatagramSocket)

操作 Windows 资源管理器窗口时 UDP 数据包丢失