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