Dlaczego nie można użyć wszystkich zer w części adresu IP hosta dla hosta?

21

Wiem, że jeśli mam sieć, 83.23.159.0/24to mam 254 użytecznych adresów IP hosta, ponieważ:

83.23.159.0      (in binary: host portion all zeros) is the subnet address
83.23.159.1-254  are host addresses
83.23.159.255    (in binary: host portion all ones) is the broadcast address

Rozumiem użycie adresu rozgłoszeniowego, ale nie rozumiem, do czego kiedykolwiek używany jest adres podsieci. Nie widzę powodu, dla którego adres docelowy pakietu IP miałby być ustawiony na adres podsieci, więc dlaczego sama podsieć potrzebuje adresu, jeśli nigdy nie będzie punktem końcowym przepływu AN? Według mnie marnotrawstwem jest niedopuszczenie do używania tego adresu jako adresu hosta.

Podsumowując, moje pytania to:

  1. Czy miejscem docelowym pakietu IP jest kiedykolwiek adres IP podsieci?
  2. Jeśli tak, w jakich przypadkach i dlaczego?
  3. Jeśli nie, to dlaczego nie zwolnić tego adresu dla dowolnego hosta?
Grezzo
źródło
2
ifconfignie narzeka, gdy ustawisz adres hosta 24-net na 0 lub 255. Po prostu spróbuj go użyć.
ott--
2
Zrobiłem. Wygląda na to, że działa na 0,0. Ale może to uszkodzić starsze oprogramowanie. .255 będzie również działać, jeśli nie używasz żadnych protokołów wymagających emisji. Myślę, że możesz to ustawić, jeśli ręcznie skonfigurujesz tabele ARP ze stałymi adresami na wszystkich komputerach, ale fuj!
Hennes,
możliwy duplikat Jak działa podsieć IPv4?
John Gardeniers,
1
Nie zgadzam się z tym Johnem. Sprawdziłem to ponownie i nie odnosi się do konkretnego zadanego pytania. Co jest raczej przypadkiem na krawędzi.
Hennes
1
To pytanie jest teraz zadawane także w nowej witrynie sieci inżynieryjnej. Odpowiedzi te (na http://networkengineering.stackexchange.com/questions/11200/what-is-the-purpose-of-network-address-aka-subnet-address ) zawierają informacje, których nie ma jeszcze w postach dotyczących błędów serwera .
Hennes

Odpowiedzi:

12

Czy miejscem docelowym pakietu IP jest kiedykolwiek adres IP podsieci?

Tak. Jest to prawidłowy adres IP, więc można go użyć.

Jeśli tak, w jakich przypadkach i dlaczego?

Jest to po prostu jeden z 255 użytecznych adresów IP w / 24

Jeśli nie, to dlaczego nie zwolnić tego adresu dla dowolnego hosta?

Jeśli masz starożytny sprzęt, musisz sprawdzić, czy używa pierwszego czy ostatniego adresu jako adresu sieciowego. (.0 lub .255 dla sieci z maską FF.FF.FF.00)

To sprawia, że ​​dobrym nawykiem jest pomijanie tego adresu IP. A nawyki nabyte dawno temu trudno zignorować.

A ludzie, którzy nie znają tła, nie używają go „, ponieważ inni też go nie używają, więc korzystanie z niego musi być błędne” lub ponieważ nie zdają sobie sprawy, że „0” może być pierwszą liczbą.

[Edytuj] Grezzo właśnie przetestował to na Windows XP, w którym GUI sieci Windows „pomocnie” zapobiegał temu ustawieniu. Windows 7 ma takie samo zachowanie. Następnie wypróbowałem to na hoście innym niż Windows, gdzie to po prostu działa. Jeśli używasz systemu Windows, być może będziesz musiał ręcznie skonfigurować sieć za pomocą IPconfig, aby ustawić ją na wszystkie zera.

192.168.1.0_on_win7 192.168.1.0_on_FreeBSD

[Edytuj 2]

Im dłużej z tym pracuję, tym bardziej się mylę.

Rfc4632 - Bezklasowy routing między domenami nie wydaje się go zabraniać, ale nie pozwala na to wprost.

Ten post ServerFault wspomina: „Z przyczyn historycznych wiele systemów operacyjnych traktuje pierwszy adres jako transmisję. Na przykład pingowanie xxx0 z OS X, Linux i Solaris w mojej sieci lokalnej (/ 24) otrzymuje odpowiedzi. Windows nie pozwala ci pingować pierwszy adres domyślnie, ale możesz go włączyć za pomocą metody WIP SetIPUseZeroBroadcast. Zastanawiam się, czy nie możesz użyć .0 jako adresu hosta w sieci z wszystkimi systemami Windows. ” .

To to samo pytanie, ale nie odpowiedź.

Adres sieciowy jest również używany w tablicach routingu. Ale nie rozumiem, dlaczego to nie zadziała z tego powodu. Ta sama notacja w tablicach routingu prowadziłaby do właściwej sieci. Gdy znajdzie się w odpowiedniej sieci, dotrze do komputera z IP 0.

(Wszystko to dla 192.168.1 / 24.
Jeśli użyjesz 192.168.0 / 23, wówczas 192.168.1.0 będzie prawidłową i bezpieczną wartością w środku zakresu)

[Edytuj 3]

Jeszcze jeden link do tego samego pytania. Wydaje się to dość popularne na wymianie stosu:

/superuser/379451/why-can-a-network-address-not-be-a-valid-host-address

I jedna myśl:

Docelowy_IP jest prawdopodobnie AND z masztem sieciowym (szybka operacja sprzętowa), zanim zostanie porównany z wpisami w tablicach routingu. Ale:

(Pół-losowy adres IP) 192.168.0.42 I 255.255.255.0 da 192.168.0.0
Ale 192.168.0.0 I 255.255.255.0 również da 192.168.0.0


[Edytuj 4 - Długo po napisaniu tej odpowiedzi - może być konieczne przepisanie całego postu z powodu tych nowych informacji ]

RFC923 stwierdza na stronie 3, że:

  In certain contexts, it is useful to have fixed addresses with
  functional significance rather than as identifiers of specific
  hosts.  When such usage is called for, the address zero is to be
  interpreted as meaning "this", as in "this network".  The address
  of all ones are to be interpreted as meaning "all", as in "all
  hosts".  For example, the address 128.9.255.255 could be
  interpreted as meaning all hosts on the network 128.9.  Or, the
  address 0.0.0.37 could be interpreted as meaning host 37 on this
  network.

Cytując @ylearn na naszej stronie poświęconej inżynierii sieci

Wydaje mi się, że pierwsza dokumentacja tego pochodzi z RFC950, który odwołuje się do RFC943 (który zastąpił RFC923 powyżej, ale używa tego samego języka dla specjalnych adresów):

     It is useful to preserve and extend the interpretation of these
     special addresses in subnetted networks.  This means the values
     of all zeros and all ones in the subnet field should not be
     assigned to actual (physical) subnets.
Hennes
źródło
Aby wyjaśnić, czy mówisz, że xxx0 / 24 to prawidłowy adres IP hosta? Jeśli tak, to dlaczego (kiedy próbuję ustawić mój adres IP na 192.168.1.0 z maską sieci 255.255.255.0) system Windows XP mówi „ Kombinacja adresu IP i maski podsieci jest nieprawidłowa. Wszystkie bity w część adresu IP adresu IP hosta jest ustawiona na 0. Wprowadź poprawną kombinację adresu IP i maski podsieci.
Grezzo
3
Windows jest zły. (Lub powiedziano z mniejszą siłą: Windows zbyt ostrożnie pracuje z dowolną kombinacją systemów). Właśnie próbowałem tego na moim systemie Windows 7 i dostałem ten sam błąd co ty. Zainstalowałem czysty system FreeBSD i przetestowałem go tam, gdzie działa. (Dodam to do postu)
Hennes,
Dzięki, byłeś naprawdę pomocny. Chciałem tylko dodać, że GUI w OS X też nie pozwala na to, ale założę się, że ifconfig by to zrobił. Nie rozumiem, dlaczego odpowiedź m0ntassar ma więcej głosów - nawet nie próbuje odpowiedzieć na moje pytanie. Jeszcze jedna rzecz; kiedy mówisz „ Jeśli masz starożytny sprzęt, musisz sprawdzić, czy używa on pierwszego czy ostatniego adresu jako adresu sieciowego. masz na myśli adres rozgłoszeniowy .
Grezzo
Tak, miałem na myśli adres rozgłoszeniowy. Cholera, gdzie jest ten przycisk „edytuj komentarz starszy niż 5 minut”.
Hennes,
Sweet, właśnie próbowałem pingować .0 i .255, za każdym razem, gdy mój PS3 odpowiedział (wszystko inne jest bezprzewodowe, więc myślę, że właśnie dlatego się tam dostał) z .65, co potwierdza, że ​​w mojej sieci oba są używane do transmisji, która jest dlaczego (normalnie) nie powinniśmy używać żadnego z prawdziwych adresów hostów.
Grezzo
15

Adres z zerową częścią hosta odnosi się do samej sieci, a nie do konkretnego hosta.

Historycznie ten zerowy adres hosta służył jako alternatywny adres rozgłoszeniowy, a urządzenia nadal tak reagują.

Więc muszę się nie zgodzić z kilkoma innymi odpowiedziami: nie, zero nie jest idealnie użytecznym adresem hosta. Jeśli potrzebujesz więcej niż 254 adresów, musisz utworzyć większą podsieć.

Spójrz, mój router Linksys, którego adres .1odpowiada na pingi .0. (Maska sieci jest 255.255.255.0, więc ostatni oktet odpowiada numerowi hosta).

webserver:~# ping  192.168.1.0
Do you want to ping broadcast? Then -b
webserver:~# ping -b 192.168.1.0
WARNING: pinging broadcast address
PING 192.168.1.0 (192.168.1.0) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.46 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.812 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.819 ms

Gdybym przypisał .0adres do jakiegoś hosta, nie byłbym w stanie pingować go bez routera, który odpowiedziałby również jego odpowiedziami. Jak widać, niektóre narzędzia, takie jak wersja routera, pingtraktują 0jak transmisję.

Możesz nagiąć reguły, jeśli chcesz załatać wszystkie stosy protokołów i inne oprogramowanie, na które ma wpływ takie gięcie. W przeciwnym razie trzymaj się zasad.

Przykładem.

Pracowałem w firmie, która zaprojektowała węzeł sieci zbudowany w 14-gniazdowej obudowie, obsługujący wiele niezależnych obrazów systemu operacyjnego na kilku typach kart, wszystkie komunikujące się za pośrednictwem płyty montażowej. Nastąpiła konfiguracja sieci na płycie montażowej z konwencją, która 127.X.0.Yjest wewnętrznym adresem IP węzła Y w gnieździe X, wszystkie ponumerowane od 1.

Zasadniczo podsieci adres pętli zwrotnej dla naszych własnych celów. Aby działało, musieliśmy załatać jądro Linuksa tu i tam i IIRC, trochę przestrzeni użytkownika.

Ponieważ ta sieć była używana tylko wewnątrz urządzenia, a większość programów wymagających pętli zwrotnej korzysta z 127.0.*sieci (a właściwie z określonego adresu 127.0.0.1), która nadal działała normalnie, wszystko było fajne.

Kaz
źródło
7

w rzeczywistości zależy to od maski sieci, na przykład dla sieci 83.23.159.0/23, 83.23.159.0 to doskonale użyteczny adres IP

m0ntassar
źródło
3
+1 - 83.23.158.255 również byłby prawidłowym adresem hosta. Ludzie rozłączają się na zasadzie 0 i 255 bez rozważania maski podsieci.
joeqwerty
1
Wiem, że adres xxx0 jest poprawny z maską sieci mniejszą niż / 24, ale zauważ, że w moim pytaniu podałem maskę / 24, więc nie odpowiedziałeś na moje pytanie. Nie mówiłem o wszystkich 0 lub 255 w ostatnim kwartecie / bajcie, powiedziałem, że wszystkie 0 lub 255 w „części hosta” adresu IP. Uwzględnia to maskę sieci.
Grezzo
2
@Grezzo krótka odpowiedź: non-CIDR i starsze rzeczy psują się z .0, MS po prostu całkowicie to odrzuca. Ale IPv6 jest nieuchronne, więc po co się martwić? ;)
Sammitch,
2
To nie jest tak naprawdę odpowiedź, ponieważ pytanie tak naprawdę nie dotyczy numerycznej notacji kropkowej, ale statusu / znaczenia adresu hosta 0 w dowolnej podsieci o szerokości.
Kaz
2
Nie rozumiem, dlaczego ta odpowiedź ma tyle głosów. 83.23.159.0/23 nie jest „technicznie” prawidłową siecią. 83.23.159.0 z maską 23 to tak naprawdę ip w środku sieci 83.23.158.0/23. Pytanie nie brzmiało: „dlaczego nie mogę mieć .0 na końcu adresu IP”, ale „dlaczego nie mogę użyć adresu z częścią zerową zawierającą wszystkie zera”. W twoim przykładzie adres „wszystkie zera hosta” to 83.23.158.0. Jak wspomniano w innych odpowiedziach, historycznie jest to adres bezużyteczny („adres sieciowy”) i chociaż może on działać w niektórych systemach operacyjnych, nie zaleca się jego używania.
USD Matt
3

Wygląda na to, że tutaj jest trochę pomieszania z podstawowymi sieciami.

„Starożytny sprzęt”, o którym mowa w jednej z odpowiedzi, nie używałby IP Subnet Zero - używanie adresu IP xxx0 z siecią skonfigurowaną dla / 24 CIDR lub 255.255.255.0 to zupełnie inna sprawa.

Zero podsieci IP

  • Starszy sprzęt nie używałby IP Subnet Zero - co oznacza, że ​​nie używałby pierwszej podsieci w systemie sieci z wieloma podsieciami. Tak więc w sieci / 23 lub 255.255.254.0 podsieć XXX0 i wszystkie jej adresy nie byłyby używane. Nowoczesne routery nie mają tego ograniczenia, ale można je skonfigurować tak, aby korzystały ze starego modelu IE i nie używały podsieci zero, jeśli jest to pożądane.

Użyteczne adresy IP hosta w podsieci

  • Podstawowa sieć:
    • Z / 24 tj. Maska podsieci 255.255.255.0
    • xxx0 jest zarezerwowany jako adres sieciowy. Routery i protokoły routingu (EIGRP, RIP2 itp.) Używają adresu sieciowego do definiowania segmentów sieci do przenoszenia pakietów w obrębie sieci i poza jej granicami.
    • xxx255 jest zarezerwowane dla adresu emisji
    • Powszechną praktyką jest używanie adresów .1 lub .254 na routerach, aby pozostawić 253 użytecznych numerów IP.

Zarówno adres sieciowy, jak i adres rozgłoszeniowy są zastrzeżone i nie mogą (zgodnie z obecnymi i poprzednimi standardami sieciowymi) być przypisane do urządzenia. Użycie xxx0 jako adresu hosta w systemie / 24 jest nieprawidłowe. Nawet jeśli Linux pozwala ci go używać, nie oznacza to, że ma rację, to po prostu oznacza, że ​​Linux myśli, że wiesz, co robisz.

Jeśli twój system pozwala przypisać hostowi xxx0 jako adres IP4 i wydaje się, że działa - istnieje prawdopodobieństwo, że dany host odbiera CAŁY ruch skierowany na DOWOLNE urządzenie w tej sieci, więc jego sieć prawdopodobnie nie działa optymalnie.

TheSteven
źródło
1
Powiedziałeś „ xxx0 jest zarezerwowany jako adres sieciowy (traktuj go jako adres globalny lub wskaźnik do całej podsieci) ”, ale nie wyjaśniłeś, do czego jest on faktycznie używany, a zatem nie wyjaśniłeś, dlaczego nie można go użyć dla hosta
Grezzo
2
Zaktualizowałem mój post. Najważniejsze jest to, że przypisywanie adresu sieciowego do urządzenia jest niezgodne ze specyfikacjami i chociaż możesz uciec od używania go w małej sieci pośredniczącej, nadal ryzykujesz, że jeśli router otrzyma aktualizację oprogramowania (lub zmienisz routery) ), że urządzenie lub cała sieć może przestać działać poprawnie.
TheSteven,
3

RFC 1122 („Wymagania dotyczące hostów internetowych - warstwy komunikacyjne”) zabrania:

Adresy IP nie mogą mieć wartości 0 lub -1 dla żadnego z pól <Numer hosta>, <Numer sieci> lub <Numer podsieci>

Bryan
źródło
1
Prawda, o ile to możliwe. Ale jeśli faktycznie przejdziesz do sekcji 3.3.6 zgodnie z zaleceniami, otrzymasz pełne wyjaśnienie.
Michael Hampton
@MichaelHampton Ponieważ BSD 4.2 używa 0 jako transmisji?
Grezzo,
3
@Grezzo Dość. Utkniesz z tym, ponieważ lata 80-te po prostu nie umrą.
Michael Hampton
0

Właściwie odpowiedź jest podstawową podsieci. Adres IP „wszystkich zer” podsieci w połączeniu z identyfikatorem sieci służy do obliczenia, do którego pakietu należy wysłać.

W twoim przykładzie masz podsieć 255.255.255.0. Każde urządzenie, które zna protokół TCP / IP, użyje maski sieci w połączeniu z adresem IP, aby obliczyć, czy pakiet jest przeznaczony dla sieci lokalnej (wykonując logiczną operację AND), czy też musi zostać wysłany przez bramę / router.

Sądzę więc, że powodem, dla którego nie można użyć adresu IP, jest to, że jest już używany do „definiowania” granic sieci wraz z maską sieciową według projektu.

Goez
źródło
Mówisz, że „ Każde urządzenie, które zna protokół TCP / IP, użyje maski sieci w połączeniu z adresem IP, aby obliczyć, czy pakiet jest przeznaczony dla sieci lokalnej (wykonując logiczną operację AND) ”, ale ANDing 83.23.159.0 z 255.255 .255.0 i ANDing 83.23.159.1 z 255.255.255.0 dają ten sam wynik (83.23.159.0), więc używając tego obliczenia, aby dowiedzieć się, czy jest on przeznaczony dla sieci lub routera, nadal działa, nawet jeśli host ma adres .0
Grezzo
0

Poprosiłem o ponowne przesłanie mojej odpowiedzi od NetworkEngineering , więc zrobię to z pewnymi modyfikacjami dla tej strony.

W RFC919 zawiera odniesienie do ogólnej akceptacji adresu sieciowego:

However, as a notational convention, we refer to
networks (as opposed to hosts) by using addresses with zero fields.
For example, 36.0.0.0 means "network number 36"

Zapewnia to konwencję, która powinna wyjaśnić nasze rozumienie, gdyby ktoś wymienił „10.1.2.0” jako sieć, a nie host w sieci.

Odtąd użycie „0” w adresach IP zostało zdefiniowane w RFC923 i przeniesione w kolejnych RFC:

Special Addresses:

  In certain contexts, it is useful to have fixed addresses with
  functional significance rather than as identifiers of specific
  hosts.  When such usage is called for, the address zero is to be
  interpreted as meaning "this", as in "this network".  The address
  of all ones are to be interpreted as meaning "all", as in "all
  hosts".  For example, the address 128.9.255.255 could be
  interpreted as meaning all hosts on the network 128.9.  Or, the
  address 0.0.0.37 could be interpreted as meaning host 37 on this
  network.

W tym przykładzie podano konkretnego hosta w bieżącej sieci (0.0.0.37), używając zer w części sieci adresu, ale tak naprawdę nie wyjaśnia przeciwnego przypadku (0 w części hosta adresu). Jednak ponieważ zdefiniował „0” jako „to”.

W RFC1060 adres „0.0.0.0” został wyraźnie udokumentowany jako „ten host w tej sieci”:

     (a)   {0, 0}

        This host on this network.  Can only be used as a source
        address (see note later).

Ponieważ wszystkie zera części hosta adresu oznaczały „ten host”, logicznie wynika z tego, że nie można go użyć jako adresu hosta.

Wracając do bezpośredniej odpowiedzi na pytania:

  1. Czy miejscem docelowym pakietu IP jest kiedykolwiek adres IP podsieci?
  2. Jeśli tak, w jakich przypadkach i dlaczego?
  3. Jeśli nie, to dlaczego nie zwolnić tego adresu dla dowolnego hosta?

Zgodnie z tym, co znajduję w RFC, nie należy tego używać. Przyznaję, że nie jest tak jasno określony, jak bym chciał, ale to wszystko jest wspólne w wielu standardach. Kiedy standardy są w pewnym momencie mniej rygorystyczne, wydaje się, że branża „ustala się” w ogólnie przyjętej interpretacji.

Ponadto na podstawie zawartości oprogramowania RFC można napisać, aby założyć, że ten adres służy do adresowania sieci, a nie konkretnego hosta. Lub nawet bardziej dosłownie jako swego rodzaju „sprzężenie zwrotne” (tzn. Ten host w określonej sieci).

Dlaczego więc niektóre systemy operacyjne wyraźnie na to zezwalają? Wyobrażam sobie wiele rzeczy związanych z czasem / zasobami programisty lub nikt tak naprawdę nie pomyślał o dodaniu kontroli poprawności. Logika musi być nieco bardziej zaangażowana niż „jeśli kończy się na 0”, ponieważ większa podsieć (a / 23 lub większa) będzie zawierać prawidłowy adres IP .255 i .0 (tj. 10.1.2.0/23 zawiera oba poprawne adresy IP adres 10.1.2.255 i 10.1.3.0). Chociaż niektóre organizacje unikają również używania poprawnych adresów w większych podsieciach, aby uniknąć dziwnych problemów z oprogramowaniem, które nie obsługuje poprawnie nowoczesnej podsieci.

Co do tego, dlaczego nie zwolnić tego jednego adresu IP, po prostu sprowadza się do kosztów / korzyści. Wprowadzenie tej zmiany zajęłoby dużo czasu i wysiłku, aby odzyskać jeden adres IP na podsieć. W ilu przypadkach, gdy potrzebujesz dodatkowych adresów IP, wystarczy tylko jeden adres? O wiele łatwiej jest dodać drugą podsieć lub powiększyć bieżącą podsieć, potencjalnie dając wiele adresów do użycia zamiast tylko jednej, nie wprowadzając przy tym większych zmian w oprogramowaniu / sprzęcie.

YLearn
źródło