IPv6 Winsock 应用程序的用户界面问题
从 IPv4 到 IPv6 的最明显变化之一是 IP 地址的大小。 许多用户界面都提供使用户能够输入 IP 地址的对话框,如下图所示。
由于 IPv6 地址空间中的长度、复杂性和部分的重要性等许多因素,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 帮助程序函数,而不是重新实现此逻辑。 例如, RtlIpv6AddressToString、 RtlIpv6AddressToStringEx、 RtlIpv6StringToAddress 和 RtlIpv6StringToAddressEx 函数可用于在 IPv6 地址和这些 IPv6 地址的字符串表示形式之间进行转换。
要避免的代码
- 依赖于 IPv4 大小地址的用户界面元素必须经过审查,并且审查的一部分应包括你在 IPv4) 下提供 (的信息是否适合 IPv6。
- 指定 IP 地址的功能还应取决于 IPv4 是否正在使用中,还是 IPv6 可用。 如果 IPv6 可用,是否适合指定基于数字 (十六进制) 地址或基于名称的地址?
编码任务
将现有代码库从 IPv4 修改为 IPv4 和 IPv6 互操作性
- 对用户界面执行可视化评审,查找依赖于 IP 地址字符串特定长度的任何元素。 使用易于识别的四节点十进制表示法的控件很容易发现,但其他控件则不是。 可能会有一些位置显示 IP 地址,例如在对话框中,IPv6 地址可能用完显示室。
- 找到任何这些控件后,请仔细检查在使用 IPv6 时显示地址是否合适。 如果 IPv4 或 IPv6 可能正在使用中,请确保用户界面可以容纳其中之一。 将任何控件替换为可显示整个 IPv6 地址的用户界面控件。
- 跟进用户界面测试,以确保启用 IPv6 地址显示的更改在使用 IPv4 地址时保持预期的可用性。 此外,测试协议地址显示位置(如信息对话框),以确保它们正确处理 IPv6 地址。
相关主题