gpt4 book ai didi

c++ - 如何区分DTLS数据包和TCP、UDP数据包

转载 作者:行者123 更新时间:2023-11-28 06:32:03 25 4
gpt4 key购买 nike

来自 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 数据包。我该怎么做?

最佳答案

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

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

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

关于c++ - 如何区分DTLS数据包和TCP、UDP数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27351714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com