从RFC 5764:
+----------------+
| 127 < B < 192 -+--> forward to RTP
| |
packet --> | 19 < B < 64 -+--> forward to DTLS
| |
| B < 2 -+--> forward to STUN
+----------------+
其中B是数据包的第一个字节。因此,对于DTLS数据包识别,我们在将数据转换为无符号char *之后执行以下操作:
if(packet[0] > 19 && packet[0] < 64)
这仅适用于RTP,DTLS和STUN数据包。但是对于UDP,TCP等失败。如果我发送的第一个字节在20到63之间的UDP数据包,则上述条件将其视为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是一种数据报协议,因此通常根本不在TCP之上使用。在TCP上,通常可以找到TLS。
由于DTLS通常在UDP之上使用,因此任何DTLS数据包都是有效的UDP数据包,但不是其他方法。
为了将DTLS数据包与其他UDP数据包区分开,您应该查看RC 6347中描述的数据包格式。检测的质量取决于使用的检测技术,也就是说,如果您限制自己仅匹配某些字节(例如版本或类型字段),获得更多的上下文(长度有意义)或者甚至具有检测能力其他协议的引擎,以便您可以更确定它是DTLS而不是其他内容。
关于c++ - 如何区分DTLS数据包与TCP,UDP数据包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27351714/