【问题标题】:How to distinguish a DTLS packet from TCP, UDP packet如何区分 DTLS 数据包与 TCP、UDP 数据包
【发布时间】:2015-02-05 17:42:29
【问题描述】:

来自RFC 5764

               +----------------+
               | 127 < B < 192 -+--> forward to RTP
               |                |
   packet -->  |  19 < B < 64  -+--> forward to DTLS
               |                |
               |       B < 2   -+--> forward to STUN
               +----------------+

其中 B 是数据包的第一个字节。因此,对于 DTLS 数据包识别,我们在将数据转换为 unsigned char* 后执行以下操作,

if(packet[0] > 19 && packet[0] < 64)

这仅适用于 RTP、DTLS 和 STUN 数据包。但 UDP、TCP 等失败。如果我发送的 UDP 数据包的第一个字节在 20 到 63 之间,则上述条件将其视为 DTLS 数据包。来自google的源码DTLS包识别是这样完成的,

static bool IsDtlsPacket(const char* data, size_t len) {
  const uint8* u = reinterpret_cast<const uint8*>(data);
  return (len >= 13 && (u[0] > 19 && u[0] < 64));
}

但这也不能正确识别 DTLS 数据包。在wireshark中我可以看到它可以正确地区分DTLS数据包和UDP/TCP数据包。我该怎么做?

【问题讨论】:

  • 看看 Wireshark 源代码怎么样?
  • 我得到了源代码。看着它。谢谢。

标签: c++ tcp udp packet dtls


【解决方案1】:

RFC 5764 只关心 RTP、STUN 和 DTLS,而不关心其他数据。在这种情况下,区分这些格式的算法就足够了。如果你想将 DTLS 与一般的 UDP/TCP 区分开来,你必须知道

  • DTLS 是一种数据报协议,因此通常根本不在 TCP 之上使用。在 TCP 上,您通常会找到 TLS。
  • 由于 DTLS 通常在 UDP 之上使用,因此任何 DTLS 数据包都是有效的 UDP 数据包,但反之则不然。

要区分 DTLS 数据包和其他 UDP 数据包,您应该查看 RC 6347 中描述的数据包格式。您的检测质量取决于所使用的检测技术,也就是说,如果您限制自己仅匹配某些字节(如版本或类型字段),如果您获得更多上下文(长度是否有意义),或者您是否有检测其他协议的引擎,这样您就可以更加确定它是 DTLS 而不是其他东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多