- 作者:
- 分类:知识&开发->协议&标准->网络通信协议
- 阅读:7483
- 点赞:25
- 版权:CC BY-SA 4.0
- 创建:2022-01-05
- 更新:2022-01-05
原文链接(持续更新):https://neucrack.com/p/400
公司网络支持 IPv6 后就一直访问一些网站有时候无法访问或者特别慢, 经过 @vowstar 的排查解决了问题:
由于 IPv6 对 MTU 的长度和 IPv4 不同,导致使用 IPv6 时会出现某些网站偶尔无法访问,其实就是 MTU 设置太大,有时候需要分包的时候被网络中一些不支持分包并且不会相应请求设备需要分包的设备给丢弃了,导致网站无法访问。 解决方法就是将(路由器的) MTU 设置小一点(比 IPV4 小 20 字节,比如 1432 字节)
这里记录下,以下为其原话:
之前ipv6环境下简书时而可以访问时而不能访问的root cause找到了,原因是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 以下。
解决方法:
#set security flow tcp-mss all-tcp mss 1452
set security flow tcp-mss all-tcp mss 1432
原先的设置值是1452, 改成1432后,强制丢包现象消失,原先无法访问的简书可以被访问了。
路由器后台一般都可以直接更改,电脑 linux 可以临时:
sudo ifconfig enp7s0 mtu 1432 up