为什么scapy模块不一致,在嗅探过程中丢失了固定数量的数据包?

2024-05-19 00:01:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个程序,把另外两个粘在一起: 多播接收器来自:

How do you UDP multicast in Python?

scapy数据包嗅探器:

https://thepacketgeek.com/scapy-sniffing-with-custom-actions-part-1/

我想知道为什么我的程序在包捕获方面不合适。当我捕获流量时,我使用等于1(秒)的超时。每隔3-5秒我就会看到捕获的数据包下降。我的源代码非常稳定(10.568Mbit/s)。我看到使用streamXpert程序时,比特率的值之间的差异大小不超过几十Kbits。
我想取得一致的,可靠的结果,但这样的下降 不可接受。总体效果良好。但我不知道是什么导致了这么大的落差。 下面是我的程序执行3次的结果,每个会话捕获10个1秒的样本,最后打印出来: https://pastebin.com/7pb0R3gr

我试着分析100个样本,每次嗅探持续0.1秒,以便更好地了解可能导致这个问题的原因。我看到有时会发生一些非常奇怪的下降,可能会超过实际价值的一半。 结果如下: https://pastebin.com/7jk2VStL

import socket
import struct
from collections import Counter
from scapy.all import sniff

MCAST_GRP = '239.0.1.104'
MCAST_PORT = 12345
IS_ALL_GROUPS = True

packet_counts = Counter()
capturedPacketsSize = 0
bitrateList = []

## Defining custom function that sums sizes of captured packets
def custom_action(packet):
    global capturedPacketsSize
    capturedPacketsSize += len(packet)    

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

if IS_ALL_GROUPS:
    # on this port, receives ALL multicast groups
    sock.bind(('', MCAST_PORT))
else:
    # on this port, listen ONLY to MCAST_GRP
    sock.bind((MCAST_GRP, MCAST_PORT))

#Creating socket that gets UDP multicast packets

mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

print("_____.:|   Starting analyse of bitrate!   |:._____")
for x in range(10):
    pkt = sniff(iface="eno4", filter="ip host 239.0.1.104", prn=custom_action, timeout=0.1)
    MCbitrate = round((capturedPacketsSize*8)/(1024*1024),3)
    bitrateList.append(MCbitrate)
    capturedPacketsSize = 0
for x in range(10):
    print("{0}\n".format(bitrateList[x]))

Tags: inhttpsimport程序comportcustomsocket

热门问题