背景
最近放寒假回家了,发现家里的宽带被我爹升级到了 1000M。为了更好的学习(游戏)体验,本着买新不买旧的原则,我给咱家里的老古董 Wifi 5 的路由器换上了最新的 Wifi 7 路由。
新的路由是 TP-Link BE5100(TL-7DR5130),我看到了 IPv6 的设置顺手就把他打开了。
但是。。。。。。。
万万没想到,打开了之后连不上网。。。。
具体表现为:我顺手打开 baidu.com、fanyi.baidu.com 发现 TIMED OUT,打开我的自己网站 www.rxgzs.cn、nero978.top 也是 TIMED OUT。
解决思路
因为我自己的网站支持 IPv6 访问,我首先就想确认是不是路由器 IPv6 设置的锅。
我首先尝试去访问一些 IPv4 的网站,200 OK。(这个可以打开浏览器的 F12
键-开发者工具-网络看到)
到这里我基本上确认是 IPv6的问题了。。。
我查看了下电脑本地的链接,确认是有 IPv6 的地址的。也就是说,从路由器到电脑的 IPv6 已经连接好了。
接下来,我把路由器的 IPv6 设置关掉,再去尝试访问上述失败的网站,果然现在通过 IPv4 访问是 200 OK的。到这里,肯定就是 IPv6 的锅了。
IPv6 出问题,我首先想到的是 test-ipv6.com 的检测网站。我试了下,草泥马的 10 分。。。
我:6。。。嗯。。。。他这么做一定有他的道理。。。
进一步思考,我发现,并不是所有的 IPv6 网站都打不开。例如:test-ipv6 本身就是 IPv6 的网站,它能检测到我的 IPv6 IP,这说明我的 IPv6 其实是通的。
既然是部分 IPv6 网站无法访问,我想到可能是 DNS 污染的问题。于是我换上阿里的公共 DNS,问题依旧。
然后我咨询了下中国电信的客服,告知我湖南电信截至目前已经全面支持 IPv6 了。
到这里我都有点快放弃了。。。然后去逛了一下贴吧。不得不说还是贴吧的大神多。。。
终极方案
原帖在这里:
版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
链接:https://neucrack.com/p/400
原因就是 MTU,在我将 MTU 设置为 1432 之后完美解决!(TP路由器的默认 MTU 为1500)
什么是 MTU ?
最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。
是包或帧的最大长度,一般以字节记。如果MTU过大,在碰到路由器时会被拒绝转发,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分操作系统会提供给用户一个默认值,该值一般对用户是比较合适的。
为什么 IPv6 设置之后需要重新设置 MTU?
由于 IPv6 对 MTU 的长度和 IPv4 不同,导致使用 IPv6 时会出现某些网站偶尔无法访问,其实就是 MTU 设置太大,有时候需要分包的时候被网络中一些不支持分包并且不会相应请求设备需要分包的设备给丢弃了,导致网站无法访问。 解决方法就是将(路由器的) MTU 设置小一点(比 IPV4 小 20 字节,比如 1432 字节)
什么是 PMTU 黑洞?
终端设备在发包时,可以设置 DF ( Don’t Fragment )标记来告诉路由器不要分片。这时中间路由器会丢掉超过 MTU 的包,回复一条 ICMP Fragmentation Needed 消息。发送者收到这个包后,下次就会发小一点的包,这个过程叫做 PMTU Discovery 。现实中可以看到 HTTPS ( TLS )的流量大都是带 DF 标记的。
然而,互联网上有大量的中间设备为了所谓的“安全”或者没有正确配置,不回应 ICMP Fragmentation Needed 包,这使得访问某些网站时如果某个包的大小超过了 PMTU,会被无声地丢弃,直到 TCP 协议发现超时丢包进行重传,这非常缓慢。遇到这种情况,我们可以说你和目标服务器的路径上存在 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 以下。
也就是说,可能是我家的某台设备没有正确执行上述分包策略(也就是当包太大时没有发送要求分包的信息),导致 TCP 协议不断发送请求,最终导致 TIMED OUT。
感谢博主, 我的routeros通过这样设置终于解决ipv6访问速度慢的问题