От 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 от других пакетов UDP, вы должны посмотреть на формат пакета, как описано в RC 6347. Качество вашего обнаружения зависит от используемой технологии проверки, то есть если вы ограничиваете себя совпадением только с некоторыми байтами (например, полями версии или типа), если вы получаете больше контекста (имеет ли длина смысл) или если у вас даже есть обнаружение движки для других протоколов, так что вы можете быть более уверены, что это DTLS, а не что-то еще.