数据碎片在哪里,基于什么规则?

网络工程 ip 协议论 碎片化
2022-02-22 05:56:12

当数据从应用层传到传输层时:数据可能会被分片成数据段,然后传输层会被添加到传输层头(可以是TCP头,也可以是UDP头)。

但我有一个问题,数据在哪里被分割成碎片(在应用层?),它是基于MTU什么?

2个回答

它发生在 IP 数据包被传递到链路级别时,正如您所说,取决于 MTU。每个链路通常都有自己的 MTU。

该过程在第 23 页的Internet 协议 RFC中非常清楚地列出,并开始:

如果总长度小于或等于最大传输单元,则将此数据报提交到数据报处理的下一步;否则将数据报分成两个片段,第一个片段是最大大小,第二个片段是数据报的其余部分。第一个片段被提交给数据报处理的下一步,而第二个片段被提交给这个过程,以防它仍然太大。

PS:当通过 TCP 发送数据流时,将其切割成碎片的过程通常称为分段,其中每个分段进入一个单独的 IP 数据包。当 IP 数据包被分成几块以通过特定链接时,通常称为分段虽然在普通英语中这些词听起来几乎相同,但在 IP 网络中,它们被赋予了这些精确的含义。

[编辑] 另请参阅有关 TCP 分段(根据最大分段大小)如何与 MTU 相关的其他答案。

对于 TCP 和 UDP,它采用不同的方法。

Int TCP 对于开发人员来说有点幕后 - 你只需说 send(buffer, buffer_size, tcp_connection_id) 就是这样。但是操作系统 tcp 堆栈驱动程序将首先查看特定连接的 TCP 最大段大小 (TCP MSS),如果您的缓冲区长度大于 MSS,则在那里发生第一次分段- 它会将您的数据分解为 MSS 大小的 tcp 段。MSS 是根据您的网络适配器的 MTU 减去所有必需的标头(以太网、ip、tcp)计算得出的。这样做是为了避免发送主机上不必要的 IP碎片然后 os 驱动程序形成 ip 数据包并将其发送到网络接口之外。由于链接的 MTU 可能小于您的链接,因此网络路径上可能会出现第二个和更多的碎片。

对于 UDP,它有点难,因为作为开发人员的你必须形成一个 UDP 数据包,并且应用程序负责对数据进行分段。您可以形成一个最多 65507 字节数据的 UDP 数据包并尝试发送它。根据 MTU,网络驱动程序可以将其分成较小的 IP 数据包。