2013-12-18 3 views
5

Я портировал приложение для поддержки IPv6, используя популярные обучающие программы. Я решил использовать только один прослушиватель сокетов для обоих протоколов. Теперь я понял, что должен правильно установить IPV6_V6ONLY (он работает только на моем x86-Linux, но не на моей ARM).Слушатель сокетов для IPv6 и IPv4

Действительно ли это путь? Некоторые говорят, что IPV6_V6ONLY не должен использоваться (видимо, он устарел, из-за сопоставления IPv4 через провод), некоторые говорят, что использование одного сокета для обоих протоколов в порядке.

Итак, я смущен. Каково текущее состояние этой проблемы? Я неправильно понял проблему?

+0

Немного разъяснений: V6ONLY влияет на то, как программное обеспечение обрабатывает пакеты. Это не влияет на биты на проводе. Со стороны программного обеспечения все выглядит как пакет IPv6. Если на проводе это фактически пакет IPv4, то программная сторона делает его похожим на пакет IPv6 и сопоставляет адреса IPv4 с адресами IPv6, которые являются «:: ffff:», за которыми следуют 32 бита адреса IPv4. V6ONLY только изменяет это в программном обеспечении. На проводе они являются обычными пакетами IPv4 и IPv6. Адреса ':: ffff:' никогда не видны на проводе. –

+0

Ах, да, для уточнения. Так что это только устарело на проводе, и возможно использование «IPV6_V6ONLY». Как обращаться с ним, если он поддерживается или нет, это другое обсуждение :) – duedl0r

ответ

4

Вы должны всегда связывать оба сокета явно, при этом сокет IPv6 связан с IPV6_V6ONLY.

Почему? Кросс-платформенная совместимость.

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

Linux по умолчанию будет неявно связываться с IPv4, а также при привязке к IPv6, только если значение net.ipv6.bindv6only sysctl установлено равным 0. Распределения, такие как Debian, по умолчанию меняют 1, нарушая ваше предположение.

Я не помню, что здесь делает Mac OS X (кто-то щебетает в комментариях?), Но дело в том, что явное связывание с обоими протоколами не вызывает никаких сюрпризов.

+0

Значение 'net.ipv6.bindv6only' определяет значение по умолчанию, если я не устанавливаю его с помощью setocket. Вы можете перезаписать его, если вы установите IPV6_V6ONLY на сокет, правильно? Мне интересно, это зло или нет :) давайте предположим, что на данный момент я только нацелен на Linux. – duedl0r

+1

@ duedl0r Лучше не принимать значения по умолчанию; он может измениться, или системный администратор может его изменить. Лучше всегда связывать явным образом или настраивать параметры, которые пользователь может установить. –

2

Все в порядке.

Если вы связываете v4 и v6 явно, вам необходимо установить IPV6_V6ONLY, в противном случае вам необходимо его очистить. Значение по умолчанию зависит от платформы.

Некоторые платформы не поддерживают прием соединений v4 на разъемах v6, поэтому для максимальной совместимости я бы выбрал подход «двух сокетов».

 Смежные вопросы

  • Нет связанных вопросов^_^