Я пытаюсь фрагментировать полезную нагрузку IP 120 байтов на 100 байтов. Однако на выходе я получил два пакета: один с 138 байтами, а другой с 50 байтами (Ethe rnet и размер заголовка IP составляют 14 и 20 байтов соответственно). В первом смещение пакетных данных начинается с 0 до 103, а для второго смещение пакетных данных начинается с 104 до 119. Во-первых, я не могу понять, почему это работает таким образом. Чтобы понять, я попытался найти источник определенной функции фрагмента в строке layer / inet .py 552 .
Scapy пересчитывает размер фрагментации следующим образом:
def fragment(self, fragsize=1480):
"""Fragment IP datagrams"""
fragsize = (fragsize + 7) // 8 * 8 # <- RECALCULATION OF FRAGMENT SIZE
lst = []
fnb = 0
fl = self
while fl.underlayer is not None:
fnb += 1
fl = fl.underlayer
for p in fl:
s = raw(p[fnb].payload)
nb = (len(s) + fragsize - 1) // fragsize
for i in range(nb):
q = p.copy()
del(q[fnb].payload)
del(q[fnb].chksum)
del(q[fnb].len)
if i != nb - 1:
q[fnb].flags |= 1
q[fnb].frag += i * fragsize // 8
r = conf.raw_layer(load=s[i * fragsize:(i + 1) * fragsize])
r.overload_fields = p[fnb].payload.overload_fields.copy()
q.add_payload(r)
lst.append(q)
return lst
Может кто-нибудь объяснить, почему это так?
NB:
- Ethe rnet размер заголовка 14 байт
- размер заголовка IPv4 20 байт