scapy的预期丢包率是多少?

时间:2016-08-01 13:58:54

标签: python networking scapy

我想在SystemA的接口上侦听数据包。由于看起来我没有看到绝大多数传入的数据包,因此我以最简单的形式使用了scapy

import scapy.all as scapy

def filtre(p):
    if p.haslayer(scapy.IP):
        print(p[scapy.IP].src)

# Disable scapy verbosity
scapy.conf.verb = 0
scapy.sniff(iface="eth0", prn=filtre, store=0)

这是在SystemA上运行,输出发送到文件。

与此同时,我运行

    tcpdumpSystemA
  • SystemB
  • nmap SystemA -P0 SystemB

我们的想法是在nmap会话期间查看有多少数据包离开SystemB并到达SystemA。结果是

  • 根据两个tcpdump,1000个数据包离开SystemB并到达SystemA
  • SystemB
  • scapy注册了SystemA的来源IP 仅约150到200个

我做了几次测试,tcpdump次会话没有(他们没有改变结果AFAICT),并通过scapy获得不同数量的数据包 - 在150-200范围内。< / p>

这是在局域网上,SystemB是debian,SystemA是RPi3。我可以期待一些数据包不能注册,但不是80%到90%。同时tcpdump系统地在两个系统上注册预期的1000个数据包。

我有什么遗失的吗?

编辑:50个数据包(nmap SystemA -p1-50 -P0)的相同测试很好,scapy注册所有50个数据包。

1 个答案:

答案 0 :(得分:0)

您可能想尝试使用不使用输出的东西(因为这可能是瓶颈)。此外,如果线路上有不需要的数据包,您可以使用BPF过滤器。此外,由于您不需要剖析IP有效负载,因此可以防止Scapy解析整个数据包层。

from collections import Counter
import scapy.all as scapy

sources = Counter()

def count_pkts(p):
    global sources
    if scapy.IP in p:
        sources[p[scapy.IP].src] += 1

# Disable scapy verbosity
scapy.conf.verb = 0
# Prevent Scapy from dissecting IP payloads
scapy.IP.payload_guess = []
# Optionally, use filter="ip and src x.y.z.t"
scapy.sniff(iface="eth0", prn=count_pkts, store=0, filter="ip")
print sources