Подключение к IP 0.0.0.0 успешно. Как? Зачем?

41

Мы обслуживаем порт на локальном хосте и хотим проверить в другом процессе, доступен ли порт. Из-за ошибки в нашем коде он на самом деле пытается подключиться к IP 0.0.0.0:<port>, и по какой-то причине это удается - как доказывает strace:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

Что это означает? Почему это работает?

erikbwork
источник

Ответы:

68

0.0.0.0 в качестве целевого адреса по-разному относится к не маршрутизируемому хосту или «этому хосту» . На практике подключение к 0.0.0.0 эквивалентно подключению к localhost. (Строго говоря, он недействителен как адрес назначения, только как адрес источника, но практика не соответствует теории.)

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

Стивен Китт
источник
7
Чтобы немного расширить этот ответ - это означает «любой IP-адрес в этой системе, включая IP-адреса, которые были добавлены после начала процесса прослушивания»
Criggie
5
localhost - это один адрес, в основном 127.0.0.1, а 0.0.0.0 означает все адреса на этом хосте.
rexkogitans
@rexkogitans локальный не один адрес, но любой адрес в диапазоне 127.0.0.0/8 - т.е. любой адрес от 127.0.0.0 до 127.255.255.255
Dezza
6
@ Dezza Нет, localhost - это 127.0.0.1. 127.0.0.0/8 (как вы говорите, от 127.0.0.0 до 127.255.255.255) является шлейфом с большинством оборудования, например, документировано в RFC 5735 стр. 4 . (Интересно, что некоторое оборудование Cisco может назначить loopback любому адресу, но по умолчанию вообще не поддерживает loopback. Не то, чтобы это могло повлиять на другое оборудование в сети.) Однако localhost - это имя, обычно указывающее только на один адрес 127.0.0.1, обычно реализуемый с помощью файла hosts. Поэтому я не согласен с вашей попыткой исправления.
ТООГАМ
Не могли бы вы уточнить, что вы подразумеваете под «он недействителен как адрес назначения, только как адрес источника»? Когда сервер MySQL слушает на 0.0.0.0, адрес назначения или источника? Разве это не место назначения запроса, отправленного с клиента MySQL?
Тим