如果我的 ComputerA 网络接口的 MTU 设置为 1500,而 ComputerB 的网络接口的 MTU 为 1200,那么 ComputerA 有什么方法可以知道 ComputerB 的 MTU 是 1200,或者如果它发送大数据包,它将从 ComputerB 获得请求对数据包进行分段?
双方如何知道MTU
主机可以使用路径 MTU 发现,它对于 IPv4 是可选的,对于 IPv6 是强制性的。
使用 IPv4,数据包在大于出口接口的 MTU 的地方被分段——这可能发生在源主机或任何中间路由器上。在您的示例中,A 和 B 之间的路由器会将数据包分段。
分段会给路由器带来相当大的负载,IPv6 路由器已将其移除,因此 v6 主机需要发现每个目的地的路径 MTU 或自行分段超大数据包。如果 IPv6 路由器遇到过大的数据包,它会返回 ICMP 错误并将其丢弃。
MTU 是每个接口的属性。它是(硬件)默认、静态配置或通过 DHCP(选项 26)。共享 L2 段中的所有节点都需要使用相同的最大帧大小,从而产生相同的 MTU。如果一个节点发送比其他节点更大的帧,除非这些帧因过大而被丢弃。
这是一个有点副业的答案,因为问题是关于 MTU,而不是 MSS。
...然后是 TCP MSS,它在 TCP 的情况下有帮助,但当然不适用于 UDP 或 ICMP。
在TCP报头(仅在最初的3次握手的SYN和SYN-ACK数据包)使用MSS字段,主机可以用信号通知同龄一个TCP有效载荷多大是可以接受的接收。
TCP MSS 协商可能是一件好事,但也可能是一件麻烦事,因为它有助于隐藏 MTU 问题,直到带有大 UDP 数据包的东西出现并在“公共 L2 网段上的所有主机都需要使用相同的 MTU”标准上失败(请参阅Zac67 的评论,如上)
主机将从用于与给定对等方通信的给定出口接口的 MTU 派生 MSS。通常,可以看到 MTU-40 的值(对于普通以太网为 1460),如果使用 TCP 时间戳,则甚至更低。
TCP MSS 是给定 TCP 会话/套接字的属性;启用巨型帧的主机将愉快地与具有 1460 字节 MSS 和具有 1160 字节 MSS 的对等方交换 TCP 段,同时与具有 8960 字节 MSS 的后端系统通信,所有这些都同时在同一单个接口上。
如果 TCP 发言者之间的网络路径具有隧道特性(例如 IPsec 站点到站点隧道),路由器、网关或防火墙通常会操纵 TCP 会话的初始数据包中的 TCP MSS 字段(通常为 1350 字节);这被称为“mss 钳制”或“调整 mss”,使终端系统相信互惠远程对等方无法接收更大的数据包,这些数据包在没有碎片的情况下无法通过隧道(当然,如果主机发出信号MSS 低于钳位值,设备将保留较低的值)