【问题标题】:How to efficiently tie a UDP Packet to an entity如何有效地将 UDP 数据包绑定到实体
【发布时间】:2014-11-14 13:22:25
【问题描述】:

到目前为止,我的应用程序一直使用 TCP 连接,但过了一段时间我决定继续并开始通过 UDP 数据包发送一些信息。我正在开发的应用程序是一个业余爱好者游戏项目,我现在通过 UDP 数据包而不是 TCP 数据包发送运动。

我面临的问题是将 UDP 数据包有效地链接到一个实体,在本例中是一个用户。

这是我目前的设置:

  • Account 类有一个 UUID 变量
  • 当 TCP 客户端成功连接后,TCP 服务器会告诉客户端它的 UUID 是什么。
  • UUID 然后作为 UDP 数据包的“标头”发送
  • 当服务器收到UDP报文时,服务器会在头中找到UUID对应的账号,然后进行相应的逻辑处理。

问题是,UUID 是一个相当大的字符串,这对带宽不是很友好,我可以轻松地使用整数而不是引用 List<Account> 上的帐户索引的字符串,但问题在于这就是安全性——这意味着任何人都可以发送带有某人帐户索引(分别为 1、2、3、4、5、6 等)的 UDP 数据包,并使用此“欺骗”或假数据包对其帐户执行操作。

UUID 没有遇到这个问题,虽然同样的安全问题仍然存在,但某人知道其他用户 UUID 的可能性极小。

在不涉及大的安全风险和不破坏带宽的情况下,将数据报包绑定到帐户的最佳方法是什么。

【问题讨论】:

    标签: java sockets udp


    【解决方案1】:

    一个 UUID 适合 16 个字节(两个 long 原语),所以在事情的方案中,我认为你真的不需要太在意它的大小。只是不要将其作为字符串传输。

    【讨论】:

    • 那么它究竟是如何传输的呢?您说它是两个长原语,例如我正在使用 DataOutputStream,我将如何处理这个问题。 (我如何从 UUID 中获取第一个 long 和最后一个 long,然后更是如此,我将如何使用这两个 long 再次创建 UUID)
    【解决方案2】:

    您可以使用数据包的源地址。

    如果您正在接收带有DatagramChannel 的数据报,receive 将返回源地址。如果您使用的是DatagramSocket,您可以在收到数据包后通过调用getSocketAddress 来获取数据包的地址。

    这仍然不是完全安全的,因为如果有人知道,他们可能会欺骗别人的地址,尽管它的开销为 0。

    【讨论】:

    • 我宁愿使用一点开销也不愿有这么容易搞砸的东西,找到某人的 IP 地址并不难。
    • 好吧,他们也需要端口号,但我同意您应该对重要的事情有更高的安全性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多