假设我们有一个纯 IPv6 网络。套接字应用程序使用 getaddrinfo 通过其主机名查找 HOST1,并获取 HOST1 的一个 IP 地址作为第一个响应。为什么要在返回的地址上循环?路由器或 HOST1 的 TCP/IP 堆栈或本地 TCP/IP 堆栈是否有责任寻找到 HOST1 的备用路由,也许通过 HOST1 上的不同网络接口?
您可能会认为查找到名称已知的主机的路由是计算机网络基础设施的最基本功能,而不是套接字应用程序。
假设我们有一个纯 IPv6 网络。套接字应用程序使用 getaddrinfo 通过其主机名查找 HOST1,并获取 HOST1 的一个 IP 地址作为第一个响应。为什么要在返回的地址上循环?路由器或 HOST1 的 TCP/IP 堆栈或本地 TCP/IP 堆栈是否有责任寻找到 HOST1 的备用路由,也许通过 HOST1 上的不同网络接口?
您可能会认为查找到名称已知的主机的路由是计算机网络基础设施的最基本功能,而不是套接字应用程序。
getaddrinfo() 可以为您提供一个名称的地址,该名称实际上是一个不同的主机,因此如果一个主机关闭,您仍然可以访问该服务。
但是互联网很笨,它不是他们在旧电信网络中尝试的智能网络。互联网将功能推向边缘,路由器只需查看数据包中的 IP 地址并发出它可以发送的最佳管道。这确实会解决通往该 IP 地址的一条路径被破坏的问题,路由器将在另一条路径上发送数据包。
但是边缘,您的套接字应用程序,负责决定您要将数据包发送到哪个 IP 地址,以及您是否通过查询 DNS、LDAP、静态配置、配置文件或什么不是,是没有网络的关注。
您可能希望循环查看 getaddrinfo() 结果,因为解析名称可以为您提供不同的 IP 地址,它们属于世界各地提供相同服务的不同主机,并且可以通过 IPv4 或 IPv6 访问。
不,最基本的功能是将数据包转发到它们的目标主机。互联网设计旨在让路由器专注于最基本的功能,并让端点尽可能多地完成其余的工作。
那么,可以而且应该将这一位留给端点吗?我认为是的,因为它对端点没有额外的工作,对路由器来说是相当多的额外工作。
无论如何,端点都需要代码来尝试多个地址,以支持 v4 和 v6。并且路由器必须跟踪哪些地址集构成主机(无论“主机”是什么意思)。
名称解析属于与路由不同的层。用技术术语来说,您的问题假设路由器是应用层网关,效率低下。您最好从一些文献开始,这些文献为您提供 TCP/IP 网络的概述。