自从手持ubnt路由器以来就一直有一个奇怪的问题:局域网启用ipv6后,访问大部分的ipv6网站都极其缓慢,基本加载不出来。具体现象如下:
- chrome访问ipv6站点提示err::NET_TIMED_OUT
- ping域名或者IP都是畅通无阻
- netstat可以看到ipv6的TCP链接基本都处于ESTABLISHED阶段,并没有卡在握手
- 访问一个ipv6的HTTPS站点并用wireshark进行抓包,发现TCP握手的3个包都是正常的,但是随后的TLS握手必然触发丢包,TCP尝试重传但无济于事,最后连接断开
最后发现是ubnt(2.0.9 hotfix4)默认没有设置ipv6的MSS Clamp,从而导致ipv6传输中丢掉了大包。因为TCP握手是没有负载数据的,实际长度必然小于MSS所以完全不受影响;一旦开始带上负载,就必然触发丢包。
需要进入ssh或者在web的Config Tree设置如下:
set firewall options mss-clamp6 interface-type pppoe
set firewall options mss-clamp6 mss 1432
1432是pppoe拨号的ipv6上TCP链接的最大MSS,计算方式是1500(以太网最大帧)-8(pppoe头)-40(ipv6头)-20(tcp头)。
实际可以设置得比1432小,不可以大。