0

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

4

1 に答える 1

1

RFC 5764 は、RTP、STUN、および DTLS のみを考慮し、他のデータは考慮しません。このコンテキストでは、これらの形式を区別するアルゴリズムで十分です。DTLS を一般的な UDP/TCP と区別したい場合は、次のことを知っておく必要があります。

  • DTLS はデータグラム プロトコルであるため、通常、TCP の上ではまったく使用されません。TCP では通常、代わりに TLS を見つけます。
  • 通常、DTLS は UDP の上で使用されるため、すべての DTLS パケットは有効な UDP パケットですが、その逆ではありません。

DTLS パケットを他の UDP パケットと区別するには、 RC 6347で説明されているパケット形式を確認する必要があります。検出の品質は、使用する検査技術に依存します。つまり、一部のバイト (バージョンまたはタイプ フィールドなど) のみに一致するように制限する場合、さらにコンテキストを取得する場合 (長さは意味がありますか)、または検出さえある場合です。他のプロトコル用のエンジンも使用できるため、それが DTLS であり、他のものではないことをより確実にすることができます。

于 2014-12-08T05:51:32.763 に答える