0

我在接下来的几天里学习 udp。这个周末我将参加那些 72 小时的比赛之一,我希望我的 UDP 代码在比赛结束前在线工作。在比赛期间,我不会有任何互联网(所以没有打电话给某人并让他们测试)。

我知道一些关于 UDP 的问题,比如数据包进来两次,没有进来几个帧(但我不知道我应该期望多长时间),推荐的字节大小(576)等等。我应该知道什么关于 UDP 编程?

但是从局域网迁移到互联网后,你会发生哪些事情呢?

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

4

4 回答 4

0

简短的回答是:在 LAN 上,您可能很少注意到 UDP 的权衡(好的和坏的),因为在 LAN 上很少会出错。

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

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

换句话说,使 UDP 变得复杂的大部分原因是“离开 LAN”。

于 2009-04-29T06:32:50.793 回答
0

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

  1. 潜伏
  2. 丢包
  3. 数据包复制

并指示您的客户端将数据发送到代理,并将代理(通过适当的数据包修改)定向到服务器。

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

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

于 2009-04-28T21:56:44.717 回答
0

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

于 2009-04-28T21:23:42.237 回答
0

如果您使用 UDP 作为传输协议,则必须在应用程序协议中保护您的传输。做这件事有很多种方法:

  • 包序号
  • 数据包大小
  • 校验和

您应该将这些作为应用程序数据包的标头发送并在接收端检查它们。

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

于 2009-04-28T21:30:21.533 回答