Почему Scapy пересчитывает размер фрагментации? - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь фрагментировать полезную нагрузку 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 байт

1 Ответ

1 голос
/ 22 января 2020

См. https://github.com/secdev/scapy/issues/2424#issuecomment -576879663

С https://tools.ietf.org/html/rfc791#section -3,2 (стр. 25, вверху):

Если датаграмма inte rnet фрагментирована, ее часть данных должна быть разбита на границы 8 октетов.

Чтобы ответить на ваш вопрос, размер фрагмента должен быть кратным 8. 104 - кратным 8, не 100

...