代码之家  ›  专栏  ›  技术社区  ›  Chris Holmes

如何确定数据包是否为rtp/rtcp?

  •  11
  • Chris Holmes  · 技术社区  · 14 年前

    我正在使用基于winpcap的sharppcap来捕获UDP流量。我的最终目标是从H.323中捕获音频数据,并将这些电话会话保存为wav文件。但首先,我需要弄清楚我的UDP数据包是通过网卡的。

    sharpcpap提供了一个udppacket类,它允许我访问消息的payloaddata。但我不确定如何处理这些数据。它是一个byte[]数组,我不知道如何确定它是一个rtp包还是rtcp包。

    我在谷歌上搜索过这个话题,但没有太多。感谢您的帮助。

    4 回复  |  直到 10 年前
        1
  •  5
  •   Frank Shearar    14 年前

    查看中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             |
    |                             ....                              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    

    我不会复制上面所有的传说-很长-但是看看 Section 5.1 .

    有了它,你会发现没有很多事情可以确定 数据包包含rtp/rtcp。最重要的是,正如其他海报所暗示的,嗅探媒体流的谈判。第二个最好是在一系列数据包上进行某种类型的模式匹配:前两位是10,后两位是常量,后两位是常量,第9位到第15位是常量,然后16->31递增,依此类推。

        2
  •  2
  •   Yann Ramin    14 年前

    我将研究wireshark中的包检测器,它可以解码可用的最常见协议。

        3
  •  0
  •   brickner    14 年前

    我相信你需要看看RTP包之前的SIP包。

    a discussion on this issue on Pcap.Net site .

        4
  •  0
  •   Cripper    10 年前

    如果通过RTSP进行通信,请查看在安装时协商的UDP端口。

    UDP端口将告诉您它是RTP还是RTCP(也值得注意的是,RTP通常是通过偶数端口号和奇数端口上的RTCP完成的)。

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

    推荐文章