真实世界中的 PMTUD

💡 原文中文,约35800字,阅读约需86分钟。
📝

内容提要

本文讨论了在MSS协商失败的情况下,为什么curl https://x.com可以访问,但是curl https://accounts.google.com不可以。作者通过实验发现,这些网站可能实现了PMTUD(Path MTU Discovery),即在TCP握手时根据本地网卡信息协商MSS。作者还尝试了在虚拟机中模拟MTU最大为800的环境,并通过iptables丢弃超过800字节的包。实验结果显示,对于accounts.google.com,服务器一直尝试发送大小为1400的包,但被丢弃并重发,最终发送成功。作者还尝试了发送ICMP消息,但结果与之前相同。作者推测可能是公网发送ICMP消息的问题。

🎯

关键要点

  • 在MSS协商失败的情况下,curl https://x.com可以访问,但curl https://accounts.google.com不可以。
  • 作者通过实验发现这些网站可能实现了PMTUD(Path MTU Discovery)。
  • TCP握手时双方根据本地网卡信息协商MSS,可能导致中间设备的MTU小于两边的MTU。
  • PMTUD的原理是当有丢包时,尝试发送小包以确认链路的MTU。
  • 实验中,设置MTU最大为800,使用iptables丢弃超过800字节的包。
  • 对于accounts.google.com,服务器不断尝试发送1400字节的包,但被丢弃并重发,最终发送成功。
  • 作者尝试发送ICMP消息,但结果与之前相同,推测可能是公网发送ICMP消息的问题。
  • 在虚拟机中测试ICMP type 3 code 4,发现即使发送ICMP消息,服务器仍然从512字节开始尝试,未能成功处理ICMP。
  • 作者认为可能是公网的ICMP黑洞问题导致PMTUD失败。
➡️

继续阅读