在局域网外测试UDP代码时出现问题?

在局域网外测试UDP代码时出现问题?,udp,Udp,我在接下来的几天里学习udp。这个周末,我将参加一个72小时的比赛,我希望在比赛结束时我的UDP代码能够在线工作。在比赛期间,我不会上网(所以不要给别人打电话让他们测试) 我知道UDP类数据包出现了一些问题,比如数据包出现两次,几个帧内都没有出现(但我不知道应该预期多长时间(毫秒)),建议的字节大小(576)等等 但是,从局域网转移到互联网之后,你会发生什么事情呢 注意:我将尽快运行一些代码并在线测试。希望我的最终代码会是什么样子,但我也可能会错过一些东西。您的延迟可能会增加,您可能会丢失更多的

我在接下来的几天里学习udp。这个周末,我将参加一个72小时的比赛,我希望在比赛结束时我的UDP代码能够在线工作。在比赛期间,我不会上网(所以不要给别人打电话让他们测试)

我知道UDP类数据包出现了一些问题,比如数据包出现两次,几个帧内都没有出现(但我不知道应该预期多长时间(毫秒)),建议的字节大小(576)等等

但是,从局域网转移到互联网之后,你会发生什么事情呢


注意:我将尽快运行一些代码并在线测试。希望我的最终代码会是什么样子,但我也可能会错过一些东西。

您的延迟可能会增加,您可能会丢失更多的数据包。这取决于发射器和接收器的位置。如果您在美国,并且试图与澳大利亚的UDP通信,您将获得相当高的延迟,您将遭受更多的数据包丢失/重新排序的数据包/重复,因为要传输的数据包有更长的距离和更多的路径。

如果您使用UDP作为传输协议,您必须在应用程序协议中保护传输。有几种方法可以做到这一点:

  • 包序列号
  • 数据包大小
  • 校验和
您应该将它们作为应用程序数据包的头发送,并在接收端检查它们

PS:如果您在协议的所有方面(不仅仅是部分方面)都依赖正确的数据包顺序和完整性,那么您应该切换到TCP。

这可能有点极端(!),但如果这很重要,您可以编写一个UDP代理来侦听传入的数据报并在其上转发它们。然后,您可以对此进行修改,以提供:

  • 潜伏期
  • 丢包
  • 数据包复制
  • 并指示您的客户端将数据发送到代理,并指示代理将数据发送到服务器(进行适当的数据包修改)

    就像我说的,也许是极端的。但是,即使存在LAN/internet,您也可以使用它在UDP不友好的环境中测试应用程序的行为


    编辑:肯定有人写过这样的东西吗?如果不是的话,我感觉到一个开源项目即将到来……

    简单的回答是:在局域网上,您可能会注意到UDP的很少权衡(好的和坏的),因为在局域网上很少会出问题

    你可能会丢失数据包。局域网拥塞或本地系统限制是最可能的原因

    当您离开LAN并依赖路由器时,将出现大多数UDP问题(碎片、重复数据包、延迟数据包、丢弃超过一定大小的数据包、缺少返回的错误消息)


    换句话说,使UDP复杂化的主要原因是“离开LAN”。

    我想说的是,您可能希望保护传输安全。例如,如果您接收到实时价格更新用于指示性目的,那么您很可能可以承受数据包丢失。您所说的碎片是什么意思?我将得到我的包的一半?我会在另一个读取上得到下半部分吗?不建议使用576,它是所有IPv4网络在没有碎片的情况下所保证的最小支持大小。IPv6将其增加到1500字节。