题 如何区分IPv6 URL中的主机和端口?


网址始终具有以下格式:

<protocol>://<host>[:<port>]/[<path>][#<hash>]

问题是IPv6使用冒号,就像端口和主机的分隔符一样,例如:

2001:db8:1f70::999:de8:7648:6e8

但是如果这是主机,我想在端口100上使用HTTP连接它呢?

http://2001:db8:1f70::999:de8:7648:6e8:100/

问题是最后一个冒号。由于双冒号(1f70和999之间)省略了零,因此':100'属于IP或端口号是未知的。我们怎么知道这个?


80
2017-11-24 22:48






答案:


在这种情况下的表示法是将IPv6 IP编号编码在方括号中:

http://[2001:db8:1f70::999:de8:7648:6e8]:100/

那是 RFC 3986,第3.2.2节:主持人

由Internet协议字面地址(版本6)标识的主机       [RFC3513]或更高版本,通过包含IP文字来区分       在方括号内(“[”和“]”)。这是唯一的地方       URI语法中允许使用方括号字符。在       对未来的预期,尚未定义的IP文字地址格式,       实现可以使用可选的版本标志来指示这样的       显式格式而不是依赖于启发式确定。


111
2017-11-24 22:51



值得指出的是括号是 不 可选的。这是浏览器识别数字IPv6地址的唯一明确机制。 - tylerl
端口是否应该在括号内? - jayarjo
@jayarjo不,因为括号是为了在包含冒号的IP地址和通过冒号与IP地址分隔的端口之间提供消歧。 - sysadmin1138♦