我正在使用参数-s 100
通过tcpdump捕获WiFi流量(这意味着我仅在捕获数据包的标头)。
当我加载.pcap文件并用Scapy处理时,我这样做:
pkts = rdpcap(pcapfile)
totalbytes = 0
for pkt in pkts:
totalbytes += len(pkt)
但是,当我截断捕获时,执行len(pkt)
不会给我完整的数据包长度(帧长度),而是给我已捕获的数据包长度。如何获得真实的数据包长度?
Extra:就像我之前在某些场合所做的那样,我在wireshark中打开pcap文件并搜索感兴趣的十六进制值。但是在这种情况下(frame.len)将显示我正在寻找的值,但是我找不到在没有捕获整个数据包的情况下wirehark获取此实际数据包长度的方法。
rdpcap
函数使用PcapReader
类读取数据包。不幸的是,即使可以在pcap文件中找到该类,该类也会丢弃您在read_packet
方法中寻找的信息。因此,您必须直接使用RawPcapReader
。
totalbytes = 0
for pkt, (sec, usec, wirelen) in RawPcapReader(pcapfile):
totalbytes += wirelen
如果由于某些原因您不想使用RawPcapReader,则可以将len
属性用于IPv4数据包。
real_length = pkt[IP].len
truncated_length = len(pkt)
对于现代的Scapy版本,正确的答案是使用pkt.wirelen
。仅存在于从pcap读取的数据包中]