在家庭网络条件下,发现启用了 IPv6 之后,有部分网站无法访问,在路由器上禁用 IPv6 后,又能够正常访问站点。
经过一番查找,找到一篇博文: 使用IPv6后一些网站无法访问,有时能访问有时无法访问问题解决(版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。),发现与该问题相关,并成功解决问题,摘录部分如下:
由于 IPv6 对 MTU 的长度和 IPv4 不同,导致使用 IPv6 时会出现某些网站偶尔无法访问,其实就是 MTU 设置太大,有时候需要分包的时候被网络中一些不支持分包并且不会相应请求设备需要分包的设备给丢弃了,导致网站无法访问。 解决方法就是将(路由器的) MTU 设置小一点(比 IPV4 小 20 字节,比如 1432 字节)。
终端设备在发包时,也可以设置 DF ( Don’t Fragment )标记来告诉路由器不要分片。这时中间路由器会丢掉超过 MTU 的包,回复一条 ICMP Fragmentation Needed 消息。发送者收到这个包后,下次就会发小一点的包,这个过程叫做 PMTU Discovery 。现实中可以看到 HTTPS ( TLS )的流量大都是带 DF 标记的。
然而,互联网上有大量的中间设备为了所谓的“安全”或者没有正确配置,不回应 ICMP Fragmentation Needed 包,这使得访问某些网站时如果某个包的大小超过了 PMTU,会被无声地丢弃,直到 TCP 协议发现超时丢包进行重传,这非常缓慢。遇到这种情况,我们可以说你和目标服务器的路径上存在 PMTU 黑洞。
可以自行测试 MTU 值的设定,命令提示符测试:
1 | ping -f example.com -l 1450 -n 1 |
提示“需要拆分数据包但是设置 DF。”的话则尝试的值过大,可以往下进行测试,直到可以 ping 通。
利用上面这个方法找到的数值并不是 MTU 值,上面这个值加上数据包头 28 字节,才是我们需要的 MTU 值。