Я перенес приложение для поддержки IPv6, используя популярные руководства. Я решил использовать только один прослушиватель сокетов для обоих протоколов. Теперь я понял, что мне нужно правильно установить IPV6_V6ONLY (из коробки он работает только на моем x86 linux, но не на моем ARM).

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

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

5
duedl0r 18 Дек 2013 в 16:00

2 ответа

Лучший ответ

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

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

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

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

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

4
Jeremy Visser 18 Дек 2013 в 12:31

В любом случае это нормально.

Если вы привязываете v4 и v6 явно, вам нужно установить IPV6_V6ONLY, в противном случае вам нужно очистить его. Настройка по умолчанию зависит от платформы.

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

2
Simon Richter 18 Дек 2013 в 12:08