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


87

网址始终具有以下格式:

<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或端口号。我们怎么知道呢?

Answers:


118

在这种情况下,标记是将IPv6 IP号编码在方括号中:

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

这是RFC 3986第3.2.2节:主机

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


38
值得指出的是,括号不是可选的。这是浏览器可以识别数字IPv6地址的唯一明确机制。
tylerl

端口不应该放在括号内吗?
jayarjo

2
@jayarjo不,因为这里使用方括号来区分包含冒号的IP地址和以冒号与IP地址分隔的端口之间的歧义。
sysadmin1138
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.