假设我有两台机器和一台交换机。
M1——开关——M2。
设置如下:
- M1 的 MTU 设置为 100
- 交换机的 MTU 设置为 1000
- M2 的 MTU 设置为 1000。
问题:
当M1尝试向M2发送一个100字节的数据包时,应该没有问题,对吗?
当M2尝试发送一个1000字节的数据包给M1时,会出现什么问题吗?
M2 可以向 Switch 发送一个 1000 字节的数据包,但是当 Switch 尝试将该数据包发送给 M1 时,它需要将该数据包分片为 10 个小数据包。对吗?
更新:
更现实一点:M1、Switch 和 M2 都在 10G 网络上运行,并且我们使用 IPv4。
设置如下:
M1 的 MTU 设置为 1500
交换机的 MTU 设置为 9000
M2 的 MTU 设置为 9000
这有助于回答这个问题吗?
答案1
您没有具体说明您正在谈论什么网络技术,因此我假设是以太网和 IP[v4]。
以太网始终将其可接受的有效载荷长度范围定义为 46 到 1500 字节,并要求 LAN 上的所有设备(主机和交换机)都能够接收有效载荷为 1500 字节的帧。因此,以太网不提供分段机制,也不提供用于通信或协商 MTU(或更重要的是 MTU 的机制)的机制。R我们 -- 最大限度收到设备之间的最大传输单元 (MTU) 是设备之间的最大传输单元 (MTU)。事实上,IEEE 802.3 规范中根本没有出现过“MTU”或“最大传输单元”这一术语。
因此,让我们将 IP 添加到图片中。IP 具有 MTU 的概念,大多数现代 IP 堆栈允许您在每个接口的基础上设置 MTU(以及更多)。但您提出的这个问题在 IP 上下文中也不太适用,因为 IP 的最小 MTU 为 576。因此,请允许我将您的问题重新表述为“M1 的 MTU 为 600,M2 的 MTU 为 1200”。但我们应该说“交换机”具有什么 MTU?好吧,如果交换机只是第 2 层以太网交换机,它就没有可设置 MTU 的概念。因此,为了让您的问题在 IP 上下文中适用,我们必须将该交换机变成路由器。因此,我们将其称为“路由器”,并假设它有两个以太网接口,一个连接到 M1,另一个连接到 M2。我们还假设它的两个接口上的 MTU 都设置为 1200。
- 当 M1 向 M2 发送一个包含 600 字节有效负载的帧时,不会出现任何问题。
- 当 M2 向 M1 发送一个包含 1200 字节有效负载的帧时,仍然不会出现问题。为什么不呢?因为设置 M1 的 MTU 不一定会改变其 MRU,而且根据我的经验,MTU 和 MRU 是分开的,并且实现不提供更改 MRU 的方法。因此,由于它是以太网,因此 M1 在该接口上的 MRU 将是 1500。
- 路由器不知道需要对来自 M2 的帧进行分段,因为它认为 M1 所在的以太网 LAN 上的所有主机都能够接收具有 1200 字节有效负载的帧,因为它在该接口上配置了 1200 字节 MTU。幸运的是,这仍然可能行得通,正如我在 (2) 中讨论的那样。
好的,仍在尝试寻找并回答您问题的真正精神,假设 M1 和路由器之间的链接实际上是 PPP 而不是以太网。 PPP 协议允许主机通信/协商其 MRU。假设 M1 告诉路由器 M1 有 600 字节的 MRU 限制,因此路由器已将该链接的 MTU 设置为 600 字节。
现在,在这种情况下,如果 M2 向 M1 发送一个 1200 字节的 IP 数据报(未在 IP 报头中设置“不分段”位),路由器将正常接收该数据报,并意识到需要对其进行分段才能将其发送给 M1。那么路由器会将其分段为两个 600 字节的分段吗?嗯,不是的,由于几个原因,事情没那么简单。
一个原因是每个片段都必须有自己的 IP 标头,这会在第一个片段之后的每个片段的大小上添加 20 个字节。另一个原因是 IP 的片段偏移字段以 8 字节块而不是单个字节为单位进行计数。
因此,假设 1200 字节的数据报具体而言是 UDP 数据报中的 1172 字节应用程序数据(8 字节 UDP 报头、20 字节 IP 报头)。分片后,第一个片段将包含 20 字节 IP 报头、8 字节 UDP 报头和前 568 字节应用程序数据,总共 586 字节。第二个帧将包含另一个 20 字节 IP 报头(无 UDP 报头)和接下来的 576 字节应用程序数据,总共 586 字节。这样,最后一个片段剩下 28 字节应用程序数据,加上 IP 报头后,将为 48 字节。
根据 Kavin 的更新,他正在谈论巨型帧:
巨型帧是一些千兆以太网产品供应商在 GigE 诞生时独立创建的,它随后被 IEEE 拒绝或忽略,似乎不太可能成为 802.3 以太网标准的一部分。即使是 IEEE 802.3-2008,它不仅包括 1000BASE-T,还包括 10GBASE-T,不包含有关 9000 字节帧有效负载的任何内容。
推出巨型帧的供应商并未提供任何自动协商或通信机制来支持巨型帧,也没有创建以太网层分段方法来处理您所描述的(非常常见的)情况。如果您想以这种非标准模式运行以太网 LAN,您必须确保 LAN 上的所有主机和交换机都支持巨型帧。
如果 M1 的 NIC 是不是能够接收巨型帧,它会将巨型帧视为“以太网 jabber”——一种“不停地喋喋不休”的损坏设备;不断发送远远超出最大允许 1500(实际上是 1518)字节帧的末尾的位。请注意,jabber 的这个含义是指一种以太网故障,不要与名称相似的“Jabber”互联网聊天系统混淆。您必须决定是否要停止在此网络上使用巨型帧,或者是否要升级 M1 以拥有支持巨型帧的 NIC。
如果 M1 的 NIC是能够接收巨型帧,我怀疑将该接口的 IPv4 MTU 设置为 1500 将确保它不会发送单个巨型以太网帧中不能包含任何巨型 IP 数据报,但很可能能够收到单个巨型以太网帧中的大型 IP 数据报没有问题,因为 MTU 不是 MRU,并且设置 IP 层 MTU 不会影响 NIC 允许的帧缓冲区大小。现在,如果您调整 NIC/驱动程序设置以告诉 NIC 仅使用 1500 字节缓冲区而不是 9000 字节缓冲区,那么这就是以太网层更改,并且可能会使您的 NIC 表现得好像它不支持 9000 字节缓冲区一样。
答案2
说实话,我认为您不能将 MTU 设置为 100 并仍然建立任何形式的 IP 连接。我相信 ipv4 至少需要 576... 甚至可能更多。这太小了... 通常,过去 20 年制造的 10/100 交换机的 MTU 为 1492 或 1500... 而在要求更高的网络中,如果设备更好,则 MTU 可以达到 9000。
答案3
有一种称为“pmtu”或路径 MTU 的技术,通过该技术,一端可以发现它可以可靠地发送到另一端的数据包的最大大小,并将其数据包大小缩小到最小 MTU 的大小。
比这更大的数据包将被碎片化,除非在 IP 标头中设置了“DF”或“不碎片化”标志,在这种情况下数据包将在传输途中丢失。
在像您描述的对等连接上,应该可以很顺利地使用 PMTU。只有当您通过多个网络进行路由并且您和目的地之间的某个路由器不能正确支持 PMTU 并且没有报告要使用的正确 MTU 大小时,它才会成为问题。