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

rig*_*old 94 url ipv6

URL 始终具有以下格式:

<protocol>://<host>[:<port>]/[<path>][#<hash>]
Run Code Online (Sandbox Code Playgroud)

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

2001:db8:1f70::999:de8:7648:6e8
Run Code Online (Sandbox Code Playgroud)

但是,如果这是主机,并且我想通过端口 100 上的 HTTP 连接到它呢?

http://2001:db8:1f70::999:de8:7648:6e8:100/
Run Code Online (Sandbox Code Playgroud)

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

sys*_*138 128

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

http://[2001:db8:1f70::999:de8:7648:6e8]:100/
Run Code Online (Sandbox Code Playgroud)

那是RFC 3986,第 3.2.2 节:主机

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

  • 值得指出的是,括号*不是*可选的。这是浏览器可以识别数字 IPv6 地址的唯一明确机制。 (43认同)
  • @jayarjo 不,因为括号用于消除包含冒号的 IP 地址和用冒号与 IP 地址分隔的端口之间的歧义。 (3认同)