【问题标题】:Creating RTP packet with Python使用 Python 创建 RTP 数据包
【发布时间】:2020-05-27 11:02:42
【问题描述】:

我正在大学做项目。我想要做的是我希望我的程序能够更改 RTP 数据包有效负载中的位。我正在尝试创建一个简单的工具,将隐写术应用于 RTP 数据包的有效负载 - 首先它会“捕获”从我的计算机发送的 rtp 数据包,然后更改有效负载部分并将数据包进一步发送到目的地。我要做的第一件事(在学习时)是创建 RTP 数据包流。我以为我做到了,直到我检查了 Wireshark:

我们看到的只是UDP数据包(pythonsocket.SOCK_DGRAM

而且只是简单的比特数据流..

我正在尝试通过RCF 3550 创建数据包:

  • 版本 - 2 位;
  • 填充 - 1 位;
  • 扩展 - 1 位;
  • csrc_count - 4 位;
  • 标记 - 1 位;
  • payload_type - 7 位;
  • sequence_number - 16 位;
  • 时间戳 - 32 位;
  • ssrc - 32 位;
  • 有效载荷 - 变化;

我正在创建一个位列表:

    rtp_packet[0:2] = format(packet_data["version"], "b").zfill(2)
    rtp_packet[2:3] = format(packet_data["padding"], "b")
    rtp_packet[3:4] = format(packet_data["extension"], "b")
    rtp_packet[4:8] = format(packet_datas["csrc_count"], "b").zfill(4)
    rtp_packet[8:9] = format(packet_data["marker"], "b")
    rtp_packet[9:16] = format(packet_data["payload_type"], "b").zfill(7)
    rtp_packet[16:32] = format(packet_data["sequence_number"], "b").zfill(16)
    rtp_packet[32:64] = format(packet_datas["timestamp"], "b").zfill(32) # turi dideti po 160
    rtp_packet[64:96] = format(packet_data["ssrc"], "b").zfill(32)
    rtp_packet[96:128] = format(packet_data["csrc_list"], "b").zfill(32)
    rtp_packet[128:] = bin(int.from_bytes(packet_data["payload"].encode(), "big"))[2:]

然后通过创建的套接字发送这些字节。没用(结果如上)。然后我找到了这个PyRTP library,结果和上面一样。

我是 Python 和所有这些数据包的新手,所以也许有人可以帮助我解决我做错了什么或者我没有做的事情,Wireshark 仍然将这些数据包视为仅 UDP,而不是 RTP?下图是我希望做的(这是用家里的 SIP 服务器完成的)。提前谢谢!

【问题讨论】:

标签: python python-3.x sockets wireshark rtp


【解决方案1】:

RTP 是一种应用协议,它被封装在 UDP(网络协议)中,您可以使用 WireShark 验证您的数据包是 RTP 数据包:https://en.wikiversity.org/wiki/Wireshark/IPv4_multicast

【讨论】:

    【解决方案2】:

    Wireshark 实际上将音频/视频数据包理解为 UDP 数据包。 您可以使用菜单选项将这些 UDP 数据包转换为 RTP - https://support.hpe.com/hpesc/public/docDisplay?docId=c03617954&docLocale=en_US

    【讨论】:

      【解决方案3】:

      您可以使用scapy 库的rtp 功能创建该数据包并将其保存为pcap 文件(如question 中所做的那样):

      from scapy.all import *
      from scapy.all import wrpcap
      
      rtp = { "marker": 1,
              "payload_type": 0,
              "sequence": 27675,
              "timestamp": 3157624494,
              "sourcesync": 0x3f622544
      }
      pkt= Ether()/IP(src="10.0.0.10", dst="10.0.0.100")/UDP(sport=18529, dport=23570)/RTP(**rtp)
      wrpcap("rtp_pkt.pcap",pkt)
      

      然后您可以在命令行中在 Wireshark 中打开生成的 pcap 文件,并告诉它将端口 23570 解码为 RTP:

      wireshark -d udp.port==23570,rtp rtp_pkt.pcap
      

      还有其他基于 Python 的专用 RTP 库,例如 rtp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多