Подтвердить что ты не робот

Какова была мотивация добавления флага IPV6_V6ONLY?

В сети IPv6 флаг IPV6_V6ONLY используется для обеспечения того, что сокет будет использовать только IPv6, и, в частности, сопоставление IPv4-IPv6 не будет использоваться для этого сокета. На многих ОС IPV6_V6ONLY не установлен по умолчанию, но на некоторых ОС (например, Windows 7) он установлен по умолчанию.

Мой вопрос: Какова была мотивация для введения этого флага? Что-то связано с отображением IPv4-to-IPv6, которое вызывало проблемы, и, следовательно, людям нужен способ его отключения? Мне показалось, что если кто-то не хочет использовать сопоставление IPv4-to-IPv6, они могут просто не указывать IPv6-адрес IPv4-сопоставленного IPv6. Что мне здесь не хватает?

4b9b3361

Ответ 1

Я не знаю, почему это было бы по умолчанию; но это тип флагов, которые я всегда ставил явным, независимо от того, что по умолчанию.

О том, почему он существует в первую очередь, я предполагаю, что он позволяет сохранить существующие серверы только для IPv4 и просто запускать новые в одном и том же порту, но только для соединений IPv6. Или, может быть, новый сервер может просто прокси-клиентов на старый, что делает работу IPv6 простой и безболезненной для добавления к старым службам.

Ответ 2

Не все платформы, поддерживающие IPv6, поддерживают сокеты с двойным стеклом, поэтому возникает вопрос, как приложения, требующие максимизировать совместимость с IPv6, либо знают, что dualstack поддерживается или связывается отдельно, когда его нет? Единственный универсальный ответ - IPV6_V6ONLY.

Приложение, игнорирующее IPV6_V6ONLY или написанное до наличия стеков IP-совместимых стеков, может найти привязку отдельно к ошибкам V4 в среде двойного старта, поскольку сокет с двойным стеклом IPv6 привязан к IPv4, предотвращающий привязку сокета IPv4. Приложение также не может ожидать IPv4 через IPv6 из-за проблем с адресацией на уровне протокола или прикладного уровня или элементов управления доступом к IP.

Это или подобные ситуации, скорее всего, побудили MS et al к умолчанию 1, даже RFC3493 объявляет 0 значением по умолчанию. 1 теоретически максимизирует обратную совместимость. В частности, Windows XP/2003 не поддерживает сокеты dualstack.

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

Ответ 3

Причина, которая чаще всего упоминается, относится к случаю, когда сервер имеет какую-то форму ACL (Access Control List). Например, представьте себе сервер с такими правилами, как:

Allow 192.0.2.4
Deny all

Он работает на IPv4. Теперь кто-то запускает его на машине с IPv6 и, в зависимости от некоторых параметров, запросы IPv4 принимаются в сокет IPv6, отображаемые как:: 192.0.2.4, и затем больше не сопоставляются с первым ACL. Внезапно доступ будет отклонен.

Явное в вашем приложении (с использованием IPV6_V6ONLY) решит проблему, независимо от того, что по умолчанию имеет операционная система.

Ответ 4

Для Linux при написании службы, которая прослушивает как сокеты IPv4, так и IPv6 на служебном порту тот же, например. порт 2001, вы ДОЛЖНЫ называть setsockopt (s, SOL_IPV6, IPV6_V6ONLY, и один, sizeof (один)); на разъеме IPv6. Если вы этого не сделаете, операция bind() для сокета IPv4 завершится с "Адресом, который уже используется".

Ответ 5

Существуют правдоподобные способы, с помощью которых (плохо названные) адреса с IPv4-адресами могут использоваться для обхода плохо сконфигурированных систем или плохих стеков или даже в хорошо сконфигурированной системе может потребоваться только чрезмерное количество ошибок. Разработчик может захотеть использовать этот флаг, чтобы сделать их приложение более безопасным, не используя эту часть API.

Смотрите: http://ipv6samurais.com/ipv6samurais/openbsd-audit/draft-cmetz-v6ops-v4mapped-api-harmful-01.txt

Ответ 6

Представьте протокол, который включает в разговор сетевой адрес, например. канал передачи данных для FTP. При использовании IPv6 вы собираетесь отправить IPv6-адрес, если получатель окажется адресом IPv4, он не сможет подключиться к этому адресу.

Ответ 7

Существует один очень распространенный пример, когда двойственность поведения является проблемой. Стандартный вызов getaddrinfo() с флагом AI_PASSIVE предлагает возможность передать параметр nodename и возвращает список адресов для прослушивания. Специальное значение в виде строки NULL принимается для nodename и подразумевает прослушивание подстановочных адресов.

В некоторых системах 0.0.0.0 и :: возвращаются в этом порядке. Если по умолчанию установлен двухъядерный сокет, и вы не устанавливаете сокет IPV6_V6ONLY, сервер подключается к 0.0.0.0, а затем не может подключиться к двойному стеке ::, и поэтому (1) работает только на IPv4 и (2) сообщает об ошибке.

Я считаю неправильный порядок, поскольку ожидается, что IPv6 будет предпочтительнее. Но даже когда вы сначала пытаетесь выполнить двойной стек ::, а затем только IPv4 0.0.0.0, сервер по-прежнему сообщает об ошибке для второго вызова.

Я лично считаю всю идею сокета с двойным стеком ошибкой. В моем проекте я предпочел бы всегда явно устанавливать IPV6_V6ONLY, чтобы этого избежать. Некоторые люди, по-видимому, рассматривали это как хорошую идею, но в этом случае я, вероятно, явно отключил бы IPV6_V6ONLY и перевел NULL непосредственно на 0.0.0.0 в обход механизма getaddrinfo().