C# 如何确定数据包是否为RTP/RTCP?
我正在使用基于WinPCap的SharpPCap来捕获UDP流量。我的最终目标是从H.323中捕获音频数据,并将这些电话对话保存为WAV文件。但第一件事是首先-我需要弄清楚我的UDP数据包是通过NIC的 SharpPCap提供了一个UdpPacket类,允许我访问消息的PayloadData。但我不确定如何处理这些数据。这是一个Byte[]数组,我不知道如何确定它是RTP还是RTCP数据包C# 如何确定数据包是否为RTP/RTCP?,c#,udp,rtp,sharppcap,rtcp,C#,Udp,Rtp,Sharppcap,Rtcp,我正在使用基于WinPCap的SharpPCap来捕获UDP流量。我的最终目标是从H.323中捕获音频数据,并将这些电话对话保存为WAV文件。但第一件事是首先-我需要弄清楚我的UDP数据包是通过NIC的 SharpPCap提供了一个UdpPacket类,允许我访问消息的PayloadData。但我不确定如何处理这些数据。这是一个Byte[]数组,我不知道如何确定它是RTP还是RTCP数据包 我在谷歌上搜索过这个话题,但没有太多。感谢您的帮助 我会查看Wireshark中的数据包检测器,它可以解码
我在谷歌上搜索过这个话题,但没有太多。感谢您的帮助 我会查看Wireshark中的数据包检测器,它可以解码最常用的协议。我认为您需要查看RTP数据包之前的SIP数据包
有。请查看以下中RTP和RTCP数据包的定义: 我不会为上面的所有内容复制这个传说——它相当长——但请看一看
有了它,您将看到您无法确定数据包是否包含RTP/RTCP。正如其他海报所建议的那样,最好是嗅嗅一下媒体流谈判。第二个最好的方法是对一系列数据包进行某种模式匹配:前两位为10,后两位为常量,第9位至第15位为常量,然后16->31递增,依此类推。如果通过RTSP进行通信,请查看在设置时协商的udp端口 udp端口将告诉您它是RTP还是RTCP(还值得注意的是,RTP通常在偶数端口号上完成,RTCP在奇数端口号上完成)
最后,如果您通过RTSP进行通信,您可以从描述中的SDP文件中获取有效负载编号列表,然后检查RTP头中的有效负载类型,告诉编解码器您需要解码有效负载。我感谢您的努力,但这并不能真正回答我的问题。我对数据包结构的理论知识更感兴趣,这样我就能理解如何着手解决这个问题。如何确定UDP数据包实际上是RTP或RTCP数据包?我在UDP标头中找不到任何有助于此的内容。UDP标头中的任何内容都不会告诉您端口号。你需要对数据包数据进行模式匹配。我想我开始发现这个谜题的意义远不止这些。我们试图检测来自H.323协议的通信量,我读到的是,它还使用了一组TCP端口来在RTP通信量开始之前设置通信。到目前为止,我还没找到关于如何捕获流量的好信息。谢谢brickner。我们关注的是H.323流量,而不是SIP流量,因此情况有所改变。现在看起来很复杂,谢谢你,弗兰克。事实证明,检查RTP报头中的字节以及基本上检查版本和负载类型就足以确定它是否是RTP数据包。至少到目前为止,我还没有在网络上找到任何其他具有相同前几位的数据包。寻找那个,然后SSRC就足以找出哪些数据包是RTP。但是,我换了工作,不必担心这个问题的其余部分,所以你得到了复选标记!
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 |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+