前言
今天看了一下论文数据,发现从Scapy里面读出来的数据大小,总比论文数据里面的小20,想了半天,百思不得其解,后来想到有可能是因为论文里面的数据大小是ip报文的payload,而并没有计算ip报文本身的header,查了一下,IPv4本身报文的大小确实是20。而且用Scapy 和 dpkt(论文用的包)分别查了一下确实都对应上了,ip报文的总大小(header+payload) 就是我所想的大小,而ip报文的payload大小就是论文里面写的数据大小。
正文
1. From Scapy
pkt = scapy_cap[3]
pkt.show()
Shows
###[ Ethernet ]###
dst = ac:cf:23:62:3c:6e
src = 00:b5:6d:06:08:ba
type = IPv4
###[ IP ]###
version = 4
ihl = 5
tos = 0xc0
len = 328
id = 32262
flags =
frag = 0
ttl = 64
proto = 17
chksum = 0xd235
src = 10.10.10.1
dst = 10.10.10.149
\options \
###[ UDP ]###
sport = 67
dport = 68
len = 308
chksum = 0x29ef
###[ BOOTP ]###
op = BOOTREPLY
htype = Ethernet (10Mb)
hlen = 6
hops = 0
xid = 0xabcd0001
secs = 0
flags =
ciaddr = 0.0.0.0
yiaddr = 10.10.10.149
siaddr = 10.10.10.1
giaddr = 0.0.0.0
chaddr = ac:cf:23:62:3c:6e (+ 10 nul pad)
sname = ''
file = ''
options = b'c\x82Sc' (DHCP magic)
###[ DHCP options ]###
options = [message-type=offer server_id=10.10.10.1 lease_time=86400 renewal_time=43200 rebinding_time=75600 subnet_mask=255.255.255.0 broadcast_address=10.10.10.255 interface-mtu=1500 name_server=10.10.10.1 router=10.10.10.1 end pad pad pad pad]
我们可以看见Scapy告诉我们,
- IP大小为328,这个是IP的payload+header的大小,
- 其payload就是UDP,我们可以看见UDP的大小为308,这个是UDP的payload+header的大小。
2. From DPKT
# Using dpkt to check size of ethernet and ip packet's size
f = open('/content/drive/MyDrive/07 - Datasets/IoT_Sentinel/captures_IoT_Sentinel/captures_IoT-Sentinel/EdnetGateway/Setup-A-1-STA.pcap', 'rb')
pcap = dpkt.pcap.Reader(f)
num = 1
for ts, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
ip = eth.data
print('[' + str(num) + ']')
num += 1
print(len(eth.data)) # This is the ethernet packet size, where the IP has more 20 size
if eth.type == dpkt.ethernet.ETH_TYPE_IP:
print(ip.len)
print(len(ip.data)) # This is the IP packet size,
Shows
...
[4]
328
328
308
...
我们可以看见DPKT一样告诉我们
- eth.data大小为328,这个是eth的payload的大小,然而eth的payload其实就是IP数据包,其实就是IP的header+payload,
- 所以当我们查询ip.len的时候,其实是328,
- 然后ip.data只包含IP的payload,也就是要去掉header(size=20),就剩下了308
总结
好好学习,计算机网络和各种protocol协议呀!
The general structure of the IPv4 packet is shown in Figure below. The minimum header (using no options, the most common situation) has a length of 20 bytes (always shown in a 4-bytes-per-line format), and a maximum length (very rarely seen) of 60 bytes.
IPv4数据包的一般结构如下图所示。 最小标头(不使用选项,最常见的情况)的长度为 20 字节(始终以每行 4 字节的格式显示),最大长度(很少见)为 60 字节。
参考
自己
Q.E.D.