开启ipv6网速反而变慢了,ipv6开启好还是禁用好。发迹号带你了解更多相关信息。发现最近经常有人提到开启IPv6连接速度慢的问题。目前国内确实存在支持IPv6的服务器、CDN节点不够多,IPv6国际带宽比IPv4带宽小的问题,但也不至于会
开启ipv6网速反而变慢了,ipv6开启好还是禁用好。发迹号带你了解更多相关信息。
发现最近经常有人提到开启IPv6连接速度慢的问题。目前国内确实存在支持IPv6的服务器、CDN节点不够多,IPv6国际带宽比IPv4带宽小的问题,但也不至于会打开国内网站都卡。通常情况下遇到这个问题说明你到目标服务器的链路上存在PMTU黑洞。
关于PMTU黑洞MTU(Maximumtransmissionunit)是一条链路上可以通过的三层数据包的最大尺寸(包含IP包头)。以太网上默认的MTU是1500字节,但是你和目标服务器之间的路径上可能存在小于MTU1500的链路。这条路径上最小的MTU值就是整条路径的PMTU值。路由器在转发包时,超过MTU大小的包会被分片(Fragmentation),也就是一个大包会被分切为多个不超过MTU的小包进行传输,传输效率会下降。
终端设备在发包时,也可以设置DF(Don’tFragment)标记来告诉路由器不要分片。这时中间路由器会丢掉超过MTU的包,回复一条ICMPFragmentationNeeded消息。发送者收到这个包后,下次就会发小一点的包,这个过程叫做PMTUDiscovery。现实中可以看到HTTPS(TLS)的流量大都是带DF标记的。
然而,互联网上有大量的中间设备为了所谓的“安全”或者没有正确配置,不回应ICMPFragmentationNeeded包,这使得访问某些网站时如果某个包的大小超过了PMTU,会被无声地丢弃,直到TCP协议发现超时丢包进行重传,这非常缓慢。遇到这种情况,我们可以说你和目标服务器的路径上存在PMTU黑洞。
此外,IPv6不支持分片,换句话说可以理解为IPv6下所有的包都是带DF标记的。中间路由器在遇到包尺寸大于MTU的情况时,应该回应ICMPv6PacketTooBig消息。同样的,由于种种原因,某些中间设备可能会直接丢包而不回应ICMPv6PacketTooBig消息,直到TCP协议发现超时丢包进行重传。。。
为什么IPv4没有这个问题其实IPv4也有这个问题,我不只一次见网友说自己搭的软路由访问某些网站非常慢,而换回硬路由就正常。这是因为多数家用路由器默认对IPv4下的TCP开启了MSS(maximumsegmentsize)Clamping(使用OpenWRT软路由的朋友们可以在防火墙设置中找到MSSClamping开关)。MSSClamping是针对PMTU黑洞的Workaround,简单来说就是TCP握手时有个MSS字段决定单个TCP包的最大尺寸。路由器可以通过嗅探TCP握手包,把MSS值改小,使最终的三层IP包的尺寸(MSS+TCP头大小+IP头大小)不超过某个特定的值。
总结现在国内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以下。
这时问题来了,目前很多光猫、家用路由器对IPv6的优化很差,不支持对IPv6下的TCP包进行MSSClamping,这就导致访问IPv6网站时,若路径中存在PMTU黑洞,则打开很慢。
我前段时间帮朋友配置IPv6时发现了很多光猫、家用路由器的固件问题,使得国内使用IPv6的体验不太理想。我打算抽空专门开一个帖子去讨论这些问题,声讨那些垃圾厂家。目前来看,要想在国内比较理想地体验IPv6,你需要把光猫改为桥接模式,并使用OpenWRT或者VyOS这类对IPv6支持较好的软路由。
附:在基于Linux的路由器启用MSSClamping的命令:
自动MSS,假设PPPOE虚接口是pppoe0iptables-tmangle-APOSTROUTING-ptcp–tcp-flagsSYN,RSTSYN-opppoe0-jTCPMSS–clamp-mss-to-pmtuip6tables-tmangle-APOSTROUTING-ptcp–tcp-flagsSYN,RSTSYN-opppoe0-jTCPMSS–clamp-mss-to-pmtu
手动指定MSS,假设PPPOE虚接口是pppoe0$iptables-tmangle-APOSTROUTING-ptcp–tcp-flagsSYN,RSTSYN-opppoe0-jTCPMSS–set-mss1452$ip6tables-tmangle-APOSTROUTING-ptcp–tcp-flagsSYN,RSTSYN-opppoe0-jTCPMSS–set-mss1432
RouterOS里设置MSS的命令。其中pppoe-out1是wan口,1420是要MSS值,请根据需要修改。
/ipv6firewallmangleaddchain=forwardout-interface=pppoe-out1protocol=tcptcp-flags=synaction=change-mssnew-mss=1420
UBNTEdgerouter系列的MSS设置方法:
setfirewalloptionsmss-clamp6interface-typepppoesetfirewalloptionsmss-clamp6mss1420
声明:本文图片、文字、视频等内容来源于互联网,本站无法甄别其准确性,建议谨慎参考,本站不对您因参考本文所带来的任何后果负责!本站尊重并保护知识产权,本文版权归原作者所有,根据《信息网络传播权保护条例》,如果我们转载内容侵犯了您的权利,请及时与我们联系,我们会做删除处理,谢谢。