如何解决使用IPv6后有些网站有时能访问有时无法访问的问题
编辑随着国家提速降费的政策的持续推进,家里的网速越来越快(4 Mbps>8 Mbps>20 Mbps>50 Mbps>100 Mbps>200 Mbps>500 Mbps),虽然网速是越来越快了,但是上网的时候偶尔会发生个别网站有时能访问有时无法访问的问题,尤其是在访问简书(直接打不开得刷新好几次)、小红书的时候(刷着刷着就刷不出来了),甚至从电信宽带换到了联通宽带,问题依然存在。
直到偶然间发现关闭IPv6之后就恢复正常了,所以最简单干脆的办法就是关掉IPv6就能解决问题,如果你用不到IPv6,那下面的也不用看了,直接在路由器后台关掉IPv6的开关就可以了。但是如果和我一样,有通过第三方app看电视直播、视频点播的需求,有IPv6就会更加流畅,那么可以继续往下看。
虽然直接关闭了IPv6可以解决这个困扰已久的问题,但是感觉没道理啊,为什么前些年网速没那么快,IPv6也没有普及的时候,IPv4就没有这个问题?于是上周末花了点时间认真研究了一下,经过研究并结合网络上的大神分享的经验,先一句话总结一下,通常情况下遇到这个问题说明你到目标服务器的IPv6链路上存在 PMTU 黑洞。
关于 PMTU 黑洞
MTU (Maximum transmission unit) 是一条链路上可以通过的三层数据包的最大尺寸(包含 IP 包头)。以太网上默认的 MTU 是 1500 字节,但是你和目标服务器之间的路径上可能存在小于 MTU 1500 的链路。这条路径上最小的 MTU 值就是整条路径的 PMTU 值。路由器在转发包时,超过 MTU 大小的包会被分片( Fragmentation ),也就是一个大包会被分切为多个不超过 MTU 的小包进行传输,传输效率会下降。
终端设备在发包时,也可以设置 DF ( Don't Fragment )标记来告诉路由器不要分片。这时中间路由器会丢掉超过 MTU 的包,回复一条 ICMP Fragmentation Needed 消息。发送者收到这个包后,下次就会发小一点的包,这个过程叫做 PMTU Discovery 。现实中可以看到 HTTPS ( TLS )的流量大都是带 DF 标记的。
然而,互联网上有大量的中间设备为了所谓的“安全”或者没有正确配置,不回应 ICMP Fragmentation Needed 包,这使得访问某些网站时如果某个包的大小超过了 PMTU,会被无声地丢弃,直到 TCP 协议发现超时丢包进行重传,这非常缓慢。遇到这种情况,我们可以说你和目标服务器的路径上存在 PMTU 黑洞。
此外,IPv6 不支持分片,换句话说可以理解为 IPv6 下所有的包都是带 DF 标记的。中间路由器在遇到包尺寸大于 MTU 的情况时,应该回应 ICMPv6 Packet Too Big 消息。同样的,由于种种原因,某些中间设备可能会直接丢包而不回应 ICMPv6 Packet Too Big 消息,直到 TCP 协议发现超时丢包进行重传。。。
为什么 IPv4 没有这个问题
其实 IPv4 也有这个问题,我不只一次见网友说自己搭的软路由访问某些网站非常慢,而换回硬路由就正常。这是因为多数家用路由器默认对 IPv4 下的 TCP 开启了 MSS (maximum segment size) Clamping (使用 OpenWRT 软路由的朋友们可以在防火墙设置中找到 MSS Clamping 开关)。MSS Clamping 是针对 PMTU 黑洞的 Workaround,简单来说就是 TCP 握手时有个 MSS 字段决定单个 TCP 包的最大尺寸。路由器可以通过嗅探 TCP 握手包,把 MSS 值改小,使最终的三层 IP 包的尺寸( MSS+TCP 头大小+IP 头大小)不超过某个特定的值。
总结及如何解决
这时问题目前很多光猫、家用路由器对 IPv6 的优化很差,不支持对 IPv6 下的 TCP 包进行 MSS Clamping,这就导致访问 IPv6 网站时,若路径中存在 PMTU 黑洞,则打开很慢。
现在国内 ISP 一般都是通过 PPPoE 虚拟拨号建立 WAN 口连接的。Ethernet 的默认 MTU 是 1500,但是 PPPoE 隧道有 8 个 bytes 的开销,所以 PPPoE 虚连接的 MTU 就是 1500-8=1492,减掉 IPv4 包头( 20 字节)和 TCP 包头( 20 字节),可以得知 IPv4 下需要把 MSS 设为 1452 以下。IPv6 的包头是 40 字节,所以 IPv6 下需要把 MSS 设为 1432 以下(记得最小不能低于1280)。
简单来说就是找到路由器后台设置中IPv4和IPv6的MTU设置大小,按照上一段中的值修改一下就好了(哪个有问题就修改哪一个,如果IPv4正常就不要修改了),修改之后记得重启一下网络。
这样修改之后,观察了几天,暂时没有再发现个别网站有时能访问有时无法访问的问题了,所以说万能的网友威武!!!
参考引用:
开启 IPv6 后网速变得很慢?可能是 PMTU 黑洞的问题,原文链接:https://www.v2ex.com/t/800024
使用IPv6后一些网站无法访问,有时能访问有时无法访问问题解决,原文链接:https://neucrack.com/p/400
- 0
- 0
-
分享