我研究了片段偏移量有 13 位。考虑到较低层(网络层、数据链路层)的 MTU,在传输层进行分段。以太网格式表示最大数据范围为 48-1500 字节。如果数据链路层使用以太网协议,我们不需要缩放片段偏移量,因为 1500 字节可以是 13 位。通过使用数据链路层中的哪个协议,需要将片段偏移量缩放 8 倍?
缩放片段偏移
没有“比例因子”。片段偏移量为 13 位,因为 3 位用于标志。因为 IPv4 数据包的总长度可以是65,535,并且片段偏移量只有 13 位可用,所以每个片段有效负载(最后一个片段除外)的长度必须是 8 个八位字节(64 位)的倍数。这将包括通过以太网链路时大于以太网 MTU 的任何数据包。路由器以完全相同的方式对大于下一个接口的 MTU 的 IPv4 数据包进行分段(或不分段,如果设置了 DF 位),而不管下一个接口上的数据链路协议如何。
不要将单独的网络层混为一谈。请记住,当 IP 和以太网都在开发时,既不知道也不关心对方。很简单,两者最终都统治了行业,但它们是由完全不同的人独立开发的,并由完全不同的群体维护。
以太网既不知道也不关心有效载荷中的内容。有一个 Ether Type 字段告诉它应该将其有效负载传递给哪个进程,但它对有效负载一无所知。它可以承载 ARP、IPv4、IPX、IPv6、AppleTalk 等,它根本不在乎,因此多个网络层协议可以同时存在于一个以太网网络上。
IP(IPv4 或 IPv6)不知道也不关心哪个数据链路协议承载它。IP 适用于大量数据链路协议,例如 HDLC、PPP、以太网、ATM、帧中继、Wi-Fi、令牌环、FDDI 等,每个协议都有自己的 MTU。
IP 是为 IP 而开发的,而不是为任何特定的数据链路协议而开发的。您指的是以太网,但它已被 Wi-Fi 取代为 LAN 之王。带有 Wi-Fi 接口的设备比带有以太网接口的设备要多,而且 Wi-Fi 的 MTU 与以太网不同。MTU 基于物理和数据链路协议的要求,根本不关心任何上层协议。
另外,您指的是 IPv4。IPv6 不像 IPv4 那样在路由器上进行分段,并且 TCP 分段与 IPv4 分段非常不同。许多人将分割与碎片混淆,但它们却大不相同。
关于 IPv4 分片的完整解释可以参考_RFC 791, Internet Protocol :
碎片化
当互联网数据报起源于允许大数据包大小的本地网络并且必须遍历将数据包限制为较小大小的本地网络以到达其目的地时,需要对其进行分段。
可以将 Internet 数据报标记为“不分段”。如此标记的任何互联网数据报在任何情况下都不应被互联网分割。如果标记为不分段的 Internet 数据报在不分段的情况下无法传递到其目的地,则将其丢弃。
跨局域网的分段、传输和重组对 Internet 协议模块不可见,称为 Intranet 分段,可以使用 [6]。
互联网分段和重组过程需要能够将数据报分解成几乎任意数量的片段,以便以后重新组装。分片的接收方使用标识字段来保证不同数据报的分片不会混在一起。片段偏移字段告诉接收者片段在原始数据报中的位置。片段偏移量和长度决定了该片段所覆盖的原始数据报的部分。more-fragments 标志指示(通过被重置)最后一个片段。这些字段为重组数据报提供了足够的信息。
标识字段用于区分一个数据报的片段与另一个数据报的片段。互联网数据报的发起协议模块将标识字段设置为一个值,该值对于该源-目的地对和协议必须是唯一的,以便数据报在互联网系统中处于活动状态。完整数据报的始发协议模块将more-fragments 标志设置为零,并将片段偏移量设置为零。
为了对长互联网数据报进行分段,互联网协议模块(例如,在网关中)创建两个新的互联网数据报,并将互联网报头字段的内容从长数据报复制到两个新的互联网报头中。长数据报的数据在 8 个八位字节(64 位)边界上分为两部分(第二部分可能不是 8 个八位字节的整数倍,但第一部分必须是)。在第一部分 NFB 中调用 8 个八位字节块的数量(对于 Fragment Blocks 的数量)。数据的第一部分放在第一个新的互联网数据报中,总长度字段设置为第一个数据报的长度。more-fragments 标志设置为 1。数据的第二部分放在第二个新的互联网数据报中,总长度字段设置为第二个数据报的长度。more-fragments 标志携带与长数据报相同的值。第二个新互联网数据报的片段偏移字段设置为长数据报中该字段的值加上 NFB。
这个过程可以推广到 n 路拆分,而不是描述的双向拆分。
为了组装互联网数据报的片段,互联网协议模块(例如在目标主机上)将互联网数据报组合在一起,这些互联网数据报的四个字段都具有相同的值:标识、源、目标和协议。通过将每个片段的数据部分放置在该片段的 Internet 标头中的片段偏移指示的相对位置来完成组合。第一个片段的片段偏移量为零,最后一个片段的更多片段标志重置为零。