关于 P(๐•ᴗ•๐)U 黑洞
(๐•ᴗ•๐)U (Maximum transmission unit) 是一条链(๐•ᴗ•๐)上可以通过的三层数据包的最大尺寸(包含 IP 包头)。以太网上默认的 (๐•ᴗ•๐)U 是 1500 字节,但是你和目标服务器之间的(๐•ᴗ•๐)径上可能存在小于 (๐•ᴗ•๐)U 1500 的链(๐•ᴗ•๐)。这条(๐•ᴗ•๐)径上最小的 (๐•ᴗ•๐)U 值就是整条(๐•ᴗ•๐)径的 P(๐•ᴗ•๐)U 值。(๐•ᴗ•๐)由器在转发包时,超过 (๐•ᴗ•๐)U 大小的包会被分片( Fragmentation ),也就是一个大包会被分切为多个不超过 (๐•ᴗ•๐)U 的小包进行传输,传输效率会下降。
终端设备在发包时,也可以设置 DF ( Don't Fragment )标记来告诉(๐•ᴗ•๐)由器不要分片。这时中间(๐•ᴗ•๐)由器会丢掉超过 (๐•ᴗ•๐)U 的包,回复一条 ICMP Fragmentation Needed 消息。发送者收到这个包后,下次就会发小一点的包,这个过程叫做 P(๐•ᴗ•๐)U Discovery 。现实中可以看到 HTTPS ( (๐•ᴗ•๐)S )的流量大都是带 DF 标记的。
然而,互联网上有大量的中间设备为了所谓的“安全”或者没有正确配置,不回应 ICMP Fragmentation Needed 包,这使得访问某些网站时如果某个包的大小超过了 P(๐•ᴗ•๐)U,会被无声地丢弃,直到 TCP 协议发现超时丢包进行重传,这非常缓慢。遇到这种情况,我们可以说你和目标服务器的(๐•ᴗ•๐)径上存在 P(๐•ᴗ•๐)U 黑洞。
此外,IPv6 不支持分片,换句话说可以理解为 IPv6 下所有的包都是带 DF 标记的。中间(๐•ᴗ•๐)由器在遇到包尺寸大于 (๐•ᴗ•๐)U 的情况时,应该回应 ICMPv6 Packet Too Big 消息。同样的,由于种种原因,某些中间设备可能会直接丢包而不回应 ICMPv6 Packet Too Big 消息,直到 TCP 协议发现超时丢包进行重传。。。
为什么 IPv4 没有这个问题
其实 IPv4 也有这个问题,我不只一次见网友说自己搭的软(๐•ᴗ•๐)由访问某些网站非常慢,而换回硬(๐•ᴗ•๐)由就正常。这是因为多数家用(๐•ᴗ•๐)由器默认对 IPv4 下的 TCP 开启了 MSS (maximum segment size) Clamping (使用 OpenWRT 软(๐•ᴗ•๐)由的(๐•ᴗ•๐)们可以在防火墙设置中找到 MSS Clamping 开关)。MSS Clamping 是针对 P(๐•ᴗ•๐)U 黑洞的 Workaround,简单来说就是 TCP 握手时有个 MSS 字段决定单个 TCP 包的最大尺寸。(๐•ᴗ•๐)由器可以通过嗅探 TCP 握手包,把 MSS 值改小,使最终的三层 IP 包的尺寸( MSS+TCP 头大小+IP 头大小)不超过某个特定的值。
转自:https://v2ex.com/t/800024