如何区分DTLS数据包与TCP,UDP数据包

时间:2014-12-08 05:03:34

标签: c++ tcp udp packet dtls

来自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等失败。如果我发送的第一个字节在20到63之间的UDP数据包,则上述条件将其视为DTLS数据包。来自谷歌的源代码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数据包。我该怎么做?

1 个答案:

答案 0 :(得分:1)

RFC 5764仅关注RTP,STUN和DTLS,而不关心其他数据。在这种情况下,区分这些格式的算法就足够了。如果要将DTLS与常规UDP / TCP区分开来,您必须知道

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

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