为什么 IPv4 可以直接放入URL,但 IPv6 却要加上方括号?
这是很多人第一次看到都会困惑的问题。核心原因只有一句话因为 IPv6 地址里本身就包含:而:在 URL 里已经被用作“端口分隔符”所以必须用方括号把 IPv6 地址包起来。下面用直观的方式来解释。一、IPv4 在 URL 里的样子IPv4 地址没有任何歧义例如http://192.168.1.1/如果要写端口http://192.168.1.1:8080/URL 解析规则很简单主机:端口浏览器看到192.168.1.1:8080就知道主机 192.168.1.1端口 8080因为 IPv4 地址里没有:所以不会产生歧义。二、IPv6 的问题IPv6 地址长这样2001:db8:85a3::8a2e:370:7334如果直接写进 URLhttp://2001:db8:85a3::8a2e:370:7334:80/问题来了浏览器完全不知道2001:db8:85a3::8a2e:370:7334:80到底是情况 AIPv6地址 2001:db8:85a3::8a2e:370:7334端口 80还是情况 BIPv6地址 2001:db8:85a3::8a2e:370:7334:80端口 默认端口因为 IPv6本身就大量使用:。解析器根本分不清。三、解决办法RFC 定义方括号所以在 URL 标准RFC 3986里规定IPv6 地址必须放在[]里面。正确写法http://[2001:db8:85a3::8a2e:370:7334]/带端口http://[2001:db8:85a3::8a2e:370:7334]:80/解析规则就变成[IPv6地址]:端口浏览器只要看到]就知道方括号里是完整 IPv6 地址]后面的:才是端口四、实际例子访问 IPv6 本机IPv4http://127.0.0.1:8080IPv6http://[::1]:8080::1是 IPv6 的 localhost。五、一个很多人不知道的小细节方括号只存在于 URL 语法里。在这些地方不需要方括号pingsship routeDNS AAAA 记录例如ping 2001:4860:4860::8888只有URL / URI需要http://[2001:4860:4860::8888]/六、一句话总结可以这样记IPv4 没有:所以直接写。IPv6 到处都是:所以必须用[]包起来避免和端口冲突。转自https://mp.weixin.qq.com/s/9_S8a3byOBnqn0Co_FrmgA