Семантика:: и 0.0.0.0 в Ose двойного стека

примечание: не эксперт по семантике захвата файла окон

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

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

10
задан 8 June 2009 в 04:48
3 ответа

К сожалению, это отличается, в зависимости от какой операционной системы Вы используете.

На Microsoft Windows, связывая сокет с :: только связывает с портами IPv6. Таким образом для слушания на всех адресах и на IPv4 и на IPv6 необходимо связать с 0.0.0.0 а также ::. Следующее извлечение от поля Vista:

C:\>netstat -an | find "445"
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    [::]:445               [::]:0                 LISTENING

Примером, который я даю, является порт 445, используемый для трафика SMB, когда NetBIOS не используется. Как Вы видите, это связывает с обоими 0.0.0.0 и :: для создания, соответственно, и IPv4 и клиенты IPv6 работают.

На Linux, :: является содержащим из совместимых с IPv4 адресов, как Вы правильно предположили, таким образом связав с 0.0.0.0 также является ненужным. Я записал простую программу Python, которая только связывает с AF_INET6 сокет на ::. Даже при том, что я также не связывал с AF_INET (IPv4) снабжает сокетом, он все еще принимает соединения от клиентов IPv4. Если, скажем, 10.1.1.3 подключения к нему, он обнаружится как соединяющийся от ::ffff:10.1.1.3.

За исключением того, что это становится волосатым. Вышеупомянутое не применяется на Linux если /proc/sys/net/ipv6/bindv6only установлен на 1, в этом случае поведение является точно тем же как Windows - связывающий с :: только прислушается к запросам IPv6. Если Вы захотите прислушаться к запросам IPv4 также, то необходимо будет создать AF_INET снабдите сокетом и послушайте на 0.0.0.0 также. К счастью, значение по умолчанию для bindv6only 0, таким образом, существует очень небольшой шанс, необходимо будет когда-либо иметь дело с этим (кроме того, если Вы используете Debian, который на самом деле значения по умолчанию к bindv6only = 1).

Все это удобно для знания в проверке, чтобы видеть, является ли сервис поддерживающим IPv6, и является ли это поддерживающим IPv4 также. Вот мой сервер SSH:

$ netstat -64ln | grep 22
tcp6    0    0 :::22    :::*    LISTEN

Как Вы видите, SSH только слушает на :: порт 22. Однако это только прислушивается к клиентам IPv6 - это хорошо работает от клиентов IPv4 из-за совместимой с IPv4 привязки. Для доказательства этого, если Вы смотрите на это:

$ cat /proc/sys/net/ipv6/bindv6only 
0

bindv6only отключен (значение по умолчанию). Если это было установлено на 1, затем я должен был бы поощрить SSH слушать на 0.0.0.0 также (или вместо этого).

Извинения за то, что не имелась информация о стороне Mac OS X вещей. Я использовал его в прошлом, но я предпочитаю эстетику GNOME, таким образом, я не использовал его в очень долгое время. Однако я предположил бы, что поведение совпадает с поведением Linux.

Надеюсь, это поможет.

17
ответ дан 2 December 2019 в 22:03

Это не возможно, поскольку сегмент адресного пространства IPv6 совпадает с пространством IPv4, поэтому даже если бы Вы могли бы так или иначе отключить сокеты IPv4, Вы все еще смогли бы отправить пакеты IPv4 на сокет IPv6. Контроль раздел перехода IPv4 на странице Википедии IPv4.

Править: А-ч, бит далее вниз это действительно говорит:

Некоторые общие стопки IPv6 не поддерживают отображенную функцию адреса IPv4, также потому что IPv6 и стопки IPv4 являются отдельными реализациями (Microsoft Windows до Vista/Лонгхорна: например, XP/2003), или из-за проблем безопасности (OpenBSD). В этих операционных системах необходимо открыть отдельный сокет для каждого протокола IP, который должен поддерживаться. В некоторых системах (например, Linux, NetBSD, FreeBSD) этой функцией управляет опция IPV6_V6ONLY сокета, как указано в RFC 3493
4
ответ дан 2 December 2019 в 22:03

Вы могли, вероятно, сделать это со своим идентификатором сети, AAAA:BBBB:CCCC:DDDD:: или независимо от того, что это для Вас. Это гарантировало бы, что только интерфейсы IPv6 возьмут его. Я думаю. Я не ведущее устройство IPv6.

-1
ответ дан 2 December 2019 в 22:03

Теги

Похожие вопросы