如何用Python捕获UDP数据包并查找TTL值

2 投票
2 回答
3153 浏览
提问于 2025-04-15 19:54

你好

我想通过加入一个多播组来捕获UDP数据包。在接收到数据包后,我想检查这个UDP数据包的TTL值。我该如何用Python来实现这个呢?

下面是示例代码: 这里的 rec_port 是我用来绑定的任意端口,比如:9180 rec_hostname 是我加入的任意多播组,比如:239.2.2.2

 #! /usr/bin/env python
    .........
    ............
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(("", rec_port))
    mreq = struct.pack("4sl", socket.inet_aton(rec_hostname), socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    total_length = 0
    while True:
            print "Waiting for the packets, if no packets recevied by 10 seconds, than i will exit"
            sock.settimeout(10)
            data , address = sock.recvfrom(2048)
            if len(data) > 1:
                                    total_length=total_length + len(data)
                                    print "Data is:", data
                                    print "Length of data received is:", len(data)
                                    print "Packet recevied from :", address[0]
                                    print "Total Packet size:", total_length
            else:
                    break
    sock.close()
    print "Total Packet size:", total_length

2 个回答

0

在评论中,你告诉我们你能够加入多播组。

现在你可以使用 getsockopt() 这个函数,设置 IPPROTO_IP 作为级别参数,然后用 IP_MULTICAST_TTL 作为选项,来获取写入到发出的数据包中的生存时间(TTL)值。

2

你可能想用这个 Python 包。如果这个不合适,你可以自己封装一下libpcap

回应 unwind: 你不需要用 libpcap 去做“混乱”的事情,你可以注入和监听有效的流量,也就是那些是发给你网络接口卡(NIC)的流量。

编辑: 阅读这个关于pcap的教程,了解如何提取 ttl 字段。

撰写回答