Czy 0.0.0.0:0 i *: * reprezentują to samo?

23

Użyłem netstat (w systemie Windows), aby wyświetlić nasłuchiwane porty dla TCP i UDP:

wprowadź opis zdjęcia tutaj

Zauważyłem, że w kolumnie Adres obcy wyświetlane są *:*zamiast UDP 0.0.0.0:0te dwie wartości? Jeśli tak, to dlaczego wyświetla się *:*zamiast UDP 0.0.0.0:0?

użytkownik612473
źródło
Wierzę, że *:*jest IPv6, podczas gdy 0.0.0.0:0jest IPv4.
LPChip
Zauważyłem również: UDP 0.0.0.0:5355 *:*czy to oznacza, że ​​dane mogą być przesyłane między IPv4 a IPv6?
user612473,
4
ekwiwalent IPv6 0.0.0.0 to [::]
marsh-wiggle
2
@LPChip Mylisz się. *:*nie mówi nic o wersji IP. Ponieważ jednak lokalny adres tego gniazda to tylko IPv4, zdalny adres musi być również IPv4.
kasperd

Odpowiedzi:

12

Wskazano, że moja odpowiedź była błędna. Ponieważ nie mogę go usunąć, zamiast tego podam poprawny.

Wyrażenie *:*oznacza „Dowolny adres, dowolny port”. Wszyscy słuchacze UDP będą wyświetlać ten podpis. Wynika to z bezpołączeniowego charakteru UDP.


Oryginalna (niepoprawna) odpowiedź. Tak i nie. *:*odnosi się do DOWOLNEGO adresu IPv6. W IPv4 rozróżnienie między nieznanym / nieokreślonym adresem jest niejasne, dlatego używamy 0.0.0.0/0 do reprezentowania dowolnego hosta w sieci, ale w IPv6 istnieje subtelna różnica.

Jednak w przeważającej części ludzie ::reprezentują ciąg ciągów zer.

W adresie IPv6 dowolną sekwencję ciągłych zer można zastąpić :: :

  • 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

Reprezentacja za pomocą symboli wieloznacznych pozwala jednak na dokładniejszą kontrolę wzorców adresów. Na przykład ::nie pasuje fe80::2000:0aff:fea7:0f7c, ale *:*będzie.

Ta różnica nie jest tak naprawdę znacząca dla żadnego urządzenia, które nie wykonuje routingu, ale gdy przychodzi czas na wybranie optymalnych tras do zagregowanych przestrzeni adresowych, zapis symboli wieloznacznych umożliwia bardziej elastyczny wybór sieci docelowych.

Frank Thomas
źródło
5
Ale w odpowiedzi napisałeś, że *:* refers to ANY IPv6 address tutaj mówisz, any..addressnp. IPv4 lub IPv6. Więc co to jest? Czy *:*ogranicza się do IPv6, czy też pozwala na IPv4?
barlop
2
Oba gniazda wymienione w pytaniu są tylko IPv4. Możesz to zobaczyć z lokalnego adresu przypisanego do każdego gniazda. Dlatego wzmianka o IPv6 nie ma znaczenia dla pytania.
kasperd
7
IPv6 w ogóle nie ma związku z tym pytaniem.
hobbs
8
Ta odpowiedź jest całkowicie błędna dla zadanego pytania.
Brad
3
Jak zauważa komentarz kasperda (a także komentarz Hobbsa ), IPv6 nie ma związku z tym pytaniem. Pytanie dotyczy tego, co widzimy w kolumnie Adres obcy, co odpowiada temu, co znajduje się w tym samym wierszu (wierszach) w kolumnie Adres lokalny, którym jest IPv4. (Chociaż w niektórych systemach operacyjnych nasłuchiwanie na jednej rodzinie adresów / wersji IP może zwykle automatycznie nasłuchiwać na innej rodzinie adresów).
TOOGAM
15

/Odnosi się do maski sieci podsieci, która jest częścią warstwy IP.

:Odnosi się do portu, który jest częścią warstwy transportowej.

W przypadku protokołu TCP sensowne jest istnienie zdalnego końca połączenia.

UDP, ponieważ jest bezpołączeniowy, nie ma sensu wyświetlać adresu zagranicznego.

Mam przeczucie, że zawsze wyświetlałby symbol wieloznaczny dla UDP i że może tam być, aby parsowanie danych wyjściowych było nieco bardziej przyjazne lub aby pokazać, jeśli używasz IPv4 / 6:

IPV4 "*:*" vs IPV6 "[::]:*"

Luke Exton
źródło
Właśnie mówiłem to do niektórych przyjaciół. Możesz wyświetlić nasłuchiwane PORTY, ale aby wyświetlić rzeczywiste sesje zdalne, gdy nie ma takiej, prawdopodobnie jest to powód, dla którego wyświetlana jest jak *:*dla zdalnych nieistniejących sesji UDP. Zgadzam się z tobą tutaj.
NotAdmin Dave
6

W obu przypadkach informacje są w zasadzie bez znaczenia, ale wskazują mniej więcej to samo.

Twój pierwszy wiersz to gniazdo nasłuchujące TCP. Kolumna adresu lokalnego wskazuje adres i port, na którym akceptuje połączenia, a kolumna adresu zdalnego nic nie znaczy, ponieważ gniazdo nasłuchiwania nie ma jeszcze zdalnego końca połączenia. Podłączone gniazdo TCP pokaże adres drugim końcu połączenia w tej kolumnie, ale posłuchać gniazdo zdecyduje się wyświetlić wszystkie zera adres i port.

Druga linia to gniazdo UDP. UDP jest protokołem bezpołączeniowym, co oznacza, że ​​wysyła i odbiera pakiety bez względu na to, kto jest z kim połączony, czy pakiet jest częścią istniejącej konwersacji, czy też dane przybyły nieoczekiwanie. Lokalna kolumna adresowa ma takie samo znaczenie, jak ma to miejsce w przypadku TCP, a kolumna adresu zdalnego jest bez znaczenia, ponieważ gniazdo UDP może mieć jednego peera, wiele peerów lub może nie mieć peera w żadnym momencie. (W rzeczywistości POSIX ma pojęcie „podłączonego gniazda UDP”, ale robi się to nieco dalekie).

Teraz pytanie: dlaczego wyświetlają się inaczej? Wydaje się być niczym więcej niż dziwactwem kodu netstat systemu Windows. Linux (net-tools) wyświetla netstat 0.0.0.0:*dla zdalnego końca zarówno gniazd nasłuchujących TCP, jak i gniazd UDP (dla IPv4; wyświetla :::*dla IPv6), co różni się od obu przykładów w systemie Windows, ale przynajmniej jest spójne w tym samym programie. Być może Windows chce semantycznego rozróżnienia między „do wypełnienia później” w przypadku TCP i „otwartym na wszystko” w przypadku UDP, ale równie prawdopodobne jest, że dwa bity kodu zostały napisane przez dwie różne osoby bez szczególna troska o spójność.

Hobbs
źródło
+1 na początek 4. akapitu. 0.0.0.0 ma pewną dokumentację: Adres składający się z samych zer jest adresem „nieokreślonym” (zgodnie z adresowaniem IPv6 RFC 4291, sekcja 2.5.2 ), często odnoszącym się do nieznanych adresów. RFC 1700 strona 4 wspomina „Może być używany tylko jako adres źródłowy”, a RFC 1122 # strona 29 sekcja „a” dalej opisuje użycie. ( moja odpowiedź na temat ::: wspomina 0.0.0.0)
TOOGAM
Czy 0.0.0.0:0wartość w kolumnie Adres obcy nie oznacza, że ​​dowolny adres IP i numer portu może wysyłać dane do tego gniazda? a jeśli ta wartość była na przykład 127.0.0.0:12345, oznacza to, że tylko adres IP 127.0.0.0z numerem portu 12345może wysyłać dane do tego gniazda i nikogo więcej?
Tom
6

Różnica jest po prostu notacyjna.

Netstat w systemie Windows 0.0.0.0:0reprezentuje abstrakcyjne pojęcie „dowolnego zdalnego adresu i portu” dla lokalnego nasłuchiwania TCP IPv4 i *:*nasłuchiwania UDP. W przypadku IPv6 adres zdalny jest oznaczony przez [::]:0dla TCP i *:*UDP.

W OS X *.*jest używany zarówno dla protokołu TCP, jak i UDP, zarówno IPv4, jak i IPv6 (zwróć uwagę, że OS X używa kropek do oddzielenia adresu i portu). Linux używa 0.0.0.0:*IPv4 i :::*IPv6, przy czym pierwsze dwa dwukropki oznaczają skrót dla całego adresu IPv6, a trzeci dwukropek separator między adresem a portem.

IIRC z czegoś, co słyszałem lub czytałem dawno temu, myślę, że pary UDP mogą się pojawiać, ale zwykle nie, ponieważ są zrywane po zakończeniu, a połączenia UDP są zwykle bardzo krótkie, trwają milisekundy lub krócej. Jednak nigdy tego nie widziałem, więc może to być niepoprawne.

NetworkLlama
źródło