Scapy为什么要重新计算碎片大小?

问题描述 投票:0回答:1

我正在尝试将120字节的IP有效负载除以100字节。但是,在输出中,我得到了两个包,一个包138个字节,另一个包50个字节(以太网和IP报头大小分别为14和20个字节)。在第一个数据包中,数据偏移量从0到103开始,对于第二个数据包,数据偏移量从104到119开始。首先,我不明白为什么它会以这种方式工作。为了理解,我尝试查看layers/inet.py line 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

有人可以解释为什么这样做吗?

N.B:

  • 以太网报头大小14字节
  • IPv4标头大小20字节
python-3.x ip scapy ethernet
1个回答
0
投票

请参见https://github.com/secdev/scapy/issues/2424#issuecomment-576879663

https://tools.ietf.org/html/rfc791#section-3.2(第25页,顶部):

如果Internet数据报是分段的,则其数据部分必须在8个八位位组边界上断开。

要回答您的问题,片段大小必须是8的倍数。104是8的倍数,而不是100的整数

© www.soinside.com 2019 - 2024. All rights reserved.