Каковы будут недостатки / риски использования AF_UNSPEC? - PullRequest
8 голосов
/ 16 ноября 2011

С Руководство Биджа по сетевому программированию

Вы можете заставить его использовать IPv4 или IPv6 в поле ai_family или оставить его как AF_UNSPEC, чтобы использовать что угодно. Это круто, потому что ваш код может быть независимым от IP-версии.

Как видно из заголовка - какие будут недостатки (или риски, если таковые имеются) всегда использовать AF_UNSPEC вместо указания IPv4 или IPv6?

Или это только по одной причине - если указана версия, это будет гарантировать, что эта и только эта версия поддерживается?


Немного предыстории - я думаю о добавлении поддержки IPv6 в приложениях клиент-сервер (C ++), и обе версии должны поддерживаться. Поэтому мне стало интересно, можно ли использовать AF_UNSPEC или лучше «распознать» адрес из строки и использовать AF_INET6 или AF_INET, в зависимости от адреса.

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Вы должны различать клиентские и серверные приложения.

На клиенте это просто: просто позвоните getaddrinfo() и попробуйте каждый из ответов последовательно, пока не получите соединение.

На сервере все немного сложнее:

  • Есть системы, у которых стеки IPv4 и v6 взаимосвязаны, для этого достаточно просто прослушать IPv6. Может быть, сокет должен быть включен для прослушивания обоих.
  • Другие системы, такие как Windows XP, имеют отдельные стеки, где это соединение невозможно. Там вам придется работать с несколькими сокетами одновременно. Позвольте мне сосредоточиться на следующем:

Даже на серверах можно использовать getaddrinfo(). Там вы используете флаг AI_PASSIVE в подсказках. Тогда вы получите результаты. Все это вам придется слушать, возможно, включив флаг IPV6_V6ONLY.

accept() следует сделать неблокирующим или с помощью select() или poll() (не уверен, возможно ли последнее).

3 голосов
/ 16 ноября 2011

То, как все должно быть:

Приложения должны быть независимыми от уровня 3.Подключение к другой системе должно быть сделано по имени.Имя должно быть разрешено по одному или нескольким адресам, и приложение должно подключаться к ним, не обращая внимания на используемый протокол.Таким образом, за сетевую конфигурацию отвечают администраторы сети и системы.Если в сети внедряется IPv6, приложение продолжает работать, даже не замечая различий.

Некоторые реальные проблемы:

Иногда IPv6 плохо настроен, брандмауэр не знает, какдля работы с IPv6 IPv6 используется только в локальной сети без подключения к Интернету и т. д. Это не должно быть проблемой, но иногда вы сталкиваетесь с плохой реализацией или конфигурацией.Чтобы справиться с этим, IETF работает над проектом под названием happy-eyeballs .Это гарантирует, что пользователь не замечает таких проблем.Посмотрите на этот проект.Использование методов, указанных в этом проекте, гарантирует, что ваше приложение будет работать хорошо для всех пользователей.

0 голосов
/ 17 февраля 2016

Один из рисков использования AF_UNSPEC заключается в том, что вы подвергаете клиента большим откликам со стороны вредоносного DNS-сервера, который может пытаться использовать CVE-2015-7547, чтобы вызвать переполнение стекового буфера и заставить вредоносный код выполняться клиент. Фактически, один из предложенных способов устранения известного дефекта в getaddrinfo состоит в том, чтобы предотвратить использование AF_UNSPEC, как указано здесь в отчете об ошибке. Дефект переполнения для ответов DNS больше 2K влияет на glibc из 2.9 и исправлен в 2.23. Это влияет на большинство установленных в настоящее время дистрибутивов Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...