IPv6 Winsock 应用程序的用户界面问题

从 IPv4 到 IPv6 的最明显变化之一是 IP 地址的大小。 许多用户界面都提供对话框,使用户能够输入 IP 地址,如下图所示。

common ipv4 address box in a user interface

由于 IPv6 地址空间中部分的长度、复杂性和部分的重要性等许多因素,因此不利于用户的修改或规范。 因此,需要向用户提供指定自己的地址的功能会减少。 此外,由于与 IPv6 寻址相关的复杂性,为管理员提供指定 IPv6 地址信息的功能不太可能在每个节点上发生。

在 UI 中显示 IPv6 地址并不不可思议,因此开发人员在修改应用程序以支持 IPv6 时,应考虑 IPv6 地址的大小变化。

本部分的其余部分讨论了 IPv4 地址长度可预测性和 IPv6 地址长度注意事项之间的差异。 本部分假定 IPv6 地址以十六进制表示形式显示。

IPv4 地址的大小可预测,因为它们严格遵循虚点小数表示法,如以下地址示例所示:

10.10.256.1

IPv6 地址不可预测,因为 IPv6 地址约定允许使用双冒号 (::) 来表示一系列零。 因此,以下 IPv6 地址表示形式等同于相同的 IPv6 地址:

1040:0:0:0:0:0:0:1
1040::1

表示具有双冒号的一系列零的功能会导致任何给定 IPv6 的不可预知的长度,这要求程序员在创建 IPv6 地址的用户界面显示时考虑此功能。 当然,开发人员应确保用户界面能够显示 IP 地址,这些地址不使用双冒号来表示) 下面的第一个地址 (第一个地址的一系列零,并且能够在创建支持 IPv6 的用户界面时显示最长的 IPv6 地址 (第二个地址,其中嵌入的 IPv4 地址) 。 另请注意,将范围标识符 (ID) 添加到以下地址时,其长度将增加 11 个字符之多:

21DA:00D3:0010:2F3B:02AA:00FF:FE28:9C5A
0000:0000:0000:0000:0000:ffff:123.123.123.123

另一个重要考虑因素是,基于名称的地址是否比基于数字的 IPv6 地址更合适。 如果基于名称的地址更合适,则应在用户界面中内置命名约定,包括适合该任务的输入错误检查。

与显示 IPv6 地址相关的其他复杂性,开发人员在修改应用程序时以及设计 IPv6 地址的用户界面表示形式时,必须考虑这些地址。 以下一些注意事项如下:

  • 该地址是否应包含所有零序列,或使用双冒号表示法?
  • 是否更适合使用基于数字的地址表示形式或基于名称的表示形式?
  • 用户是否有兴趣识别寻址方案的某些方面,例如子网前缀、范围标识符或其他子字段?
  • 用户是否有兴趣确定地址的其他方面,例如 TLA 标识符、NLA 标识符或 SLA 标识符?
  • 用户界面能否识别嵌入的 IPv6 地址,如果是这样,如何处理和显示这些地址? 向用户显示地址信息时,是否区分与 IPv4 兼容的地址和 IPv4 映射的 IPv6 地址?

还有其他注意事项,开发人员在开发 IP 地址用户界面时应仔细考虑其客户受众。

最佳实践

  • 开发人员在修改应用程序以支持 IPv6 时,必须考虑每个用户界面的适当方法。 确保用户界面包含足够的长度来显示 IPv6 地址是强制性的,因为确定该地址是基于数字还是名称。
  • 尽可能使用 IPv6 地址时使用现有的 Winsock 和 IP 帮助程序函数,而不是重新实现此逻辑。 例如, RtlIpv6AddressToStringRtlIpv6AddressToStringExRtlIpv6StringToAddressRtlIpv6StringToAddressEx 函数可用于在 IPv6 地址和这些 IPv6 地址的字符串表示形式之间进行转换。

要避免的代码

  • 依赖于 IPv4 大小的地址的用户界面元素必须经过审查,其中一部分审查应包括你在 IPv4) 下提供 (的信息是否适合 IPv6。
  • 指定 IP 地址的功能还应取决于 IPv4 是否正在使用,还是 IPv6 可用。 如果 IPv6 可用,是否适合指定基于数字的 (十六进制) 地址或基于名称的地址?

编码任务

将现有代码库从 IPv4 修改为 IPv4 和 IPv6 互操作性

  1. 对用户界面执行可视评审,查找依赖于 IP 地址字符串的特定长度的任何元素。 具有易于识别的四节点十进制表示法的控件很容易发现,但其他控件则不是。 可能会有一些位置可以显示 IP 地址,例如在对话框中,IPv6 地址可能会耗尽显示室。
  2. 找到其中的任何控件后,请仔细检查在使用 IPv6 时是否适合显示地址。 如果 IPv4 或 IPv6 都可能正在使用,请确保用户界面可以容纳这两者。 使用可显示整个 IPv6 地址的用户界面控件替换或扩充任何控件。
  3. 跟进用户界面测试,确保启用 IPv6 地址的更改在使用 IPv4 地址时保持预期的可用性。 此外,测试协议地址显示位置(如信息性对话框),以确保它们正确处理 IPv6 地址。

Windows套接字应用程序的 IPv6 指南

更改 IPv6 Winsock 应用的数据结构

IPv6 Winsock 应用程序的双堆栈套接字

IPv6 Winsock 应用程序的函数调用

使用硬编码的 IPv4 地址

IPv6 Winsock 应用程序的基础协议