12

我正在使用带有应用程序的 2 台计算机来发送和接收 udp 数据报。没有流量控制,ICMP 被禁用。通常,当我通过应用程序将文件作为 UDP 数据报发送时,我会收到两个数据包更改它们的顺序,因此 - 数据包丢失。

我已经禁用了某种防火墙,并且计算机之间没有连接硬件开关(它们是直接连线的)。

有没有办法确保 Winsock 并send()以与到达那里相同的方式发送数据包?

还是操作系统正在这样做?

还是需要网络设备配置?

4

5 回答 5

12

UDP 是一种轻量级协议,在设计上不处理数据包排序之类的事情。如果您想要稳健的数据包传递和排序,TCP 是更好的选择。

UDP 通常设计用于数据包丢失可接受或优于 TCP 必须重新请求数据包时产生的延迟的应用程序。因此,UDP 通常用于媒体流。

如果您仅限于使用 UDP,则必须开发一种方法来识别乱序数据包并对其重新排序。

于 2010-09-19T09:22:14.250 回答
8

UDP 不保证您的数据包会按顺序到达。(它甚至不能保证您的数据包会到达。)如果您需要那种级别的健壮性,那么最好使用 TCP。或者,您可以在数据报中添加序列标记并在另一端重新排列它们,但为什么要重新发明轮子呢?

于 2010-09-19T09:48:13.997 回答
6
有没有办法确保 winsock 和 send() 以与到达那里相同的方式发送数据包?

它被称为 TCP。

或者尝试使用可靠的 UDP 协议,例如UDT。我猜你可能在一个小型嵌入式平台上,所以你想要一个更紧凑的协议,比如贝尔实验室的RUDP

于 2010-09-20T13:33:02.347 回答
0

没有流量控制(ICMP 禁用)

您可以使用 UDP 实现自己的流量控制:

  • 发送一个或多个 UDP 数据包
  • 等待确认(作为另一个 UDP 数据包从接收方发送到发送方)
  • 重复如上

有关详细信息,请参阅滑动窗口协议

[这将是您发送的数据包中的序列号的补充。]

于 2010-10-03T19:53:56.087 回答
0

尝试创建自己的 TCP 类包装器是没有意义的。我们喜欢 UPD 的速度,这只会减慢速度。如果您设计协议以使每个 UDP 数据报彼此独立,则可以克服您的问题。只要报头数据包先到达,我们的数据包就可以按任何顺序到达。标头表示应该到达多少数据包。此外,自从这篇文章在十多年前创建以来,UPD 变得更加可靠。不要试图

于 2022-01-21T10:00:04.703 回答