我正在开发一个代码库,我们正在尝试通过验证我们是否可以在没有任何数据包碎片的情况下 ping 具有有效负载 = MSS 的远程站点(使用 -df 标志)来测试网络健康状况。
通常,对于没有 L2 隧道的连接,此 MSS 将为 1472(1500 - TCP 标头 (28))。但是,如果有一些隧道,那么这个 MSS 会低于这个值。我想知道是否有任何方法可以找出这个额外的隧道标头,以便我可以减小数据包大小以确保最终有 1500 个字节到达以太网/物理层。
我正在开发一个代码库,我们正在尝试通过验证我们是否可以在没有任何数据包碎片的情况下 ping 具有有效负载 = MSS 的远程站点(使用 -df 标志)来测试网络健康状况。
通常,对于没有 L2 隧道的连接,此 MSS 将为 1472(1500 - TCP 标头 (28))。但是,如果有一些隧道,那么这个 MSS 会低于这个值。我想知道是否有任何方法可以找出这个额外的隧道标头,以便我可以减小数据包大小以确保最终有 1500 个字节到达以太网/物理层。
Ping 使用 ICMP,而不是 TCP,因此您无法使用 ping 测试 TCP。您应该研究 PMTUD 以找到路径中最小的 MTU。然后,您可以正确设置 MTU 以防止碎片。
另外,您对 MSS 的计算不正确。以太网帧大小为 1518,但以太网仅限于本地网络。MTU 是链路上允许的最大数据包大小(以太网为 1500,其他协议更大,例如 Wi-Fi、令牌环等),您必须减去 IP 标头(IPv4 为 20 到 60 字节,40 IPv6 字节)和 TCP 标头(20 到 60 字节)。在大多数情况下,对于以太网上 IPv4 上的 TCP,MSS 将为 1460 (1500 - 20 - 20 = 1460)。通常,隧道将是第 3 层隧道(拥有第 2 层隧道是一个非常糟糕的主意)。第 3 层隧道 MTU(以及 MSS)会因隧道开销(IP 和隧道报头大小)而减少,并且会因所使用的隧道协议而异。
在任何情况下,使用 TCP,您根本不需要担心 MSS,因为 TCP 会为您处理流分段,而自己尝试这样做会很麻烦,并且可能导致性能欠佳。您只需使用 PMTUD 来确定正确的 MTU 并相应地调整您的 MTU,然后让 TCP 完成它的工作。