我使用参数-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获取此实际数据包长度的方式,而不会捕获整个数据包。
答案 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读取的数据包中