パケットがRTP/RTCPかどうかを判断するにはどうすればよいですか?
質問
WinpCapに構築されたSharppcapを使用して、UDPトラフィックをキャプチャしています。私の最終目標は、h.323からオーディオデータをキャプチャし、それらの電話での会話をWAVファイルとして保存することです。しかし、最初は最初です - 私は自分のUDPパケットがNICを越えているものを把握する必要があります。
Sharppcapは、メッセージのPayloadDataにアクセスできるudppacketクラスを提供します。しかし、私はこのデータをどうするか確信が持てません。これはバイト[]配列であり、RTPまたはRTCPパケットかどうかを判断する方法がわかりません。
私はこのトピックをグーグルで検索しましたが、そこにはあまりありません。どんな助けも感謝しています。
解決
RTPおよびRTCPパケットの定義を見てください RFC 3550:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
私は上記のすべての伝説を再現しません - それはかなり長いです - しかし、見てください セクション5.1.
それを手にして、あなたはあなたができることはあまりないことがわかります a パケットにはRTP/RTCPが含まれています。何よりも、他のポスターが示唆しているように、メディアストリームの交渉が嗅ぐことです。 2番目のベストは、パケットのシーケンスで一致するパターンのある種です。最初の2つのビットは10で、次の2つのビットが一定になり、続いて9〜15が一定、次に16-> 31の増分、およびすぐ。
他のヒント
Wiresharkのパケット検出器を見てみましょう。Wiresharkは、利用可能な最も一般的なプロトコルをデコードできます。
RTPパケットの前に来るSIPパケットを見る必要があると思います。
RTSPを介して通信が行われている場合は、セットアップ時にネゴシエートされたUDPポートをご覧ください。
UDPポートは、RTPまたはRTCPであるかどうかを示します(通常、RTPはポート番号やRTCPでもODDで行われていることに注意してください)。
最後に、RTSPを介して通信する場合は、SDPファイルからペイロード番号のリストを説明してから、RTPヘッダーのペイロードタイプをチェックして、ペイロードをデコードする必要があるコーデックを伝えることができます。