0.0.0.0:0 и *: * означают одно и то же?

23

Я использовал netstat (в Windows) для просмотра прослушиваемых портов для TCP и UDP:

введите описание изображения здесь

Я заметил, что в столбце « Внешний адрес»*:* вместо UDP отображаются 0.0.0.0:0эти два значения, представляющие одно и то же? Если так, то почему *:*вместо этого отображается UDP 0.0.0.0:0?

user612473
источник
Я считаю, *:*что IPv6, а 0.0.0.0:0IPv4.
LPChip
Я также заметил следующее: UDP 0.0.0.0:5355 *:*означает ли это, что данные могут передаваться между IPv4 и IPv6?
user612473
Посмотрите здесь: security.stackexchange.com/questions/13724/…
болотный
4
IPv6-эквивалент 0.0.0.0 - это [::]
болтовня
2
@LPChip Вы ошибаетесь. *:*ничего не говорит о версии IP. Однако, поскольку локальным адресом этого сокета является только IPv4, удаленный адрес также должен быть IPv4.
Касперд

Ответы:

12

Было указано, что мой ответ был ошибочным. Поскольку я не могу удалить его, я вместо этого предоставлю правильный.

Выражение *:*означает «Любой адрес, любой порт». Все слушатели UDP будут отображать эту подпись. Это связано с природой UDP без установления соединения.


Оригинальный (неверный) ответ. Да и нет. *:*относится к ЛЮБОМУ IPv6-адресу. Различие между неизвестным / неуказанным адресом в IPv4 нечеткое, поэтому мы используем 0.0.0.0/0 для представления любого хоста в сети, но в IPv6 есть небольшая разница.

Однако, по большей части, люди используют ::для представления непрерывной строки из 0.

В адресе IPv6 любая последовательность смежных нулей может быть заменена на :: :

  • 0.0.0.0/0=> 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0000 => ::=>*:*
  • fe80:0000:0000:0000:2000:0aff:fea7:0f7c => fe80::2000:0aff:fea7:0f7c

Однако представление с использованием подстановочных знаков позволяет лучше контролировать шаблоны адресов. Например, ::не будет соответствовать fe80::2000:0aff:fea7:0f7c, но *:*будет.

Это различие не имеет никакого смысла для любого устройства, которое не выполняет маршрутизацию, но когда приходит время выбирать оптимальные маршруты к агрегированным адресным пространствам, подстановочная запись позволяет более гибко выбирать сети назначения.

Фрэнк Томас
источник
5
Но вы написали в своем ответе, что *:* refers to ANY IPv6 address здесь вы говорите, как any..addressправило, IPv4 или IPv6. Так что это? *:*Ограничивает ли себя IPv6 или тоже разрешает IPv4?
Барлоп
2
Оба сокета, упомянутые в вопросе, предназначены только для IPv4. Это видно по локальному адресу, назначенному каждому сокету. Как таковое упоминание IPv6 не имеет отношения к вопросу.
Касперд
7
IPv6 вообще не имеет отношения к этому вопросу.
Хоббс
8
Этот ответ совершенно не соответствует заданному вопросу.
Брэд
3
Как отмечает комментарий Каспердакомментарий Хоббса ), IPv6 не имеет отношения к этому вопросу. Вопрос в том, что мы видим в столбце «Внешний адрес», который соответствует тому, что находится в той же строке (-ях) в столбце «Локальный адрес», то есть IPv4. (Хотя в некоторых операционных системах прослушивание одного семейства адресов / IP-версии обычно может автоматически прослушивать другое семейство адресов.)
TOOGAM
15

/Относится к подсети сетевой маски, которая является частью IP - уровня.

:Относится к порту , который является частью транспортного уровня.

Для TCP имеет смысл наличие удаленного конца для соединения.

UDP, поскольку он не имеет соединения, для него нет смысла показывать внешний адрес.

Мне кажется, что он всегда будет показывать подстановочный знак для UDP и что он потенциально может сделать анализ вывода более удобным или показать, используете ли вы IPv4 / 6:

IPV4 "*:*" против IPV6 "[::]:*"

Люк Экстон
источник
Я просто говорил это некоторым друзьям. Вы можете отображать PORTS прослушивания, но для отображения реальных удаленных сеансов, когда их нет, вероятно, причина, по которой они отображаются как *:*для удаленных несуществующих сеансов UDP. Я согласен с вами здесь.
NotAdmin Дейв
6

В обоих случаях информация в основном бессмысленна, но указывает более или менее на одно и то же.

Ваша первая строка - это прослушивающий сокет TCP. Столбец локального адреса указывает адрес и порт, на котором он принимает соединения, а столбец удаленного адреса ничего не значит, потому что у прослушивающего сокета еще нет удаленного конца соединения. Подключенный сокет TCP покажет адрес другого конца соединения в этой колонке, но для сокеты он решает отобразить все-нулевой адрес и порт.

Ваша вторая строка - это сокет UDP. UDP - это протокол без установления соединения, который означает, что он отправляет и принимает пакеты без какого-либо представления о том, кто к кому подключен, является ли пакет частью существующего диалога, или же данные только что поступили неожиданно. Столбец локального адреса имеет то же значение, что и для TCP, а столбец удаленного адреса не имеет смысла, поскольку сокет UDP может иметь один одноранговый узел, множество одноранговых узлов или не иметь одноранговых узлов в любой момент. (На самом деле у POSIX есть понятие «подключенный UDP-сокет», но это становится немного далеким).

Теперь вопрос: почему они отображаются по-разному? Кажется, это не что иное, как причудливый код Windows netstat. Netstat Linux (net-tools) отображает 0.0.0.0:*для удаленного конца как сокеты прослушивания TCP, так и UDP-сокеты (для IPv4; он отображает :::*для IPv6), что отличается от любого примера в Windows, но, по крайней мере, является совместимым в одной и той же программе. Возможно, Windows собирается провести семантическое различие между «быть заполненным позже» в случае TCP и «открытым для чего-либо» в случае UDP, но с той же вероятностью два бита кода были написаны двумя разными людьми без Особая забота о последовательности.

Hobbs
источник
+1 за начало 4-го абзаца. 0.0.0.0 имеет некоторую документацию: адрес всех нулей является «неопределенным» адресом (согласно IPv6 Addressing RFC 4291 sec 2.5.2 ), часто применяемым к неизвестным адресам. В RFC 1700 на стр. 4 упоминается «Можно использовать только в качестве адреса источника», а в разделе «a» в RFC 1122 # page-29 описывается использование. ( мой ответ о ::: упоминает 0.0.0.0)
TOOGAM
Разве 0.0.0.0:0значение в столбце « Внешний адрес» не означает, что любой IP-адрес и номер порта могут отправлять данные в этот сокет? и если это значение было, например 127.0.0.0:12345, то это значит, что только IP-адрес 127.0.0.0с номером порта 12345может отправлять данные в этот сокет и больше никому?
Том
6

Разница просто нотационная.

Netstat в Windows использует 0.0.0.0:0для представления абстрактной идеи «любой удаленный адрес и порт» для локального прослушивателя TCP IPv4 и *:*для прослушивателя UDP. Для IPv6 удаленный адрес обозначается как [::]:0для TCP и *:*для UDP.

В OS X *.*используется как для TCP, так и для UDP, будь то IPv4 или IPv6 (обратите внимание, что OS X использует точки для разделения адреса и порта). Linux использует 0.0.0.0:*для IPv4 и :::*для IPv6, причем первые две двоеточия представляют сокращение для всех адресов IPv6, а третье двоеточие - разделитель между адресом и портом.

IIRC из того, что я слышал или читал давно, я думаю, что пары UDP могут появляться, но обычно нет, потому что они разрываются после завершения, а соединения UDP, как правило, очень короткие, длительностью миллисекунды или меньше. Я сам никогда этого не видел, так что это может быть неправильно.

NetworkLlama
источник