IP 版本 6 支持

从 IE7 及更高版本开始,WinINet 支持主机名中的 IPv6 文本以及 URI 的颁发机构组件。 WinINet 还支持在 HTTP 协议的相关部分(如 Location 标头)中使用 IPv6 文本。

主机名 IPv6 文本和 URI 组件

WinINet 根据 RFC 3513 中的规范实现 IPv6 文本。 如此 RFC 中所述,URI 中的 IPv6 文本必须括在方括号中。 例如,https://[::1]/ 是有效的 IPv6 URI;没有括号 (https://::1/) 窗体无效。 但是,不属于 URI 的主机名 IPv6 文本不需要括在方括号中;WinINet 可以接受任何一种形式。 例如,“::1”和“[::1]”都是可接受的 IPv6 主机名文本形式。 其他 API(如 WinSock API)也将接受这两种形式。 因此,应用程序应准备好处理这两种形式的 IPv6 主机名文本。

作用域 ID

URI 中的 IPv6 文本地址可能包含范围 ID。 范围 ID 可以是接口 ID,例如 [FE80::1%1]。 RFC 3986 中记录的 URI 标准未定义范围 ID 的语法,当范围 ID 存在时,URI 被视为不统一。 但是,WinINet 接受 URI 的颁发机构组件和主机名 IPv6 文本中的范围 ID。

如果 URI 中存在,IPv6 文本地址中 (%) 的百分比字符必须转义百分比。 例如,范围 ID FE80::2%3 必须在 URI 中显示为“https://[FE80::2%253]/”,其中 %25 是十六进制编码的百分比字符 (%) 。 如果应用程序从 Unicode API(例如 Winsock WSAAddressToString API)检索 URI,则应用程序必须在 URI 的主机名中添加百分比字符 (%) 的转义版本。 若要创建 URI 的转义版本,应用程序调用 InternetCreateUrl ,其中 dwFlags 参数设置为 ICU_ESCAPE_AUTHORITY,并在 lpUrlComponents 参数中指定的 URL 组件结构中指定的 IPv6 主机名。

对于所有套接字操作,WinINet 使用范围 ID。 但是,由于范围 ID 仅具有本地主机意义,因此不会将其作为请求中 HTTP 协议标头的一部分发送。 例如,使用 lpszUrl 参数中的以下 URL 调用 InternetOpenUrl

https://[fec0::2%251]:80/path.htm

发送此 URL 的 HTTP 请求时,WinINet 会删除 URL 的范围 ID 部分。 请求包含以下标头:

GET path.htm HTTP/1.1
Host: [fec0::2]

注意

WinINet 不支持服务器实现。 此外,不应从服务使用它。 对于服务器实现或服务,请使用 Microsoft Windows HTTP Services (WinHTTP)