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 パケットと見なします。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 パケットを正しく区別できることがわかります。どうすればいいのですか?