Почему все нули в хост-части IP-адреса не могут быть использованы для хоста?


21

Я знаю, что если у меня есть сеть, 83.23.159.0/24то у меня есть 254 используемых IP-адреса хоста, потому что:

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

Я понимаю использование широковещательного адреса, но не понимаю, для чего когда-либо использовался адрес подсети. Я не вижу причин, по которым адрес назначения IP-пакета будет установлен на адрес подсети, так почему же самой подсети нужен адрес, если она никогда не станет конечной точкой для потока IP AN? Мне кажется, что это пустая трата - не разрешать использовать этот адрес в качестве адреса хоста.

Подводя итог, мои вопросы:

  1. Установлен ли в качестве получателя IP-адреса IP-адрес подсети?
  2. Если да, то в каких случаях и почему?
  3. Если нет, то почему бы не освободить этот адрес для использования любым хостом?

2
ifconfigне жалуется, когда вы устанавливаете адрес хоста 24-сети на 0 или 255. Просто попробуйте его использовать.
ot--

2
Я сделал. Кажется, работает на .0. Но это может сломать старое программное обеспечение. .255 также будет работать, если вы не используете протоколы, требующие трансляции. Я думаю, вы можете настроить его, если вы вручную настраиваете таблицы ARP с постоянными адресами на всех компьютерах, но yuk!
Хеннес


1
Я не согласен с этим Джоном. Я перепроверил это, и это не обращается к определенному заданному вопросу. Что, скорее, крайний случай.
Hennes

1
Этот вопрос теперь также задают на новом сайте сетевой инженерии. Эти ответы (по адресу http://networkengineering.stackexchange.com/questions/11200/what-is-the-purpose-of-network-address-aka-subnet-address ) содержат информацию, которой еще нет в сообщениях о сбоях в работе сервера. ,
Hennes

Ответы:


12

Установлен ли в качестве получателя IP-адреса IP-адрес подсети?

Да. Это действительный IP-адрес, поэтому его можно использовать.

Если да, то в каких случаях и почему?

Это просто один из 255 используемых IP-адресов в / 24

Если нет, то почему бы не освободить этот адрес для использования любым хостом?

Если у вас устаревшее оборудование, вам нужно проверить, использует ли оно первый или последний адрес в качестве сетевого адреса. (.0 или .255 для сетей с маской FF.FF.FF.00)

Это делает хорошей привычкой пропускать этот IP. И привычки, усвоенные давно, трудно игнорировать.

И люди, которые не знают фон, не используют его, «потому что другие тоже не используют его, поэтому его использование должно быть неправильным» или потому, что они не понимают, что «0» может быть первым числом.

[Редактировать] Grezzo только что протестировал его в Windows XP, где графический интерфейс Windows Network 'услужливо' предотвратил эту настройку. Windows 7 имеет такое же поведение. Я тогда попробовал это на хосте не-Windows, где это только работает. Если вы используете Windows, вам, возможно, придется настроить сеть вручную через IPconfig, чтобы установить для нее все нули.

192.168.1.0_on_win7 192.168.1.0_on_FreeBSD

[Редактировать 2]

Чем дольше я работаю с этим, тем больше путаюсь.

Rfc4632 - Бесклассовая междоменная маршрутизация , по-видимому, не запрещает это, но и явно не допускает.

В этом посте ServerFault упоминается: «По историческим причинам многие операционные системы рассматривают первый адрес как широковещательный. Например, пинг xxx0 из OS X, Linux и Solaris в моей локальной (/ 24) сети получает ответы. Windows не позволяет вам пинговать первый адрес по умолчанию, но вы можете включить его с помощью метода SetIPUseZeroBroadcast WMI. Интересно, можете ли вы использовать .0 в качестве адреса хоста в сети, работающей под управлением Windows? " ,

Это тот же вопрос, но не ответ.

Сетевой адрес также используется в таблицах маршрутизации. Но я не понимаю, почему это не сработает из-за этого. Те же обозначения в таблицах маршрутизации будут направлены в нужную сеть. Оказавшись в нужной сети, он достигнет ПК с IP 0.

(Все это для 192.168.1 / 24.
Если вы используете 192.168.0 / 23, то 192.168.1.0 будет допустимым и безопасным значением в середине диапазона)

[Редактировать 3]

Еще одна ссылка на тот же вопрос. Похоже, что-то популярное в обмене стека:

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

И одна мысль:

Destination_IP вероятно И эды с сетевой мачтой (быстрая операция в аппаратных средств) перед тем , как по сравнению с записями в таблицах маршрутизации. Но:

(Полуслучайный IP) 192.168.0.42 И 255.255.255.0 дадут 192.168.0.0,
но 192.168.0.0 И 255.255.255.0 также дадут 192.168.0.0


[Изменить 4 - Задолго после того, как этот ответ был написан - возможно, мне придется переписать весь пост из-за этой новой информации ]

RFC923 утверждает на странице 3, что:

  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.

Цитирование @ylearn на нашем сайте сетевой инженерии

Я полагаю, что первая документация этого поступает из RFC950, который ссылается на RFC943 (который устарел RFC923 выше, но использует тот же язык для специальных адресов):

     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.

Итак, чтобы уточнить, вы говорите, что xxx0 / 24 является действительным IP-адресом для хоста? Если это так, то почему (когда я пытаюсь установить свой IP-адрес на 192.168.1.0 с маской сети 255.255.255.0) Windows XP говорит: « Комбинация IP-адреса и маски подсети недопустима. Все биты в Часть адреса узла IP-адреса установлена ​​на 0. Пожалуйста, введите правильную комбинацию IP-адреса и маски подсети. "
Grezzo

3
Windows не так. (Или сказал с меньшей силой: окна слишком осторожны при работе с любой комбинацией систем). Я только что попробовал это на моей системе Windows 7, и я получил ту же ошибку, что и вы. Я установил чистую систему FreeBSD и проверил ее там, где она работает. (Я добавлю это к сообщению)
Hennes

Спасибо, вы были очень полезны. Просто хотел добавить, что графический интерфейс в OS X также не позволит вам сделать это, но я держу пари, что ifconfig сделает это. Я не могу понять, почему ответ m0ntassar набрал больше голосов - он даже не пытается ответить на мой вопрос. Еще кое-что; когда вы говорите: « Если у вас устаревшее оборудование, вам нужно проверить, использует ли оно первый или последний адрес в качестве сетевого адреса». Вы имеете в виду широковещательный адрес .
Греццо

Да, я имел ввиду широковещательный адрес. Блин, где та кнопка "отредактировать комментарий старше 5 минут".
Хеннес

Сладкий, я только что попробовал пропинговать .0 и .255, оба раза мой PS3 отвечал (все остальное беспроводное, поэтому я думаю, именно поэтому он туда попал первым) с .65, так что это подтверждает, что в моей сети оба используются для трансляции, которая почему (обычно) мы не должны использовать ни для реального адреса хоста.
Греццо

15

Адрес с нулевой частью хоста относится к самой сети, а не к какому-либо конкретному хосту.

Исторически этот нулевой адрес хоста служил альтернативным широковещательным адресом, и устройства по-прежнему отвечают таким образом.

Итак, я должен не согласиться с некоторыми другими ответами: нет, ноль - не совсем удобный адрес хоста. Если вам нужно более 254 адресов, вам нужно создать большую подсеть.

Смотри, мой маршрутизатор Linksys, адрес которого .1отвечает на пинги .0. (Маска сети есть 255.255.255.0, поэтому последний октет соответствует номеру хоста.)

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

Если бы я назначил .0адрес некоторому хосту, я не смог бы пропинговать его без того, чтобы маршрутизатор также включал его ответы. И как вы можете видеть, некоторые инструменты , такие как версию этого маршрутизатора в pingлакомстве в 0качестве вещания.

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

Дело в точке.

Я работал в компании, которая проектировала сетевой узел, построенный на 14-слотовом шасси, на котором работали многочисленные независимые образы ОС на нескольких типах карт, и все они общались через объединительную плату. Была создана сетевая настройка через объединительную панель с соглашением, что 127.X.0.Yвнутренний IP-адрес узла Y в слоте X, все пронумерованы от 1.

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

Так как эта сеть использовалась только внутри коробки, и большинство программ, которые требуют обратной связи, используют 127.0.*сеть (и фактически конкретный адрес 127.0.0.1), которая продолжала работать нормально, все было круто.


7

на самом деле это зависит от маски сети, например, для сети 83.23.159.0/23, 83.23.159.0 - это идеально используемый IP-адрес


3
+1 - 83.23.158.255 также будет правильным адресом хоста. Люди зацикливаются на правилах 0 и 255 без учета маски подсети.
Joeqwerty

1
Мне известно, что адрес xxx0 действителен с маской сети менее / 24, но обратите внимание, что в своем вопросе я указал маску сети / 24, поэтому вы не ответили на мой вопрос. Я не говорил о всех 0 или 255 в последнем квартете / байте, я сказал все 0 или 255 в «части хоста» IP-адреса. Это учитывает маску сети.
Греццо

2
Краткий ответ @Grezzo: не-CIDR и устаревшие вещи ломаются с .0, MS просто запрещает это полностью. Но IPv6 неизбежен, так зачем беспокоиться? ;)
Sammitch

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

2
Я не понимаю, почему у этого ответа так много голосов. 83.23.159.0/23 «технически» не является действительной сетью. 83.23.159.0 с маской 23 на самом деле является ip прямо в середине сети 83.23.158.0/23. Вопрос был не в том, «почему я не могу иметь .0 в конце ip», а в том, «почему я не могу использовать адрес с частью узла со всеми нулями». В вашем примере адрес «все нули хоста» будет 83.23.158.0. Как упоминалось в других ответах, это исторически непригодный адрес («сетевой адрес»), и хотя он может работать на некоторых ОС, не рекомендуется его использовать.
USD Matt

3

Похоже, здесь есть небольшая путаница с базовыми сетями.

«Старое оборудование», упомянутое в одном из ответов, не будет использовать ноль IP-подсети - использование ip-адреса xxx0 с сетью, настроенной на / 24 CIDR или маску подсети 255.255.255.0, является совершенно другой проблемой.

IP Подсеть Ноль

  • Старые устройства не будут использовать IP Subnet Zero - это означает, что они не будут использовать первую подсеть в сетевой системе с несколькими подсетями. Таким образом, в сети / 23 или 255.255.254.0 подсеть XXX0 и все ее адреса не будут использоваться. Современные маршрутизаторы не имеют этого ограничения, но могут быть настроены на использование этой старой модели IE, не используя нулевую подсеть, если это необходимо.

Используемые IP-адреса хоста в подсети

  • Основные сети:
    • С / 24 т.е. маска подсети 255.255.255.0
    • ххх0 зарезервирован как сетевой адрес. Маршрутизаторы и протоколы маршрутизации (EIGRP, RIP2 и т. Д.) Используют сетевой адрес для определения сегментов сети для перемещения пакетов внутри и за пределами границ сети.
    • ххх255 зарезервирован для широковещательного адреса
    • Обычной практикой является использование адресов .1 или .254 на маршрутизаторах, чтобы оставить 253 используемых IP-номера.

Сетевой адрес и широковещательный адрес зарезервированы и не могут (по текущим и предыдущим сетевым стандартам) быть назначены устройству. Использование xxx0 для адреса хоста в системе / 24 является неправильным. Даже если Linux позволяет вам использовать его, это не значит, что он прав, это просто означает, что Linux думает, что вы знаете, что делаете.

Если ваша система позволяет вам назначить хосту xxx0 в качестве IP4-адреса, и он, кажется, работает - возможно, конкретный хост получает ВСЕ трафик, предназначенный для ЛЮБОГО устройства в этой сети, поэтому его сеть, вероятно, не работает оптимально.


1
Вы сказали, что « xxx0 зарезервирован как сетевой адрес (воспринимайте его как глобальный адрес или указатель на всю подсеть) », но не объяснили, для чего он фактически используется, и поэтому не объяснили, почему его нельзя использовать для хоста.
Grezzo

2
Обновил мой пост. Суть в том, что назначение сетевого адреса устройству противоречит спецификациям, и, хотя вы можете избежать использования его в небольшой тупиковой сети, вы все равно рискуете получить обновление программного обеспечения (или если вы меняете маршрутизаторы). ) что устройство или вся ваша сеть могут перестать функционировать должным образом.
TheSteven

3

RFC 1122 («Требования к интернет-хостам - коммуникационные уровни») запрещает:

IP-адресам не разрешается иметь значение 0 или -1 для любого из полей <Host-number>, <Network-number> или <Subnet-number>


1
Правда, насколько это возможно. Но если вы действительно перейдете к разделу 3.3.6, как он советует, вы получите полное объяснение.
Майкл Хэмптон

@MichaelHampton Потому что BSD 4.2 использует 0 в качестве трансляции?
Греззо

3
@ Греццо Довольно. Вы застряли с этим, потому что 80-е просто не умрут.
Майкл Хэмптон

0

На самом деле ответ является основой подсетей. IP-адрес "все нули" вашей подсети в сочетании с идентификатором сети используется для расчета того, куда должен быть отправлен пакет.

В вашем примере у вас есть подсеть 255.255.255.0. Любое устройство, которое знает протокол TCP / IP, будет использовать маску сети, объединенную с IP-адресом, чтобы вычислить, предназначен ли пакет для локальной сети (путем выполнения логической операции И) или что он должен быть отправлен через шлюз / маршрутизатор.

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


Вы говорите, что « Любое устройство, которое знает протокол TCP / IP, будет использовать маску сети, объединенную с IP-адресом, чтобы вычислить, предназначен ли пакет для локальной сети (путем выполнения логической операции И) », но ANDing 83.23.159.0 с 255.255 .255.0 и ANDing 83.23.159.1 с 255.255.255.0 дают тот же результат (83.23.159.0), поэтому использование этого вычисления, чтобы выяснить, предназначен ли он для сети или маршрутизатора, все еще работает, даже если у хоста есть адрес .0
Grezzo

0

Мне было предложено опубликовать свой ответ от NetworkEngineering , поэтому я сделаю это с некоторыми изменениями для этого сайта.

В RFC919 он ссылается на общее принятие сетевого адреса:

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"

Это обеспечивает соглашение, которое должно прояснить наше понимание, если кто-то упомянул «10.1.2.0» как сеть, а не как хост в сети.

Оттуда использование «0» в IP-адресах было определено в RFC923 и перенесено в последовательных 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.

В этом примере указан конкретный хост в текущей сети (0.0.0.37) с использованием 0 в сетевых частях адреса, но в действительности он не проясняет противоположный случай (0 в хостовой части адреса). Однако, поскольку это действительно определяет "0" как "это".

В RFC1060 адрес «0.0.0.0» был четко задокументирован как «этот хост в этой сети»:

     (a)   {0, 0}

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

Поскольку все нули для части адреса узла означают «этот узел», из этого логически следует, что он непригоден в качестве адреса узла.

Возвращаясь к непосредственному ответу на ваши вопросы:

  1. Установлен ли в качестве получателя IP-адреса IP-адрес подсети?
  2. Если да, то в каких случаях и почему?
  3. Если нет, то почему бы не освободить этот адрес для использования любым хостом?

Согласно тому, что я нахожу в RFC, это не должно использоваться. Я признаю, что это не так четко определено, как хотелось бы, но это часто встречается во многих стандартах. Когда стандарты немного менее точны, отрасль, похоже, «соглашается» на общепринятую интерпретацию.

Кроме того, на основе содержимого программного обеспечения RFC может быть написано предположение, что этот адрес используется для адресации сети, а не конкретного хоста. Или даже более буквально, как своего рода «петля» (то есть этот хост в указанной сети).

Так почему же некоторые ОС явно разрешают его использование? Я хотел бы представить, как многие вещи, которые сводятся к времени / ресурсам разработчика, или никто действительно не думал, чтобы добавить проверку достоверности. Логика должна быть немного более сложной, чем «если она заканчивается на 0», так как большая подсеть (a / 23 или больше) будет содержать действительный IP-адрес .255 и .0 (т. Е. 10.1.2.0/23 содержит оба действительных IP-адреса адрес 10.1.2.255 и 10.1.3.0). Хотя некоторые организации также избегают использования этих действительных адресов в больших подсетях, чтобы избежать каких-либо странных проблем с программным обеспечением, которое не поддерживает современные подсети правильно.

Что касается того, почему бы не освободить этот один IP-адрес, это просто сводится к стоимости / выгоде. Потребовалось бы много времени и усилий, чтобы внести это изменение, чтобы получить обратно один IP-адрес на подсеть, и в скольких случаях, когда вам нужны дополнительные IP-адреса, будет ли достаточно только одного адреса? Гораздо проще добавить вторую подсеть или увеличить текущую подсеть, потенциально предоставляя вам много адресов для использования вместо одного, при этом не внося существенных изменений в любое программное или аппаратное обеспечение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.