在连接到另一个站点时,Linux 如何从众多 IPv6 源地址中选择使用哪一个?我正在从配置了 6to4 和非 6to4 地址的主机打开到 6to4 和非 6to4 站点的连接。
我的 Linux 机器配置了 6to4 和非 6to4 IPv6 地址,当连接到另一个 6to4 主机时,它确实似乎选择了 6to4 源地址,而当连接到非 6to4 主机时,它选择了非 6to4 地址。这样速度更快,因为 6to4 链路的两个方向都可以绕过隧道服务器。我不确定我是否只是运气好,或者这是预期的行为。
一台具有相同 IPv6 路由通告的 iPad 甚至在连接到 ipv6.he.net 等网站时也选择使用 IPv4,因此我不再通告 6to4 路由。本地路由器仍然有自己的 6to4 网关,可以绕过传出 6to4 的隧道。
答案1
gai.conf
关于这一点最好的文献来自 Ulrich Drepper,他描述了RFC 3484、glibc 的连接获取地址信息(3)和内核地址选择。
http://www.akkadia.org/drepper/linux-rfc3484.html
顺便说一句:iproute2 在更高版本中支持gai.conf
文件使用ip addrlabel show
命令。你可以在本文中找到一些示例:
- http://linux-hacks.blogspot.com/2008/04/default-address-selection-part-1.html
- http://linux-hacks.blogspot.com/2008/07/default-address-selection-part-2.html
问候
Bernd
答案2
路由表,此外范围标识符用于链路本地范围地址。
http://en.wikipedia.org/wiki/Routing_table
http://en.wikipedia.org/wiki/IPv6_address#Link-local_addresses_and_zone_indices
编辑:有趣的是,我最近发现 TCP 堆栈的要求比 UDP 或数据报更严格。如果主机上的地址很明显,那么使用 UDP 时,您可以经常避免使用范围标识符,但是 TCP 根本不允许您有这种自由,必须始终指定标识符。
答案3
我能找到的最好的文档是 RFC 3484 IPv6 的默认地址选择及其修订草案https://datatracker.ietf.org/doc/html/draft-ietf-6man-rfc3484-revise-03