跳到主要内容

4. 地址排序 (Sorting Addresses)

在尝试连接任何已解析的目的地址之前, 客户端应定义启动尝试的顺序. 一旦顺序确定, 客户端就可以使用一个简单算法, 在短暂延迟后让每个选项参与连接竞争 (见第 5 节). 有序列表包含截至此时收到的两个地址族的所有地址非常重要, 因为这允许客户端对整个列表获得 Happy Eyeballs 的竞争效果, 而不仅仅是第一个 IPv4 地址和第一个 IPv6 地址.

首先, 客户端 MUST 使用目的地址选择 (Destination Address Selection, [RFC6724] 第 6 节) 对截至此时收到的地址进行排序.

如果客户端是有状态的, 并且保存了到达各地址路由的预期往返时间 (round-trip time, RTT) 历史, 它 SHOULD 在规则 8 和规则 9 之间添加一条目的地址选择规则, 优先选择 RTT 较低的地址. 如果客户端跟踪过去使用过哪些地址, 它 SHOULD 在 RTT 规则和规则 9 之间再添加一条目的地址选择规则, 优先选择已使用地址而非未使用地址. 这有助于那些在认证期间使用客户端 IP 地址的服务器, 例如 TCP Fast Open [RFC7413] 和某些超文本传输协议 (Hypertext Transport Protocol, HTTP) cookie 的情况. 这些历史数据 MUST NOT 跨不同网络接口使用, 并且 SHOULD 在设备改变其所连接网络时清除.

接下来, 客户端 SHOULD 修改有序列表, 使地址族交错排列. 无论列表中首先出现哪个地址族, 其后都应跟随另一个地址族的地址; 也就是说, 如果排序后列表中的第一个地址是 IPv6, 则第一个 IPv4 地址应被上移到列表第二位. 实现 MAY 希望更偏向某个地址族, 允许在尝试另一个地址族之前先尝试该地址族的多个地址. 第一个地址族的连续地址数量称为 "First Address Family Count", 并且可以是可配置值. 这样做是为了在某个地址族的连通性受损时, 避免等待该地址族的一长串地址.

注意, 本节描述的地址选择仅适用于目的地址; 源地址选择 (Source Address Selection, [RFC6724] 第 5 节) 会针对每个目的地址执行一次, 超出本文档范围.