我正在大学从事项目。我想做的是我希望我的程序能够更改 RTP 数据包有效负载中的位。我正在尝试创建一个简单的工具,对 RTP 数据包的有效负载应用隐写术 - 首先它会“捕获”从我的计算机发送的 rtp 数据包,然后更改有效负载部分并将数据包进一步发送到目的地。我要做的第一件事(在学习时)是创建 RTP 数据包流。我以为我成功了,直到我检查了 Wireshark:
我们看到的只是UDP数据包(python socket.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 服务器完成的)。预先感谢您!
最佳答案
RTP 是一种应用协议(protocol),它被封装在 UDP(网络协议(protocol))中,您可以使用 WireShark 验证您的数据包是否为 RTP 数据包,如下所示:https://en.wikiversity.org/wiki/Wireshark/IPv4_multicast
关于python - 使用Python创建RTP数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62041552/