整包长度Scapy

时间:2014-02-13 11:13:54

标签: python wireshark packet scapy

我使用参数-s 100使用tcpdump捕获WiFi流量(这意味着我只捕获数据包的标头)。

当我加载.pcap文件并使用Scapy处理它时,我会这样做:

pkts = rdpcap(pcapfile)
totalbytes = 0
for pkt in pkts:
    totalbytes += len(pkt)

但是,当我截断捕获时,执行len(pkt)不会给我整个数据包长度(帧长度),它会给我捕获的数据包长度< / strong>即可。如何获得真正的数据包长度?

额外:正如我之前在某些场合所做的那样,我在 wireshark 中打开pcap文件并搜索感兴趣的十六进制值。但在这种情况下( frame.len )将显示我正在寻找的值,但我找不到wireshark获取此实际数据包长度的方式,而不会捕获整个数据包。

3 个答案:

答案 0 :(得分:2)

rdpcap函数使用PcapReader类来读取数据包。不幸的是,这个类丢弃了你在read_packet方法中寻找的信息,即使它可以在pcap文件中找到。所以你必须直接使用RawPcapReader

totalbytes = 0
for pkt, (sec, usec, wirelen) in RawPcapReader(pcapfile):
    totalbytes += wirelen

答案 1 :(得分:0)

如果由于某些原因您不想使用RawPcapReader,则可以将len属性用于IPv4数据包。

real_length = pkt[IP].len
truncated_length = len(pkt)

奇怪的是,Scapy中的IPv6层没有相同的属性,但确实有一个称为plen的属性,它是有效负载的长度:

payload_length = pkt[IPv6].plen
real_length = payload_length + 40
truncated_length = len(pkt)

答案 2 :(得分:0)

对于现代的Scapy版本,正确的答案是使用pkt.wirelen。这仅存在于从pcap读取的数据包中