【问题标题】:How do I determine if a packet is RTP/RTCP?如何确定数据包是否为 RTP/RTCP?
【发布时间】:2024-01-11 06:18:02
【问题描述】:

我正在使用基于 WinPCap 构建的 SharpPCap 来捕获 UDP 流量。我的最终目标是从 H.323 捕获音频数据并将这些电话对话保存为 WAV 文件。但首先是第一件事——我需要弄清楚我的 UDP 数据包通过 NIC 是什么。

SharpPCap 提供了一个 UdpPacket 类,让我可以访问消息的 PayloadData。但我不确定如何处理这些数据。这是一个 Byte[] 数组,我不知道如何确定它是 RTP 还是 RTCP 数据包。

我在 Google 上搜索过这个主题,但没有太多内容。任何帮助表示赞赏。

【问题讨论】:

    标签: c# udp rtp sharppcap rtcp


    【解决方案1】:

    查看RFC 3550中RTP和RTCP数据包的定义:

     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             |
    |                             ....                              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    

    我不会复制以上所有的传说 - 它很长 - 但看看 Section 5.1

    有了这些,您会发现您无法确定一个数据包是否包含 RTP/RTCP。正如其他海报所建议的那样,最好的办法是嗅探媒体流协商。第二个最好的方法是对一系列数据包进行某种模式匹配:前两位为 10,接下来的两位为常数,随后位 9 到 15 为常数,然后 16 -> 31 递增,并且以此类推。

    【讨论】:

    • 谢谢弗兰克。事实证明,检查 RTP 标头中的字节并检查版本和有效负载类型足以确定它是否是 RTP 数据包。至少到目前为止,我还没有在网络上发现任何其他具有相同前几位的数据包。寻找那个然后 SSRC 就足以确定哪些数据包是 RTP。但是,我换了工作,不用担心这个问题的其余部分,所以你得到了复选标记!
    【解决方案2】:

    我会看看 Wireshark 中的数据包检测器,它可以解码大多数可用的常见协议。

    【讨论】:

    • 我很欣赏努力剧院,但它并没有真正回答我的问题。我真的对包结构的理论知识更感兴趣,所以我可以理解如何解决问题。如何确定 UDP 数据包实际上是 RTP 还是 RTCP 数据包?我在 UDP 标头中找不到任何有助于解决此问题的内容。
    • 除了端口号之外,UDP 标头中的任何内容都不会告诉您。您需要对数据包数据进行模式匹配。
    • 我想我开始发现这个谜题远比表面上看到的要多。我们正在尝试检测来自 H.323 协议的流量,而我正在阅读的是它使用大量 TCP 端口以及在 RTP 流量开始之前设置通信。到目前为止,我在找到有关如何捕获此流量的好信息方面运气不佳。
    【解决方案3】:

    我认为您需要查看 RTP 数据包之前的 SIP 数据包。

    a discussion on this issue on Pcap.Net site

    【讨论】:

    • 感谢砖匠。我们正在查看 H.323 流量而不是 SIP,因此会有所改变。在这一点上看起来相当复杂。
    【解决方案4】:

    如果通过 RTSP 进行通信,请查看在 SETUP 时协商的 udp 端口​​。

    udp 端口​​会告诉您它是 RTP 还是 RTCP(还值得注意的是 RTP 通常在偶数端口号上完成,而 RTCP 在奇数上完成)。

    最后,如果您通过 RTSP 进行通信,您可以从 DESCRIBE 的 SDP 文件中获取有效负载编号列表,然后检查 RTP 标头中的有效负载类型,以告知编解码器您需要解码有效负载。

    【讨论】: