23

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

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

4 ответа4

15

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

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

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

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

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

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

12

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

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


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

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

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

  • 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 , но *:* будет.

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

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-соединения обычно очень короткие, продолжаются миллисекунды или меньше. Я никогда не видел это сам, поэтому это может быть неправильно.

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, но с той же вероятностью два бита кода были написаны двумя разными людьми без Особая забота о последовательности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .