关于 IPV4 片段的规则并将它们拼凑在一起

网络工程 ip IPv4 协议论 碎片化
2022-02-06 16:42:26

我正在为 DOS 推出我自己的 TCP/IP 堆栈,我对 IPV4 数据包有疑问。

假设客户端发送多个 IPV4 片段,我预测将为除最后一个片段之外的每个片段设置 MF 标志。

我将它设置在我有 64KB 内存空间的地方,因此片段可以按任何顺序到达。

是否要求任何类型的客户端按从第一组字节到最后一组字节的顺序发送片段?或者客户端可以按任何顺序发送任何片段(例如,最后一个片段,最后一个片段)甚至跳过一些片段偏移量(例如,在偏移量 0 处发送一个 1000 字节的片段,然后在偏移量 3000 处发送另一个 1000 字节的片段并且在两者之间的偏移处没有片段)?

2个回答

我将它设置在我有 64KB 内存空间的地方,因此片段可以按任何顺序到达。

64K 缓冲区实际上是一个错误,因为它会导致特定的片段攻击,坏人可以发送总计超过 64K 的数据包,从而导致缓冲区溢出。

是否要求任何类型的客户端按从第一组字节到最后一组字节的顺序发送片段?

当 MTU 从一个网络缩小到下一个网络时,数据包会被路径中的路由器分段,并且数据包太大而无法容纳新的 MTU。分片是按顺序发送的,但不能保证它们会按顺序到达,并且任何时候都可能发生乱序的数据包接收。数据包可以并且确实会一直丢失,您需要丢弃带有丢失片段的数据包。

是否要求任何类型的客户端按从第一组字节到最后一组字节的顺序发送片段?

它们以这种方式发送,但可能不会按该顺序接收。

片段甚至可能会丢失,这需要您丢弃数据包的其余部分。

谨防恶意或错误数据包突破 2^16 字节限制。

分段和重组在RFC 791中有详细说明。