【问题标题】:Differentiate STUN, RTP, DTLS packets - java program区分STUN、RTP、DTLS数据包-java程序
【发布时间】:2015-04-03 01:43:34
【问题描述】:

我正在编写一个小型 UDP 服务器,它可能会在同一端口接收不同的 UDP 协议消息,例如 STUN、RTP、RTCP、DTLS 数据包。

我首先应该能够区分每种协议消息以执行不同的逻辑。

我在哪里可以找到 java 的示例,更好的库可以帮助我解决这个问题。

【问题讨论】:

  • 我的问题不是关于发送和接收 UDP 数据包的 java 示例,而是区分它们。
  • 除非每个协议都可以清楚地从另一个协议中识别出来,比如说,它们都有一个标头,那么这将是有问题的。您可以编写代码进行猜测,但它可能并非一直有效。我会问你为什么要在同一个端口上支持多个协议的问题,因为如果你可以避免它,这并不是你真正会做的事情。你这样做是在“打破 UDP 网络规则”。
  • 好吧,在我的情况下,STUN 和 RTP 必须接收到相同的端口才能处理端点之间的 NAT。所以我需要能够分别识别它们以对应响应这些数据包。
  • 不确定你想要达到什么目的,但如果是 NAT 问题,最好在操作系统级别处理,你知道

标签: java udp rtp stun multiplexing


【解决方案1】:

这是一个 c++ 版本,我确信它可以用 java 重写,但它让您知道该怎么做。顺便说一句,缓冲区变量保存最近收到的 udp 数据报。

 if((buffer[0]==0) || (buffer[0]==1))
      return stun; // STUN packet

 if((buffer[0]>=128) && (buffer[0]<=191))
      return rtp; // RTP packet

 if((buffer[0]>=20)  && (buffer[0]<=64))
      return dtls; // DTLS packet                                                               

【讨论】:

【解决方案2】:

我应该首先能够区分每种协议消息以便执行不同的逻辑。

为什么?我会简单地并行运行逻辑;即,将此端口上的每个数据包传递给每个逻辑。

逻辑应该被设计为忽略格式错误的请求(毕竟,如果它们要在开放的 Internet 上运行,它们应该足够强大,甚至可以处理恶意制作的数据包)。

如果某些传入请求是-polyglots-;即,它们在多个协议中有效,那么客户端将收到多个响应。在此设计中,由客户端代码处理不合法的响应。也许客户足够强大,可以忽略它们。或者客户端可能会从一开始就重试协议,可能会选择一个新的序列号或不再是多语言的东西(纯属运气)。

我认为这个问题没有“真正好的”解决方案,因为 UDP 数据包太小,无法浪费每个协议的唯一标识符空间。 UDP 协议旨在为不同的服务使用不同的端口。唯一“正确”的解决方案是将在同一端口上运行的服务放在不同的 IP 地址上。

【讨论】:

  • 到目前为止可能是最好的解决方案
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多