2013-10-07 38 views
0

假设我们有一个纯粹的IPv6网络。 套接字应用程序使用getaddrinfo通过其主机名查找HOST1,并获取HOST1的一个IP地址作为第一个响应。 为什么它应该在返回的地址上循环? HOST1的TCP/IP堆栈或本地TCP/IP堆栈是否负责路由器或HOST1的另一个网络接口,以查找到HOST1的备用路由?为什么addrinfo循环需要?

你会认为找到名字为主机的路由是计算机网络基础设施的最基本功能,而不是套接字应用。

回答

3

getaddrinfo()可以为您提供一个真正属于不同主机的名称的地址,因此如果某个主机关闭,您仍然可以访问该服务。

但是互联网非常笨拙,它不像他们在旧电信网络中尝试的那样是一个智能网络。互联网将功能推向边缘,路由器只是查看数据包中的IP地址并发送出最佳管道。这确实会处理一个IP地址的路径被破坏的问题,路由器将在另一条路径上发送数据包。

但是,您的套接字应用程序的边缘负责决定要将数据包发送到哪个IP地址,以及是否通过查询DNS,LDAP,静态配置来确定要将数据包发送到哪个IP地址,配置文件还是什么不是,不关心网络。

您希望循环getaddrinfo()结果,因为解析名称可以为您提供不同的IP地址,属于世界各地提供相同服务的不同主机,并且可以通过IPv4或IPv6访问。

0

不,最基本的功能是将数据包转发到目标主机。互联网设计旨在让路由器专注于最基本的功能,并使端点尽可能地完成其余的工作。

那么,可以和应该这个位被留给端点?我认为是的,因为对于端点来说没有额外的工作,并且对于路由器来说是相当多的额外工作。

无论如何,端点需要代码才能尝试多个地址,以支持v4和v6。路由器必须跟踪哪些地址组成主机(无论“主机”的含义)。

0

名称解析属于与路由不同的层。用技术术语来说,你的问题是假设路由器是应用层网关,效率不高。您最好从一些文献开始,介绍TCP/IP网络。