Зачем нужен цикл addrinfo?

Предположим, у нас есть чистая сеть IPv6. Приложение сокета использует getaddrinfo для поиска HOST1 по имени хоста и получает один из IP-адресов HOST1 в качестве первого ответа. Почему он должен зацикливаться на возвращаемых адресах? Разве маршрутизаторы, стек TCP/IP HOST1 или локальный стек TCP/IP не обязаны найти альтернативный маршрут к HOST1, возможно, через другой сетевой интерфейс на HOST1?

Вы могли бы подумать, что поиск маршрутов к хосту, известному по его имени, является наиболее базовой функцией инфраструктуры компьютерной сети, а не приложением сокетов.


person Joseph    schedule 07.10.2013    source источник


Ответы (3)


getaddrinfo() может дать вам адреса для имени, которое на самом деле является другим хостом, так что вы все равно сможете получить доступ к сервису, если один из хостов не работает.

Но интернет довольно тупой, это не интеллектуальная сеть, как пытались в старых телекоммуникационных сетях. Интернет доводит функциональность до предела, а маршрутизаторы просто смотрят IP-адреса в пакете и отправляют лучший канал, на который он способен. Это действительно решит проблемы, когда один путь к этому IP-адресу не работает, маршрутизатор отправит пакет по альтернативному пути.

Но край, ваше сокет-приложение, отвечает за решение, на какой IP-адрес вы хотите отправлять пакеты, и определяете ли вы, на какой IP-адрес отправлять пакеты, с помощью запросов DNS, LDAP, статической настройки, файлов конфигурации или что нет, это не забота сети.

Вы хотели бы зациклиться на результатах getaddrinfo(), потому что разрешение имени может дать вам разные IP-адреса, принадлежащие разным хостам по всему миру, которые предоставляют одну и ту же услугу, и могут быть доступны через IPv4 или IPv6.

person nos    schedule 07.10.2013

Нет, самая основная функциональность — это пересылка пакетов на хосты назначения. Дизайн Интернета направлен на то, чтобы позволить маршрутизаторам сосредоточиться на самых основных функциях и заставить конечные точки выполнять как можно больше всего остального.

Итак, можно и нужно ли оставлять этот бит для конечных точек? Я думаю, что да, так как это не требует дополнительной работы для конечных точек и потребует значительной дополнительной работы для маршрутизаторов.

Конечным точкам в любом случае нужен код, чтобы попробовать несколько адресов, чтобы поддерживать v4 и v6. И маршрутизаторы должны будут отслеживать, какие наборы адресов составляют хост (что бы ни означал «хост»).

person arnt    schedule 09.10.2013

Разрешение имен относится к другому уровню, чем маршрутизация. С технической точки зрения ваш вопрос предполагает, что маршрутизаторы являются шлюзами прикладного уровня, что было бы неэффективно. Вам лучше начать с некоторой литературы, которая дает вам обзор сетей TCP/IP.

person Pavel Šimerda    schedule 31.03.2014