![在某些特殊情况下数据链路层可以进行IP分片吗?](https://linux22.com/image/715616/%E5%9C%A8%E6%9F%90%E4%BA%9B%E7%89%B9%E6%AE%8A%E6%83%85%E5%86%B5%E4%B8%8B%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82%E5%8F%AF%E4%BB%A5%E8%BF%9B%E8%A1%8CIP%E5%88%86%E7%89%87%E5%90%97%EF%BC%9F.png)
我正在阅读《TCP/IP 图解》第 1 卷,其中说 IP 分段是由网络层完成的。
到目前为止,我是这样理解这个概念的:网络层 (L3) 创建“IP 数据报”(IP 标头 + 数据)并将该字节数组发送到数据链路层 (L2)。如果 L2 不知道 IP 数据报结构,并且收到的字节数组大于最大大小,它就不知道如何拆分该字节数组并将 IP 标头附加到每个块,这是 L3 的职责。因此 L2 和 L3 必须以某种方式进行合作。
让我困惑的是,几页之后,当讨论 IP 报头、IP 数据报的总长度和最大大小时,它说:“虽然可以发送 65535 字节的 IP 数据报,大多数链接层将会分裂这一点”。
我的“概念”错了吗?L2 是否真的知道 IP 数据报结构,因此它可以对 IP 数据报进行分段?如果是这样,那么既然 L2 知道其 MTU,那么为什么它不总是进行分段呢?
答案1
IP 分片就是在 IP 层对数据报进行分割。重组工作,以及在某个片段丢失时可能进行的重新传输,意味着要避免碎片化。
底层第 2 层是独立的,将每个数据包(片段)包装在帧中。事实上,它所能做的就是通常 L2(以太网肯定不会)不会发生“碎片化”。
确定最佳尺寸并不是协调,更像是猜测,这被称为路径 MTU 发现。网络堆栈不太可能尝试最大 65535 字节。也许会返回 ICMP 消息,指出大小太大。尽管该路径可能从一开始就是以太网接口,因此尝试超过 1400 左右的任何值可能都行不通。
答案2
这种表述容易让人误解。IP 层知道链路层的最大有效负载大小,因此它会进行分片。
答案3
L2 不了解 IP,但它对帧大小有自己的限制。任何大于 L2 帧大小的 IP 数据报都将被拆分为 2 个或更多个 L2 帧。