前言

今天看了一下论文数据,发现从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告诉我们,

  1. IP大小为328,这个是IP的payload+header的大小,
  2. 其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一样告诉我们

  1. eth.data大小为328,这个是eth的payload的大小,然而eth的payload其实就是IP数据包,其实就是IP的header+payload,
  2. 所以当我们查询ip.len的时候,其实是328,
  3. 然后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 字节。

image.png

参考

自己

Q.E.D.


立志做一个有趣的碳水化合物